dbt

dbt トラブルシューティング: よくあるエラーと対処

2026-04-19
NicheeLab編集部

dbtはSQL変換、Jinja、アダプター経由の接続、選択ルール、テストといった複数レイヤーが絡みます。エラーは層ごとに性質が異なり、正しく切り分けないと時間を失いがちです。

この記事では、現場で多い失敗パターンを層ごとに整理し、再現性のある確認手順と安定解を提示します。Analytics Engineer試験で問われるコマンド差分やインクリメンタルの要件にも触れます。

プロファイル・接続エラーの切り分け

最初に確認すべきはprofiles.ymlとアダプターの整合です。dbt_project.ymlのprofile名、profiles.ymlのターゲット、認証方式、そしてアダプタープラグインの導入状況をdbt debugで検証します。

ネットワークや権限に起因するエラーはdb接続レイヤーの典型です。認証エラー、スキーマ未作成、ロール不足など、エラーメッセージの語彙で大枠を特定し、最小構成での接続テストへ切り戻します。

  • Runtime Error: Could not find profile named 'xxx' → dbt_project.ymlのprofile名と~/.dbt/profiles.ymlのキー名不一致
  • Database Error: Authentication failed / invalid credentials → 認証情報の環境変数やキーファイル参照を再確認
  • Adapter Error: Missing required dependency → アダプター未導入。例: pip install dbt-bigquery / dbt-snowflake
  • Database Error: schema does not exist → 事前にスキーマ作成権限が必要、あるいはdbtでon-run-startにCREATE SCHEMAを付与
コマンド/ファイル目的
dbt debugアダプター、認証、プロファイルの健全性チェック
dbt --versionアダプターとdbt-coreの互換性・インストール確認
profiles.yml接続先、資格情報、ターゲット(target)の定義
dbt_project.ymlprofileキーの一致、モデルのデフォルト設定確認

接続トラブルの初動フロー

noyesyesnodbt run 失敗dbt debug OK?アダプター導入確認pip install dbt-xxx認証/権限エラー?資格情報/ロール/スキーマ確認SQL/モデル層へ切り分け継続接続トラブルの初動フロー

最低限のprofiles.yml例(Snowflakeの例。環境変数併用)

snowflake_profile:
  target: dev
  outputs:
    dev:
      type: snowflake
      account: "{{ env_var('SNOWFLAKE_ACCOUNT') }}"
      user: "{{ env_var('SNOWFLAKE_USER') }}"
      password: "{{ env_var('SNOWFLAKE_PASSWORD') }}"
      role: ANALYST
      database: ANALYTICS
      warehouse: TRANSFORMING
      schema: DEV
      threads: 8
      client_session_keep_alive: true

選択ルールとコマンド差分で起こる失敗

dbtのノード選択はref()依存やタグ、パスが絡みます。No nodes selectedはセレクタが空集合になったサインです。dbt lsで対象を先に可視化してから本番コマンドを流すと事故が減ります。

runとbuildの違いは試験でも頻出です。buildはmodels, tests, snapshots, seeds, exposuresを依存順に包括実行します。CIではbuildが既定路線ですが、意図せぬseed上書きやtest失敗による停止を理解しておく必要があります。

  • No nodes selected → セレクタ再確認: dbt ls -s <selector>
  • Found duplicate model name → パッケージ衝突。models: +schema/+alias で解消、またはpackage名をprefix化
  • State-based選択で対象0件 → dbt run -s state:modified --state path/to/artifacts を使う際のstate参照先誤り
コマンド対象ノード代表的なオプション失敗の主因
dbt runmodelsのみ-s/--select, -m(同義), --deferNo nodes selected, 依存欠如, コンパイル失敗
dbt buildmodels + tests + snapshots + seeds--fail-fast, --select, --excludeテスト失敗で停止、seed上書き、順序依存のエラー
dbt testgeneric/singular tests--select, --store-failuresNULL/重複検出などの品質エラー
dbt seedCSV→テーブル--full-refresh, --showカラム型不一致、引用符設定、上書き注意
dbt source freshnesssources--select, --output json最大遅延超過、メタデータ権限不足

対象可視化と安全な選択の例

# まずは対象を確認
/dbt ls -s tag:daily +
# 変更分のみ(state:modified)
/dbt ls -s state:modified --state ./target

# 本実行(依存先も含める)
/dbt build -s tag:daily+ --fail-fast

# パッケージ衝突回避のエイリアス(dbt_project.ymlの例)
models:
  my_pkg:
    +alias: pkg__{{ model.name }}

