Dropbox が「Syncing…」で永遠に止まる問題を解決した

macOS で Dropbox がずっと「Syncing…」のまま完了しない。アプリ再起動しても、Mac 再起動しても、Finder 再起動しても直らない。数ヶ月この状態だった。

で、結局 FileProvider の内部データベースを直接調べたら原因が分かって、ファイル1つ消したら直った。という話。

結論

macOS の FileProvider フレームワークが管理している SQLite データベース(reconciliation_table)に、is_pending = 1 のまま永遠に処理されないアイテムが1件残っていた。ジョブキューは空なのに pending フラグだけ立ってる状態。これがデッドロックになって sync 完了に遷移できなくなっていた。

該当ファイル(Dropbox が自動生成したコンフリクトコピー)を Finder から削除したら、即座に「Up to date」になった。

症状

  • Dropbox の UI が「Syncing…」のまま進まない
  • ファイルの同期自体は動いている(新しいファイルは反映される)
  • アプリ再起動、Mac 再起動、Finder 再起動、いずれも効果なし
  • Dropbox のアンリンク → 再リンクでインデックス再構築しても、再構築後にまた「Syncing…」で止まる

調査手順

ターミナルから FileProvider の内部データベースを直接調べる。ここから先はターミナル操作が必要。

1. FileProvider データベースの場所を確認

ls ~/Library/Application\ Support/FileProvider/Dropbox/database/

db というファイルがある。これが FileProvider の同期状態を管理している SQLite データベース。

2. pending アイテムを探す

sqlite3 ~/Library/Application\ Support/FileProvider/Dropbox/database/db \
  "SELECT count(*) FROM reconciliation_table WHERE is_pending = 1;"

ここで 0 以外の数字が出たら、それが「Syncing…」で止まっている原因。自分の場合は 1 だった。53万件中たった1件。

3. 犯人の詳細を見る

sqlite3 ~/Library/Application\ Support/FileProvider/Dropbox/database/db \
  "SELECT fs_id, fp_id, fs_structural_filename, fp_scheduling_state, fs_scheduling_state
   FROM reconciliation_table WHERE is_pending = 1;"

自分の環境だとこう出た:

-11692|dbitem:530699|somethumbnail (XXX の競合コピー 2026-03-14).png|0|4

fp_scheduling_state = 0(FileProvider 側で未処理)なのに fs_scheduling_state = 4(ファイルシステム側では完了)。この不整合がデッドロックの正体。ジョブも生成されないから永遠に解消されない。

4. ファイルのパスを特定する

pending アイテムの親フォルダを再帰的に辿ってフルパスを組み立てる:

sqlite3 ~/Library/Application\ Support/FileProvider/Dropbox/database/db "
WITH RECURSIVE path_trace(id, parent, name, depth) AS (
  SELECT fs_id, fs_structural_parent_id, fs_structural_filename, 0
  FROM reconciliation_table WHERE is_pending = 1
  UNION ALL
  SELECT r.fs_id, r.fs_structural_parent_id, r.fs_structural_filename, pt.depth + 1
  FROM reconciliation_table r
  JOIN path_trace pt ON r.fs_id = pt.parent
  WHERE pt.depth < 10
)
SELECT name FROM path_trace ORDER BY depth DESC;
"

これでルートからのパスが出る。depth の深い方がルートに近い。

5. ファイルを削除

特定したファイルを Finder から削除する。自分の場合はコンフリクトコピー(XXX の競合コピー というファイル名のやつ)だったので、元ファイルは別に存在していて削除して問題なかった。

6. 確認

sqlite3 ~/Library/Application\ Support/FileProvider/Dropbox/database/db \
  "SELECT count(*) FROM reconciliation_table WHERE is_pending = 1;"

0 になっていれば OK。Dropbox の UI も「Up to date」に変わっているはず。

補足: ジョブキューの確認

pending アイテムとは別に、ジョブキューが詰まっている場合もある:

# ジョブキューの状態
sqlite3 ~/Library/Application\ Support/FileProvider/Dropbox/database/db \
  "SELECT scheduling_state, count(*) FROM jobs GROUP BY scheduling_state;"
# pending-set フラグ
cat ~/Library/Application\ Support/FileProvider/Dropbox/non-empty-pending-set

ジョブキューが空なのに non-empty-pending-settrue なら、上記の reconciliation_table に原因がある。

補足: プロセスの状態確認

FileProvider 周りのプロセスが動いているかどうかも確認できる:

# DropboxFileProvider の CPU/メモリ
ps aux | grep DropboxFileProvider | grep -v grep | \
  awk '{print "PID:", $2, "CPU:", $3"%", "MEM:", int($6/1024)"MB"}'
# macOS の fileproviderd(システムプロセス)
ps aux | grep fileproviderd | grep -v grep | \
  awk '{print "PID:", $2, "CPU:", $3"%", "MEM:", int($6/1024)"MB"}'

CPU が 0% で pending アイテムが残っているなら、完全にデッドロックしている。

なぜこうなるのか

推測だけど、Dropbox のインデックス再構築中にコンフリクトコピーが生成されると、FileProvider の列挙処理とコンフリクト生成が競合して、reconciliation_table の FP 側エントリが正しく登録されないっぽい。レースコンディション。

他のコンフリクトコピーは fp_scheduling_state = 4(正常に処理済み)なのに、再構築中に生成されたこの1件だけ fp_scheduling_state = 0 のまま取り残された。Dropbox のバグと言っていいと思う。

まとめ

  • 「Syncing…」で止まる原因は FileProvider の reconciliation_tableis_pending = 1 のアイテムが残っていること(少なくとも自分のケースでは)
  • sqlite3 で直接データベースを調べれば犯人が特定できる
  • 該当ファイルを削除すれば即座に解消される
  • 再起動は意味ない。問題はプロセスじゃなくてデータの状態不整合

同じ症状で困ってる人が sqlite3 をターミナルで叩ける人かどうかは分からんけど、少なくとも Dropbox のサポートに「reconciliation_table の is_pending を確認してくれ」と言える材料にはなるかなと。

you