2014-12-05 5 views
1

Я ищу подходящее решение для ежедневной резервной копии базы данных sqlite. База данных составляет около 5 ГБ, постоянно растет, получает новые данные каждую секунду и в режиме WAL. Служба 24/7, поэтому нет способа остановить что-либо во время резервного копирования. Блокировка БД на несколько секунд (минут) может быть возможной, хотя и проверяется. Цель состоит не в том, чтобы иметь самые последние данные в резервной копии, а во избежание потери слишком больших данных в случае серьезного сбоя. Резервное копирование будет выполняться, по крайней мере, в течение дня и, возможно, чаще, если это не займет слишком много времени.Альтернативное решение для резервного копирования SQlite

  • Я попробовал .backup команду, но передача базы данных крайне медленно (всего несколько мегабайт через 10 минут, все еще очень далеки от завершения, после 3-х часов) - это, вероятно, из-за постоянной записи Мероприятия.

  • Я пробовал команду .dump. Это хорошо работает, за исключением попыток восстановления данных (с помощью .read). Такой большой запрос (около 10 ГБ файла .sql) потребляет всю ОЗУ в системе и убивается ОС (Linux).

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

  • Я также рассматриваю возможность интеграции процедуры резервного копирования в код доступа к этой БД, но опять же, я хотел бы, чтобы процедура резервного копирования была независимой. Я также не понимаю, почему это решение было быстрее, чем команда «.backup».

Любое предложение, кроме «добавить некоторую ОЗУ»?

Спасибо.

ответ

0

API резервного копирования SQLite перезапускается, когда обнаруживает, что DB был изменен. (В оболочке sqlite3 эта проверка выполняется каждые 100 страниц.)

В режиме WAL считыватели не блокируют запись, поэтому было бы неважно делать резервную копию, читая всю базу данных без перезапуска. Напишите свою собственную программу резервного копирования, которая просто вызывает sqlite3_step один раз для всех страниц БД (см. API example).

1

@CL: спасибо за ответ. Я полностью пропустил перезапуск API резервного копирования.

В случае, если это приносит пользу другим: я дал решение LVM, и он работает очень хорошо. Вкратце:

  • создание/установка моментального снимка логического тома, на котором размещаются файлы DB.
  • используйте командную строку sqlite .backup - или просто скопируйте файл (ы) из моментального снимка.
  • отключить/удалить снимок.
  • делать то, что вам нужно сделать с копией/резервной копией БД.

конденсированной "как использовать LVM" доступен здесь: http://www.howtogeek.com/howto/40702/how-to-manage-and-use-lvm-logical-volume-management-in-ubuntu/