Как сделать резервную копию базы данных sqlite?

98

Как правильно это сделать? Я просто скопирую файл .sq3?

Что делать, если на сайте есть пользователи и во время копирования файл записывается?

thelolcat
источник
6
В SQLite есть API для этого
полковник тридцать два,
1
Какой язык и драйвер вы используете для доступа к базе данных?
кл.
1
Я использую PHP и расширение PDO
thelolcat
В настоящее время существует запрос функции для предоставления API резервного копирования sqlite в php: bugs.php.net/bug.php?id=70950
Брайан Минтон

Ответы:

156

Инструмент командной строки sqlite3 содержит команду .backupточки .

Вы можете подключиться к своей базе данных с помощью:

sqlite3 my_database.sq3

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

.backup backup_file.sq3

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

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

В любом случае результатом будет копия с именем backup_file.sq3базы данных my_database.sq3.

Это отличается от обычного копирования файлов, поскольку оно заботится обо всех пользователях, работающих в настоящее время с базой данных. В базе данных установлены надлежащие блокировки, поэтому резервное копирование выполняется исключительно.

Гуги
источник
69
Вы можете сделать все в одной строке ...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, она дает вам возможность выгрузить всю базу данных или таблицы в текстовый файл. Если указано 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не работает, как показано выше («отсутствует аргумент FILENAME в .backup»)
Франсеск Росас
4
Это лучший ответ. Если вы используете .backup в рабочей базе данных, используемой многими, он может не работать, потому что в какой-то момент база данных заблокирована. Поэтому, если вы используете это в CRON, это не сработает и не сообщит вам об ошибке ... лучше используйте .dump (всегда работает) или API, предоставленный SQLite.
Memristor
@Memristor Но разве .dump не блокирует БД для других? FWIW, я бы предпочел неудачное резервное копирование (с письмом админу) прерванной службе.
Торстен Бронгер 09
1
Исправьте синтаксис .backup в своем ответе. Оператор '>' здесь не нужен
Нашев 06
-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. Это не решает проблему, которая может быть записана в базу данных при ее копировании.
Кристофер К.