インクリメンタルモデルの失敗と安全な再実行

インクリメンタルは一見便利ですが、unique_keyやis_incremental()の条件式が曖昧だと取り込み漏れや重複を生みます。merge戦略ではunique_keyがほぼ必須です。フルリフレッシュが混在するCI/本番でも壊れない条件式が鍵です。

スキーマ変更はon_schema_changeの設定と、アダプターが対応しているかで挙動が変わります。未対応の組み合わせではDatabase Errorが出るため、同期ポリシーを明示し、必要に応じて--full-refreshで初期化します。

  • unique_key未設定のmerge → 実行時エラー、または重複行
  • is_incremental()の境界日時が非決定的 → 再実行で抜け/重複
  • on_schema_change未対応/不一致 → ALTER/REPLACEの失敗
  • パーティション列未指定(対応DWH) → スキャン過多・コスト増
症状典型原因/対処
Database Error: MERGE requires a unique matchconfig(unique_key=...)を設定。ユニーク性を保証するキーを再設計
取り込み漏れが断続的に発生is_incremental()のWHEREがゆるい。境界を>=最終タイムスタンプ+1単位に見直し
列追加後に失敗on_schema_changeの同期方針をsync_all_columns等に設定。未対応なら--full-refresh
実行は成功するが重複増加unique_keyが複合必要。coalesce/正規化で一意性を担保

堅牢なインクリメンタルモデル例

{{ config(
    materialized='incremental',
    unique_key='id',
    on_schema_change='sync_all_columns'
) }}

with src as (
  select * from {{ ref('stg_events') }}
)

select
  id,
  event_ts,
  payload
from src
{% if is_incremental() %}
where event_ts > (
  select coalesce(max(event_ts), '1970-01-01') from {{ this }}
)
{% endif %}

権限・スキーマ・クオート設定の罠

作成先スキーマが存在しない、あるいは作成権限がない場合、モデル作成前に失敗します。運用ではデプロイ用ロールにCREATE/USAGE権限を明確に付与し、初回のみon-run-startでCREATE SCHEMAを自動化する方法もあります。

識別子の大文字小文字や予約語はアダプターごとに扱いが異なります。dbtのquoting設定でidentifier/schemaの引用有無を統一し、aliasで明示的に名前を固定するのが安全です。

  • schema does not exist → 事前にスキーマを作るか、初回run-operationで作成
  • permission denied → 参照と作成系権限を分けて付与。最低限USAGE/CREATE/SELECT/INSERT/UPDATE/DELETE
  • 大文字小文字ゆらぎ → quoting.identifierをtrueにして安定化、aliasで固定
権限説明
USAGE (DB/SCHEMA)オブジェクト参照に必要。これが無いと存在確認も不可
CREATE (SCHEMA/TABLE/VIEW)生成時に必須。マテリアライズで失敗しやすい
SELECT/INSERT/UPDATE/DELETEモデルの読み書きで必要。incrementalは更新系も利用

クオートとスキーマの安定化(profiles.yml / モデル設定)

# profiles.ymlの例(識別子を常に引用)
quoting:
  database: false
  schema: true
  identifier: true

# モデル側でのエイリアス固定(models/*.sqlの先頭)
{{ config(alias='fact_events', schema='prod') }}

Jinja/マクロ/パッケージ起因の失敗

Compilation ErrorはJinja解釈段階の失敗です。未定義の変数やマクロ、型不整合が原因のことが多く、dbt parseで早期に発見できます。varsはデフォルトを与えて堅牢化します。

パッケージ由来のマクロ未検出はdbt deps未実行やバージョン不整合が典型です。packages.ymlのピン留め、名称衝突時のdispatchルールを見直します。

  • Compilation Error: 'my_var' is undefined → var('my_var', 'default') を使う
  • Macro not found → packages.ymlを確認しdbt depsを実行
  • adapter.dispatchの解決失敗 → マクロ命名とpackage_namespaceの整合を確認
エラー文修正の方向性
'var_x' is undefinedvarsに定義 or var('var_x', default)に置換
Macro 'pkg.my_macro' not foundpackages.ymlにpkgを追加しdbt deps。バージョンを固定
Could not render {{ ref('x') }}参照先のリソース名/パス/パッケージ前置きを修正

varsのデフォルト/パッケージ管理の例

# モデル内での安全なvars参照
select * from {{ ref('stg_users') }} where country = '{{ var('country', 'JP') }}'

# packages.yml(一例)
packages:
  - package: dbt-labs/dbt_utils
    version: ">=1.0.0,<2.0.0"

