2015-01-25 4 views
0

В настоящее время я работаю над проектом C, который содержит базу данных SQLite3 с включенной поддержкой WAL. У нас есть веб-интерфейс HTTP, над которым вы сможете получить онлайн-резервное копирование базы данных. В настоящее время файл базы данных доступен по HTTP, что плохо по многим причинам. Теперь моя задача - реализовать новый алгоритм резервного копирования.Резервное копирование базы данных SQLite3 при встраивании

Существует API-интерфейс SQLite-Online-Backup, который кажется довольно приятным. Там вы открываете два подключения к базе данных и копия одна база данных в другую. Во всяком случае, в моей настройке я не могу быть уверен, что достаточно места для копирования всей базы данных, поскольку в ней может быть много статистических и мультимедийных файлов. Для меня лучшим решением было бы открыть соединение SQLite, которое напрямую связано с stdout, чтобы я мог создавать резервные копии базы данных через CGI.

В любом случае, я не нашел способ в SQLite3 API открыть соединение с базой данных в специальных файлах, таких как stdout. Что было бы лучшей практикой для резервного копирования базы данных? Как выполнять онлайн-резервное копирование баз данных SQLite3?

Заранее благодарен!

ответ

0

Если вам нужен специальный целевой интерфейс для резервного копирования, вы можете реализовать свой собственный интерфейс VFS, который сделает все, что вам нужно. См. Параметры для sqlite3_open_v2(), где вы можете передать имя VFS. (см https://www.sqlite.org/c3ref/vfs.html Подробную информацию о VFS и интерфейс ОС используется SQLite)

В основном каждый sqlite3_backup_step() вызов будет писать некоторые блоки данных, и вы должны были бы передать тех целевой базы данных в некотором роде.

+0

Нет специального резервного интерфейса, я просто хочу, чтобы база данных была сброшена на stdout (например, когда я делаю HTTP-загрузку файла базы данных, но с контролем доступа и целостностью базы данных). Реализация моего собственного интерфейса VFS кажется немного переборщиком. Было бы неплохо установить блокировку записи, выполнить контрольную точку WAL и затем выгрузить файл базы данных? – Jeremy

+0

Самый простой способ - использовать инструмент командной строки sqlite3 (или код из него), использовать команду '.dump', которая записывает на stdout и просто считывает эти данные с другой стороны. Наверное, это не самый эффективный способ. (см. https://www.sqlite.org/cli.html) – schlenk

+0

Возможно, вы можете заставить его работать с чем-то вроде «режима редактирования pragma journal», получить эксклюзивную блокировку и скопировать файл базы данных и вернуться к «WAL», Режим. Тем не менее, не 100%. – schlenk