Як зробити резервну копію бази даних sqlite?


97

Який правильний спосіб це зробити? Чи просто скопіювати файл .sq3?

Що робити, якщо на сайті є користувачі, а файл копіюється під час копіювання?



1
Яку мову та драйвер ви використовуєте для доступу до бази даних?
ЗР.

1
я використовую PHP та розширення PDO
thelolcat

Наразі є запит на функцію для викриття API резервного копіювання sqlite у php: bugs.php.net/bug.php?id=70950
Брайан Мінтон,

Відповіді:


154

Інструмент командного рядка sqlite3 містить .backup крапка .

Ви можете підключитися до бази даних за допомогою:

sqlite3 my_database.sq3

і запустіть команду резервної точки за допомогою:

.backup backup_file.sq3

Замість інтерактивного підключення до бази даних ви також можете зробити резервну копію та закрити підключення після

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

У будь-якому випадку результатом є копія з іменем backup_file.sq3бази даних my_database.sq3.

Це відрізняється від регулярного копіювання файлів, оскільки воно опікується всіма користувачами, які зараз працюють над базою даних. У базі даних встановлені належні блокування, тому резервне копіювання виконується виключно.


68
Ви можете зробити все в одному рядку ...sqlite3 m_database.sq3 ".backup m_database.sq3.bak"
Марк Сетчелл

@Googie: Чи можемо ми використати його для тиражування? або
mOna

4
@mOna: Це лише механізм створення резервних копій. Реплікація означає поширення змін на льоту (різновид розподіленої бази даних), що для вас це не зробить.
Googie

Дякую за відповідь :)
mOna

1
@RonJohn Він насправді робить копію файлу, але також підтверджує, що доступ до бази даних обмежений належними блокуваннями, тому це атомна операція, без проміжних модифікацій.
Googie

6

.backup - найкращий спосіб.

sqlite3 my_database .backup my_database.back

Ви також можете спробувати команду .dump, це дає вам можливість скидати всю базу даних або таблиці в текстовий файл. Якщо вказано ТАБЛИЦЮ, вивантажувати лише таблиці, що відповідають ТАБЛИЦІ ПОДОБНОГО.

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не працює, як показано вище ("відсутній аргумент FILENAME на .backup")
Francesc Rosas

4
Це найкраща відповідь. Якщо ви використовуєте .backup на робочій базі даних, яка використовується багатьма, це може не спрацювати, оскільки в якийсь момент база даних заблокована. Отже, якщо ви використовуєте це в CRON, це не буде працювати і не повідомлятиме вам про помилку ... краще використовувати .dump (завжди працює) або API, наданий SQLite.
Мемрістор

@Memristor Але .dump не блокує БД для інших? FWIW, я віддав би перевагу невдалому резервному копіюванню (з поштою до адміністратора) перед зіпсованою службою.
Torsten Bronger

1
Виправте у відповіді синтаксис .backup. Йому не потрібен оператор '>'
Нашев

-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();
}

Ви маєте на увазі програмне копіювання на рівні файлової системи файлів баз даних?
Андреас Тасулас

4
1. Ви навіть не кажете, якою мовою є цей код. OP заявив, що він використовує PHP, але це, здається, Java-код. 2. Ви копіюєте файл байт за байтом. Якою має бути перевага цього? Java (і php) мають методи копіювання файлів. Прочитайте docs.oracle.com/javase/tutorial/essential/io/copy.html 3. Це не вирішує проблему, на яку може бути записаний db під час його копіювання.
Крістофер К.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.