SQLiteデータベースをバックアップする方法は?


93

それを行う適切な方法は何ですか?.sq3ファイルをコピーするだけですか?

サイトにユーザーがいて、コピー中にファイルが書き込まれている場合はどうなりますか?



1
データベースにアクセスするためにどの言語とドライバーを使用していますか?
CL。

1
私はPHPとPDO拡張機能を使用しています
thelolcat

現在、phpでsqliteバックアップAPIを公開する機能のリクエストがあります:bugs.php.net/bug.php?id
Brian Minton

回答:


152

sqlite3コマンドラインツールは、.backupドットコマンドを備えています。

次の方法でデータベースに接続できます。

sqlite3 my_database.sq3

そして、次のコマンドでbackup dotコマンドを実行します。

.backup backup_file.sq3

データベースへのインタラクティブな接続の代わりに、バックアップを実行し、後で接続を閉じることもできます

sqlite3 my_database.sq3 ".backup 'backup_file.sq3'"

どちらにしても、結果はbackup_file.sq3データベースの名前が付けられたコピーになりますmy_database.sq3

これは、データベースで現在作業しているすべてのユーザーを処理するため、通常のファイルコピーとは異なります。データベースには適切なロックが設定されているため、バックアップは排他的に行われます。


68
すべてを1行で実行できます...sqlite3 m_database.sq3 ".backup m_database.sq3.bak"
Mark Setchell、2014

@Googie:レプリケーションに使用できますか?または
mOna 2016年

4
@mOna:これはバックアップを作成するためのメカニズムにすぎません。レプリケーションとは、オンザフライで変更を伝播すること(分散データベースのようなもの)を意味しますが、これはあなたのためではありません。
Googie、

返信いただきありがとうございます:)
mOna

1
@RonJohn実際にはファイルのコピーを作成しますが、データベースへの書き込みアクセスが適切なロックによって制限されることも保証するため、中間的な変更ではなく、アトミック操作です。
Googie 2018

5

.backupが最善の方法です。

sqlite3 my_database .backup my_database.back

.dumpコマンドを試すこともできます。データベース全体またはテーブル全体をテキストファイルにダンプできます。TABLEが指定されている場合、LIKEパターンTABLEに一致するテーブルのみをダンプします。

sqlite3 my_database .dump > my_database.back

ダンプとストアを使用してアーカイブコピーを作成する良い方法です。後でデータベースを再構築します。

sqlite3 my_database .dump | gzip -c > my_database.dump.gz
zcat my_database.dump.gz | sqlite3 my_database

また、この質問を確認してくださいSQLite3 .backupおよび.dumpコマンドはデータベースをロックしますか?


4
SQLite 3.8.2では、.backup上記のように機能しません( ".backupにFILENAME引数がありません")
Francesc Rosas

4
これが最良の答えです。多くのユーザーが使用している稼働中のデータベースで.backupを使用している場合、ある時点でデータベースがロックされるため、機能しない可能性があります。したがって、これをCRONで使用している場合は機能せず、エラーも通知されません... .dump(常に機能します)またはSQLiteが提供するAPIを使用することをお勧めします。
Memristor

@Memristorしかし、.dumpは他の人のためにDBをロックしませんか?FWIW、私は中断されたサービスよりも失敗したバックアップ(管理者へのメールを含む)を好みます。
Torsten Bronger

1
回答の.backup構文を修正してください。「>」演算子は必要ありません
Nashev

-23
try {
    final String inFileName = "/data/data/your app package/databases/db";
    File dbFile = new File(inFileName);
    FileInputStream fis = new FileInputStream(dbFile);
    String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/CALC/Backup";
    File dir = new File(path);
    if (!dir.exists()) dir.mkdirs();
    String outFileName = path + "/filename"; // output file name
    // Open the empty db as the output stream
    OutputStream output = new FileOutputStream(outFileName);

    // Transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[1024];
    int length;
    while ((length = fis.read(buffer)) > 0) {
        output.write(buffer, 0, length);
    }
    Toast.makeText(getActivity(), "Backup Successfully", 2).show();
    // Close the streams
    output.flush();
    output.close();
    fis.close();
} 
catch (Exception e) {
    e.printStackTrace();
}

データベースファイルのファイルシステムレベルでのプログラムによるコピーを意味していますか?
Andreas Tasoulas 2015

4
1.このコードがどの言語であるかを言うことさえしません。OPはPHPを使用していると言いましたが、これはJavaコードのようです。2.バイト単位でファイルをコピーします。そうすることの利点は何でしょうか?Java(およびphp)には、ファイルをコピーするメソッドがあります。docs.oracle.com/javase/tutorial/essential/io/copy.htmlをお読みください。3 .これは、コピー中にdbが書き込まれる可能性がある問題には対処していません。
クリストファーK.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.