Во-первых, НЕ используйте journal_mode=MEMORY
или =OFF
.
. Мы можем использовать эти команды для уменьшения вероятности повреждения:
PRAGMA synchronous=FULL
или PRAGMA synchronous=EXTRA
PRAGMA fullfsync=ON
(работает только в Mac OS X)
Но они требуют затрат на замедление транзакций.И даже с ними БД может быть повреждена из-за других причин , таких как сбой в устройстве хранения или в памяти, поэтому мы должны быть готовы к этой проблеме.
Мы можем сделать обычные резервное копирование , но имеет 2 недостатка:
- Копирует весь файл БД в каждую резервную копию
- Мы теряем все транзакции, которые были сделаны после последней резервной копии
У меня есть клиент, который использовал его для резервного копирования на флеш-накопителе, и флеш-накопитель всегда оставался подключенным к компьютеру, пока не возникла молния и не уничтожила компьютер, в том числе и флеш-накопитель.Все данные были потеряны.Поэтому резервная копия должна храниться отдельно от основного компьютера.
Лучшей альтернативой является использование репликации.При этом каждая транзакция, выполняемая на главной базе данных, реплицируется на реплики.
Для SQLite мы можем использовать litereplica .Он поддерживает восстановление на определенный момент времени, и я предлагаю использовать его с репликацией, потому что, если некоторые данные будут случайно удалены из основной базы данных, они будут реплицированы.С помощью PITR мы можем восстановить БД до предыдущего момента времени.
Еще одно важное предложение - хранить реплику в отдельном устройстве и отдельно друг от друга.По крайней мере, не в том же здании.
Выполнение команды PRAGMA integrity_check
время от времени является хорошей практикой, поскольку SQLite не делает это автоматически и продолжает записывать в БД при некоторых видах повреждений.
И если ваш БД использует внешние ключи, вы можете сделать то же самое с PRAGMA foreign_key_check
.