# 検証
/dbt deps
/dbt parse

テスト・ソース鮮度・運用時の失敗対応

テスト失敗は品質の仕様通りに検知しているかをまず確認します。NULLや重複が許容される期間・例外の取り扱いをモデル側で吸収するか、test側で条件を与えるかを決めます。

source freshnessは最大遅延を超えると失敗します。スケジューラと取り込みサイクルの整合を取り、運用ではJSON出力を監視に流すと効果的です。

  • dbt test --store-failuresで不合格行を特定
  • dbt source freshness --output jsonを監視に連携
  • seedは型とクオート設定で差分が出やすい。--full-refreshで整合させる
失敗シナリオ切り分けの観点
unique/accepted_valuesテスト失敗モデル計算とビジネス仕様の差分。WHERE条件付テストに見直し
freshness遅延超過取り込み基盤の遅延 or ラグ閾値の設定ミス
seed差分でCI失敗CSV更新の認識漏れ。型・NULL表現・引用の差異を統一

テスト/鮮度/CIの実用スニペット

# tests/schema.yml(一例)
models:
  - name: dim_users
    tests:
      - unique:
          column_name: user_id
      - not_null:
          column_name: user_id

sources:
  - name: app
    tables:
      - name: events
        freshness:
          warn_after: {count: 12, period: hour}
          error_after: {count: 24, period: hour}
          loaded_at_field: event_ts

# CIではbuildで包括実行
git diff --name-only | xargs -I{} echo {}
/dbt build --select state:modified+ --state ./target --fail-fast --warn-error
/dbt source freshness --select source:app.events --output json

問題で確認

Analytics Engineer

問題 1

incrementalモデルがmerge戦略で実行されており、dbt run時に重複行が増えている。安定した再実行を保証する最適な修正はどれか?

  1. configでunique_keyを設定し、is_incremental()のWHEREを最終取り込み時刻より大きい境界で厳密化する
  2. dbt testをOFFにしてから再実行する
  3. dbt seedを先に実行してからrunする
  4. threadsを増やし同時実行数を上げる

正解: A

merge戦略では一意に突き合わせるキーが必要で、unique_key未設定や曖昧な時間境界は重複の原因です。unique_keyを明示し、is_incremental()の条件を再実行でも決定的になるよう修正するのが正解。テスト有無や並列数は根本解決になりません。

よくある質問

dbt runが失敗したSQLを特定する最短手順は?

まずdbt build/runを--fail-fastで実行し、target/run/<package>/<model>.sqlの生成物を開いてDWH上で単体実行します。併せてdbt debugで接続問題を切り分けます。

No nodes selectedの再発を防ぐには?

本実行前にdbt ls -s <selector>で対象を確認する運用にします。タグ/パス/stateの複合指定では+(依存)やexcludeを明示し、セレクタをリポジトリ内で共通化します。

スキーマ作成権限が無い環境での初回デプロイは?

事前に管理者がスキーマを作成し、実行ロールにUSAGE/CREATE(テーブル/ビュー)/DML権限を付与します。もしくは初回のみ管理者ロールでon-run-startにCREATE SCHEMAを仕込み、以後は通常ロールで運用します。

この記事で学んだ内容を問題で確認しましょう

16,000問以上の問題で実力チェック

無料で問題を解いてみる
この記事の著者

NicheeLab編集部

データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。


関連記事
dbt

dbt Model の基礎: SQL で定義する変換の最小単位

Analytics Engineer 向けに、dbt Model の定義、マテリアライゼーション、依存関係、インクリメン...

dbt

dbt Analytics Engineer 試験ガイド: 出題範囲・配点・申込の実務視点

dbt Analytics Engineer 認定の出題範囲、配点の考え方、申込から受験までの流れを、公式ドキュメントの...

dbt

dbt Cloud と dbt Core の違いと選び方:Analytics Engineer 試験に効く要点

dbt Cloud と dbt Core の機能差を、実務と資格対策の両面から整理。スケジューリング、IDE、RBAC、...

dbt

dbt プロジェクト構造ガイド: models / seeds / macros の実務レイアウト

Analytics Engineer 向けに、dbt プロジェクトのディレクトリ構造と命名規約、dbt_project....

dbt

dbt_project.yml の読み方:主要設定と命名を最短で掴む

dbt_project.yml の必須キー、命名解決(database.schema.identifier)、設定優先度...

dbtの記事一覧 (101件)
© 2026 NicheeLab All rights reserved.