Sqlite veritabanı nasıl yedeklenir?


98

Bunu yapmanın doğru yolu nedir? .Sq3 dosyasını mı kopyalıyorum?

Ya sitede kullanıcılar varsa ve dosya kopyalanırken yazılıyorsa?



1
Veritabanına erişmek için hangi dili ve sürücüyü kullanıyorsunuz?
CL.

1
PHP ve PDO uzantısını kullanıyorum
thelolcat

Yanıtlar:


156

Sqlite3 komut satırı aracı .backupnokta komutuna sahiptir .

Veritabanınıza şu şekilde bağlanabilirsiniz:

sqlite3 my_database.sq3

ve yedekleme nokta komutunu şu şekilde çalıştırın:

.backup backup_file.sq3

Veritabanına etkileşimli bağlantı yerine yedeklemeyi yapabilir ve daha sonra bağlantıyı kapatabilirsiniz.

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

Her iki durumda da sonuç, backup_file.sq3veritabanının adlandırılmış bir kopyasıdır my_database.sq3.

Düzenli olarak dosya kopyalamadan farklıdır, çünkü şu anda veritabanı üzerinde çalışan herhangi bir kullanıcıyla ilgilenir. Veritabanında ayarlanmış uygun kilitler vardır, bu nedenle yedekleme özel olarak yapılır.


69
Hepsini tek satırda yapabilirsiniz ...sqlite3 m_database.sq3 ".backup m_database.sq3.bak"
Mark Setchell

@Googie: Kopyalama için kullanabilir miyiz? veya
mOna

4
@mOna: Bu sadece yedekleme yapmak için bir mekanizmadır. Çoğaltma, değişiklikleri anında yaymak anlamına gelir (dağıtılmış bir veritabanı türü), bu sizin için yapmaz.
Googie

Cevap için teşekkürler :)
mOna

1
@RonJohn Aslında bir dosyanın bir kopyasını oluşturur, ancak aynı zamanda veritabanına yazma erişiminin uygun kilitlerle kısıtlandığını da anlar, yani atomik bir işlemdir, ara değişiklik yoktur.
Googie

6

.backup en iyi yoldur.

sqlite3 my_database .backup my_database.back

.dump komutunu da deneyebilirsiniz, bu size tüm veritabanını veya tabloları bir metin dosyasına dökme yeteneği sağlar. TABLE belirtilirse, yalnızca LIKE pattern TABLE ile eşleşen döküm tabloları.

sqlite3 my_database .dump > my_database.back

Döküm ve depolamayı kullanarak arşiv kopyası oluşturmanın iyi bir yolu, Veritabanını daha sonra yeniden yapılandırın.

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

Ayrıca bu soruyu kontrol edin SQLite3 .backup ve .dump komutları veritabanını kilitliyor mu?


4
SQLite .backup3.8.2'de yukarıda gösterildiği gibi çalışmıyor (".backup üzerinde eksik FILENAME bağımsız değişkeni")
Francesc Rosas

4
Bu en iyi cevap. Birçok kişi tarafından kullanılan çalışan bir veritabanında .backup kullanıyorsanız, veritabanı bir noktada kilitlendiğinden çalışmayabilir. Dolayısıyla, bunu bir CRON'da kullanıyorsanız, çalışmaz ve size bir hata olduğunu söylemez ... .dump (her zaman çalışır) veya SQLite tarafından verilen API'yi daha iyi kullanın.
Memristor

@Memristor Ama .dump diğerleri için DB'yi kilitlemiyor mu? FWIW, başarısız bir yedeklemeyi (yöneticiye posta ile) kesintiye uğramış bir hizmete tercih ederim.
Torsten Bronger

1
Lütfen yanıtınızda .backup sözdizimini düzeltin. '>' Operatörüne gerek yok
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();
}

Veritabanı dosyalarının dosya sistemi düzeyinde programlı kopyalamayı mı ima ediyorsunuz?
Andreas Tasoulas

4
1. Bu kodun hangi dil olduğunu bile söylemiyorsunuz. OP, PHP kullandığını söyledi, ancak bu java kodu gibi görünüyor. 2. Bir dosya bayt bayt kopyalarsınız. Bunu yapmanın avantajı ne olmalı? Java (ve php) dosyaları kopyalama yöntemlerine sahiptir. Docs.oracle.com/javase/tutorial/essential/io/copy.html okuyun 3. Bu, siz kopyalarken db'nin yazılabileceği sorunu ele almaz.
Christopher K.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.