Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

sqlite3 my_database.sq3

и выполните команду backup dot:

.backup backup_file.sq3

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

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

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

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

Ответ 2

Для инкрементного резервного копирования в реальном времени (копирование только измененных страниц) вы можете использовать litereplica.

Он реализует однонаправленную репликацию базы данных с поддержкой восстановления по времени, поэтому, если запись или таблица случайно удалены, мы можем восстановить db (или первичную или реплику) до некоторой точки перед проблемой.

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

На главной стороне приложение откроет db, используя измененный URI, например:

"file:/path/to/main.db?replica=master&slave=tcp://my.server.ip:1234"

И в реплике/резервной копии у вас должно быть запущенное приложение для получения обновлений. Это приложение откроет копию db с использованием URI следующим образом:

"file:/path/to/copy.db?replica=slave&bind=tcp://0.0.0.0:1234"

Чтобы включить восстановление по времени, мы должны добавить некоторые параметры в имя файла URI, например:

&pitr=on&pitr_limit=200M

Он может быть включен либо в основном db, как в резервной копии/реплике.

И чтобы включить шифрование (базу данных и связь), добавим что-то вроде:

&cipher=chacha20&key=your_key_here

Ответ 3

.backup это лучший способ.

sqlite3 my_database .backup my_database.back

Вы также можете попробовать команду .dump, она дает вам возможность выгрузить всю базу данных или таблицы в текстовый файл. Если указано TABLE, только таблицы дампа, соответствующие шаблону LIKE TABLE.

sqlite3 my_database .dump > my_database.back

Ответ 4

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