Простое создание резервной копии основного файла базы данных не работает для
я.
Если вы правильно отметили базу данных, используя опцию TRUNCATE перед выполнением резервного копирования, тогда не нужно создавать резервные копии файлов -wal и -shm (так как они будут пустыми).
Также, если вы закроете все соединения, это также должно завершить контрольную точку. Например, рассмотрим следующее (где logDBSizeInfo
выводит размеры файлов, addsomeData
и deleteSomeData
делают как говорится)
mDBHlpr = new DBHelper(this);
logDBSizeInfo(this,DBHelper.DBNAME);
if (DatabaseUtils.queryNumEntries(mDBHlpr.getWritableDatabase(),"table1") < 1) {
addSomeData(100000);
deleteSomeData(1000);
} else {
addSomeData(1000);
deleteSomeData(100);
}
logDBSizeInfo(this,DBHelper.DBNAME);
mDBHlpr.close();
//checkpointIfWALEnabled(this,DBHelper.DBNAME);
logDBSizeInfo(this,DBHelper.DBNAME);
Результат: -
05-24 20:25:47.195 D/DBSIZEINFO: Database Size is 34312192
05-24 20:25:47.195 D/DBSIZEINFO: Database -wal file Size is 0 path is /data/user/0/aso.so56286308backupwal/databases/mydb-wal
05-24 20:25:47.196 D/DBSIZEINFO: Database -shm file Size is 32768 path is /data/user/0/aso.so56286308backupwal/databases/mydb-shm
05-24 20:25:47.199 D/ADDSOMEDATA: Adding about 1000 rows
05-24 20:25:47.365 D/ADDSOMEDATA: Deleting about 100 rows
05-24 20:25:47.397 D/DBSIZEINFO: Database Size is 34656256
05-24 20:25:47.397 D/DBSIZEINFO: Database -wal file Size is 420272 path is /data/user/0/aso.so56286308backupwal/databases/mydb-wal
05-24 20:25:47.397 D/DBSIZEINFO: Database -shm file Size is 32768 path is /data/user/0/aso.so56286308backupwal/databases/mydb-shm
<<<<<<<<<<After Close>>>>>>>>>>
05-24 20:25:47.400 D/DBSIZEINFO: Database Size is 34656256
05-24 20:25:47.400 D/DBSIZEINFO: Database -wal file does not exist
05-24 20:25:47.400 D/DBSIZEINFO: Database file -shm does not exist
Я использую следующее для проверки контрольной точки файла перед резервным копированием (только файл базы данных): -
private void checkpointIfWALEnabled(Context context, String databaseName) {
Cursor csr;
int wal_busy = -99, wal_log = -99, wal_checkpointed = -99;
SQLiteDatabase db = SQLiteDatabase.openDatabase(context.getDatabasePath(databaseName).getPath(),null,SQLiteDatabase.OPEN_READWRITE);
csr = db.rawQuery("PRAGMA journal_mode",null);
if (csr.moveToFirst()) {
String mode = csr.getString(0);
if (mode.toLowerCase().equals("wal")) {
csr = db.rawQuery("PRAGMA wal_checkpoint",null);
if (csr.moveToFirst()) {
wal_busy = csr.getInt(0);
wal_log = csr.getInt(1);
wal_checkpointed = csr.getInt(2);
}
csr = db.rawQuery("PRAGMA wal_checkpoint(TRUNCATE)",null);
csr.getCount();
csr = db.rawQuery("PRAGMA wal_checkpoint",null);
if (csr.moveToFirst()) {
wal_busy = csr.getInt(0);
wal_log = csr.getInt(1);
wal_checkpointed = csr.getInt(2);
}
}
}
csr.close();
db.close();
}
Другим вариантом, который может уменьшить размер резервной копии, будет использование VACUUM INTO . Я не пробовал этот подход. Тем не менее, ведение журнала используется, поэтому может быть целесообразным впоследствии использовать контрольную точку (затем вы можете использовать файл не только в качестве резервной копии, но и для замены исходного файла).
Инкрементное резервное копирование базы данных, вероятно, окажется непрактичным и займет больше времени, если только у вас в основном не было построено ведение журнала транзакций, и поэтому, скорее всего, он не задает вопрос. В целом система инкрементного резервного копирования управляется относительно легко обнаруживаемыми изменениями.