Charsbar::Note

2012/11/21

DBD::SQLiteで作成したデータベースがsqlite3コマンドで開けない場合

以前こちらでも書いた通り、DBD::SQLite 1.37以降ではバンドルしているSQLiteライブラリのデフォルトのファイルフォーマットが変更になったため、「PRAGMA legacy_file_format=ON」を有効にしないと2006年以前のSQLiteでは読めなくなるという問題があるのですが、それとは別に、SQLite 3.7以降で新設されたWAL (Write Ahead Logging)という機能を使うと、バージョン3.7より前のsqlite3コマンドでは「file is encrypted or is not a database」などといわれて該当のデータベースが開けなくなります。

詳細については下記のリンクをご覧いただくとして、データベースを開いたときに-walとか-shmという接尾辞のついたファイルができる場合はこの機能が妨げになっているものと思われますので、最近のDBD::SQLiteを使って「PRAGMA journal_mode = DELETE」を発行して従来のロールバックジャーナルモードに戻すか、sqlite3バイナリの方を最新のものにアップグレードしてください。広報していなかったのであまり使う方もいらっしゃらないかと思っていたのですが、kazeburoさんのGrowthForecastでWALモードが採用されています。

なお、このモード変更は、ほかの多くのプラグマと違い、データベース接続を切ったあとも有効です。WALモードを検証したあと戻し忘れた場合などにも影響が残りますのでご注意ください。

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/charsbar/20121121/1353510834