sqlite искажен БД только локально - PullRequest
3 голосов
/ 13 июля 2011

У меня есть база данных SQLite, размещенная на моем сайте, и там она отлично работает. Мне нужно добавить несколько новых запросов, и я хотел бы проверить их локально, прежде чем начать работу.

Проблема в том, что после того, как я загружаю файл БД для локальной работы с ним, при попытке выполнить запрос (тот же, который работает в сети), я получаю «образ диска базы данных искажен».

Есть идеи, где проблема?

Мой сайт подробно

Сервер: linux

Драйвер PDO для SQLite 3.x: включен

Библиотека SQLite: 3.3.7

Мои локальные данные

Сервер: Windows 7 с XAMPP (1.7.2)

Драйвер PDO для SQLite 3.x: включен

Библиотека SQLite: 3.6.16

1 Ответ

0 голосов
/ 13 июля 2011

Как загрузить файл БД SQLite3 в локальную систему?

Если вы используете что-то вроде FTP или SCP, чтобы получить его напрямую, когда сервер подключен к сети, вполне возможно, что вы получите поврежденныйфайл.Подумайте об этом: для передачи такого файла через Интернет потребуется не менее нескольких секунд - несколько секунд, в течение которых ваш сайт все еще находится в сети и транзакции выполняются с файлом БД сервера.Таким образом, первые байты файла будут отражать, например, транзакцию 1003, а последние байты будут отражать транзакцию 1015. По сути, файл БД изменяется, пока вы все еще его скачиваете.

И мы до сих пор не попали в файлы журнала БДи частичные транзакции.

Вам нужна атомарная копия файла БД.Даже cp на сервере может быть недостаточно быстрым.Вам нужен способ блокировать БД при копировании файла.

Есть три способа сделать это:

  • Использовать sqlite3Оболочка утилит на сервере и .dump БД.Затем вы можете сжать дамп SQL, загрузить его и восстановить локальную базу данных.Немного громоздко, но почти гарантированно сработает.

  • Используйте API резервного копирования SQLite3 .Утилита sqlite3 имеет команду .backup, которая делает то же самое.Тогда вы можете просто скачать новый файл БД.К сожалению, старые версии SQLite могут не поддерживать это.

  • Заблокируйте файл БД с помощью утилиты оболочки sqlite3, используйте cp, чтобы скопировать его, разблокировать.Старый, немного опасный способ, поэтому я не буду вдаваться в подробности.

  • Остановите сервер, чтобы никакие транзакции не выполнялись, скопируйте файл, перезапустите.Я не считаю это фактическим решением, поэтому оно не включено в окончательный счет.

Кстати, эта страница содержит несколько распространенных способов испортитьБД SQLite3 - возможно, вы захотите взглянуть ...

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