Блокировка sqlite3 дБ для загрузки файла - PullRequest
6 голосов
/ 07 октября 2011

У меня есть база данных sqlite3 в какой-то системе, которую мне нужно загрузить во время текущей работы. Остановка или приостановка доступа к процессам не вариант. Поэтому, насколько я понимаю, мне нужно держать блокировку SHARED (как описано в http://www.sqlite.org/lockingv3.html) для БД во время загрузки, чтобы избежать изменений БД и повреждения во время загрузки. Как я могу получить такую ​​блокировку явно? управляется из C ++ - программы, поэтому мне нужно было бы получить блокировку там.

РЕДАКТИРОВАТЬ: thkala предложил сделать дамп базы данных. Но я бы предпочел найти решение с блокировкой, потому что я не уверен, будет ли достаточно памяти для полной копии БД.

Ответы [ 3 ]

8 голосов
/ 07 октября 2011

Нет, нет.нет и нет!

Неразбериха с блокировками и копирование файлов вручную - старый способ сделать что-то.SQLite теперь имеет правильный API резервного копирования , который вы можете использовать.Это рекомендуемый способ выполнения онлайновых копий базы данных SQLite - вы можете использовать ее для создания копии базы данных, которую затем можно будет загрузить по вашему усмотрению.

РЕДАКТИРОВАТЬ:

Если у вас абсолютно есть для использования блокировки, вы можете использовать метод, обозначенный здесь - возможно, после перевода на C:

  • Открыть базу данных

  • Используйте оператор BEGIN IMMEDIATE для получения общей блокировки.

  • Скопируйте / загрузите файлы вручную - сделайтеуверен, что вы не пропустите ни одного.Есть по крайней мере файл DB, файл журнала и, возможно, файл WAL.Возможно, вы захотите поместить БД в отдельный каталог, чтобы упростить процесс.

  • ROLLBACK транзакция, которую вы только что начали.

Я понимаю, как этот метод может быть полезен в некоторых случаях, но я должен повторить, что этот больше не является рекомендуемым методом.

2 голосов
/ 07 октября 2011

Я упустил из виду решение: начните транзакцию с

BEGIN IMMEDIATE TRANSCTION

и завершите ее с

END TRANSACTION

, чтобы получить блокировку.Ключевое слово IMMEDIATE не является значением по умолчанию, и БД уже заблокирована (ЗАБРОНИРОВАНА блокировка, полученная), когда вызов возвращается.

0 голосов
/ 07 октября 2011

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

Я думаю, что вы также можете избежать копирования базы данных вместе с журналом (скопируйте и базу данных, и журнал в файлы tmp, а затем загрузите их) Затем на удаленном конце попытайтесь открыть эту базу данных, и она исправит сам. Это при условии, что приложение использует правильные транзакции.

Пожалуйста, прочитайте ниже комментарии, которые объясняют, почему это неправильно:

Суть в том, что вы можете скопировать базу данных и журнал, но только если вы может получить ОБА ОТ ТОЧКО в тот же момент времени.

Что более или менее невозможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...