Bagaimana cara membackup database sqlite?

98

Bagaimana cara yang tepat untuk melakukannya? Apakah saya hanya menyalin file .sq3?

Bagaimana jika ada pengguna di situs dan file sedang ditulis saat sedang disalin?

thelolcat
sumber
6
SQLite memiliki API untuk ini
Colonel Thirty Two
1
Bahasa dan driver apa yang Anda gunakan untuk mengakses database?
CL.
1
Saya menggunakan PHP dan ekstensi PDO
thelolcat
Saat ini ada permintaan fitur untuk mengekspos API cadangan sqlite di php: bugs.php.net/bug.php?id=70950
Brian Minton

Jawaban:

156

Alat baris perintah sqlite3 menampilkan .backupperintah titik .

Anda dapat terhubung ke database Anda dengan:

sqlite3 my_database.sq3

dan jalankan perintah titik cadangan dengan:

.backup backup_file.sq3

Selain koneksi interaktif ke database, Anda juga dapat melakukan backup dan menutup koneksi setelahnya dengan

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

Bagaimanapun hasilnya adalah salinan bernama backup_file.sq3dari database my_database.sq3.

Ini berbeda dari penyalinan file secara teratur, karena menangani semua pengguna yang saat ini mengerjakan database. Ada kunci yang tepat yang ditetapkan pada database, sehingga pencadangan dilakukan secara eksklusif.

Googie
sumber
69
Anda dapat melakukan semuanya dalam satu baris ...sqlite3 m_database.sq3 ".backup m_database.sq3.bak"
Mark Setchell
@ Googie: Bisakah kita menggunakannya untuk replikasi? atau
mOna
4
@mOna: Ini hanyalah mekanisme untuk membuat cadangan. Replikasi berarti menyebarkan perubahan dengan cepat (semacam database terdistribusi), yang tidak akan berhasil untuk Anda.
Googie
Terima kasih atas balasannya :)
mOna
1
@RonJohn Ini sebenarnya membuat salinan file, tetapi juga menjamin, bahwa akses tulis ke database dibatasi dengan kunci yang tepat, jadi ini adalah operasi atom, tanpa modifikasi menengah.
Googie
6

.backup adalah cara terbaik.

sqlite3 my_database .backup my_database.back

Anda juga dapat mencoba perintah .dump, ini memberi Anda kemampuan untuk membuang seluruh database atau tabel ke dalam file teks. Jika TABLE ditentukan, hanya dump tabel yang cocok dengan pola LIKE TABLE.

sqlite3 my_database .dump > my_database.back

Cara yang baik untuk membuat salinan arsip menggunakan dump and store, Rekonstruksi database di lain waktu.

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

Periksa juga pertanyaan ini Apakah perintah SQLite3 .backup dan .dump mengunci database?

Lava Sangeetham
sumber
4
Pada SQLite 3.8.2, .backuptidak berfungsi seperti yang ditunjukkan di atas ("argumen FILENAME hilang pada .backup")
Francesc Rosas
4
Ini jawaban terbaik. Jika Anda menggunakan .backup pada database yang berfungsi yang digunakan oleh banyak orang, ini mungkin tidak berfungsi karena di beberapa titik database terkunci. Jadi jika Anda menggunakan ini di CRON, itu tidak akan berfungsi dan tidak akan memberi tahu Anda bahwa ada kesalahan ... lebih baik gunakan .dump (selalu berfungsi) atau API yang diberikan oleh SQLite.
Memristor
@Memristor Tapi bukankah .dump mengunci DB untuk orang lain? FWIW, saya lebih memilih cadangan yang gagal (dengan email ke admin) ke layanan yang terganggu.
Torsten Bronger
1
Harap perbaiki sintaks .backup dalam jawaban Anda. Tidak perlu operator '>'
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();
}
Ram
sumber
Apakah Anda menyiratkan penyalinan terprogram di tingkat sistem file file database?
Andreas Tasoulas
4
1. Anda bahkan tidak mengatakan bahasa apa kode ini. OP mengatakan dia menggunakan PHP tapi ini sepertinya kode java. 2. Anda menyalin file byte demi byte. Apa untungnya melakukannya? Java (dan php) memiliki metode untuk menyalin file. Baca docs.oracle.com/javase/tutorial/essential/io/copy.html 3. Ini tidak mengatasi masalah yang mungkin membuat db ditulis saat Anda menyalinnya.
Christopher K.