0

sqlite3 1.3.7Ubuntu 12.04 サーバーでホストされているSQLite3 (gem) を使用する 2 つの Rails 3.2 アプリがあります。OS とデータベースの両方が同じディスク (AWS EBS) 上にある

sqlite3 で問題が発生したことはありません。もう1つは2つcomplete lock-out(再起動が必要)で、file corruption昨年は1つです。

これら 2 つのアプリのユーザー負荷はわずかです。これがどのように起こったのか、私たちはよく理解していません。唯一の違いは、第 2 の Rails アプリには、多数のレコードをアプリにアップロードするためのサード パーティ プログラムがあり、このサード パーティ ソフトウェアが sqlite3 に何か悪いことをしたと思われることです。

サードパーティのソフトウェアがどのように設計および開発されたかについての情報はありません。その唯一の用途は、一部のスプレッドシート データをアプリにアップロードし、アプリがそれらをテーブルに保存することです。

私たちの質問は、sqlite3 がサードパーティのソフトウェアによって簡単に破損するかどうかです。

そうである場合、サードパーティのソフトウェアによって sqlite3 が破損するのを防ぐ方法、および/またはサードパーティのソフトウェア開発者がソフトウェアによって SQLite が破損するのを防ぐための追加要件を指定する方法。

( https://stackoverflow.com/q/16797362/398670からのフォローアップ)

4

2 に答える 2

2

公式サイトには、sqlite データベースが破損する可能性がある方法のかなり包括的なリストがあります。そのページの簡単なリストを次に示します。

  1. 不正なスレッドまたはプロセスによるファイルの上書き
  2. ファイルのロックの問題
  3. 同期の失敗
  4. ディスク ドライブとフラッシュ メモリの障害
  5. メモリ破損
  6. その他のオペレーティング システムの問題
  7. SQLite のバグ

不適切に作成されたプログラムが原因になることは容易に想像できます1

于 2013-05-29T04:18:38.413 に答える
2

ロックプロトコルが一致していませんか?

破損に関する SQLite FAQのセクション 2.3 が有力な候補のようです。

2.3 異なるロック プロトコルを使用する 2 つのプロセス

UNIX プラットフォームで SQLite が使用するデフォルトのロック メカニズムは POSIX アドバイザリ ロックですが、他のオプションもあります。sqlite3_open_v2() インターフェイスを使用して代替の sqlite3_vfs を選択する [...]。

...

同じデータベース ファイルへのすべての接続で、同じロック プロトコルを使用することが重要です。[...] ...データベースの破損につながる可能性があります。.

あなたの立場では、詳細なSQLiteログから必要な情報を取得できなかった場合、ミステリー「サードパーティソフトウェア」をstraceまたは(より詳細に)ltrace実行して、それが何をしているかを詳細に確認しました。

安全でないファイル操作

もう 1 つの可能性は、サード パーティのアプリが「巧妙」であり、通常のファイルに対しては安全であるが、開いているデータベースの重大な破損を保証する何らかのコピー、更新、スワップ トリックを行っていることです。strace繰り返しますが、これは出力で確認できます。ただし、strace 出力を分析する過程で学習する準備をしてください...

バージョンの不一致

サード パーティ製アプリに別の SQLite データベース エンジン バージョンが埋め込まれている場合、バージョンの不一致が原因で問題が発生する可能性があります。特に、3.7.0 と 3.6.x の FAQ エントリを参照してください。

7.5 3.6 と 3.7 からの交互書き込み後の破損。

于 2013-05-29T04:28:56.903 に答える