1

読み取り専用で開く

読み取りプロセスを実行しているユーザーとは異なるユーザーに属するファイルシステムに sqlite3 ファイルがあります。読み取りプロセスが読み取り専用モードでファイルを読み取れるようにしたいので、SQLITE_OPEN_READONLY を渡します。私はそれがうまくいくことを期待しています。確かに、読み取り専用モードは、書き込みたくないファイルに対して機能するという考えですか?

最初のステートメントを準備すると、

unable to open database file

同様に、sqlite3コマンド ライン ツールを実行すると、sudo しない限り同じ結果が得られます。問題は他の何よりも書き込み可能性であることを確認しているようです。

ジャーナルファイル

この質問に対する答えは、周囲にジャーナル ファイルがある場合、読み取り専用アクセスが不可能であることを示唆しているようです。

ジャーナルファイルがあるのはなぜですか? 別のプロセスがファイルを書き込んでいるため、ユーザー プロセスがそのファイルを読み取り専用で開こうとしています。-shmこれを行うために、2 つのジャーナル ファイルを生成する先行書き込みログを使用しています-wal。確かに、書き込みプロセスを停止してジャーナル ファイルを削除すると、ユーザー プロセスはそれを読み取り専用モードで開くことができます。

非互換性?

だから私は2つの状況があります:

  • ファイルが書き込みプロセスと読み取り専用プロセスに属している場合、先行書き込みロギングにより、プロセス A が書き込み、プロセス B が読み取り専用になります。

  • ファイルが書き込みプロセスに属しているが読み取り専用プロセスに属していない場合、読み取り専用プロセスは読み取り専用で開くことがブロックされます。

これらの両方を達成するにはどうすればよいですか?それを綴るために、私は欲しい:

  • 書き込みプロセスがデータベースを所有
  • 読み取り専用プロセスはデータベースを所有していません
  • 読み取り専用プロセスはデータベースに書き込めません
  • データベースで先行書き込みログが有効になっている

単純な一連の要件のように思えますが、明確な解決策がわかりません。

**編集: **このドキュメントを見ると、これは不可能のようです。上記を達成するための代替方法を提案できますか?

4

2 に答える 2

1

はい、WAL ジャーナリングされたデータベースは、明示的またはその他の方法で読み取り専用で開くことはできません (つまり、データベース ファイルがプロセスに対して読み取り専用である場合)。

読み取り専用プロセスがデータベース ファイルを変更することを絶対に許可しないようにする必要がある場合、思いつく唯一のことは、書き込みプロセスがデータベースの非 WAL ジャーナルの追加コピーを維持することです。

結論: 私の知る限りでは、WAL と読み取り専用は実行できません。

于 2012-08-30T09:43:42.960 に答える