2009-11-20 1 views
1

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

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

Для управления резервными копиями в этом каталоге вы бы рекомендовали использовать Subversion с помощью процесса cron? Одной из причин, по которой я рассматриваю этот подход, является то, что пользователи смогут легко откатить отредактированное рабочее пространство.

ответ

0

Являются ли файлы базы данных SQLite ясными текстовыми или двоичными? Если они двоичные, я не думаю, что вам очень полезно использовать Subversion (поскольку IMHO он не должен использоваться как резервная система).

Вместо этого, если вы хотите разрешить им восстанавливать более старую версию, используйте обычный механизм резервного копирования (rsync или т. П.) И сохраняйте ежедневную резервную копию в течение определенного периода времени (в зависимости от ваших фактических требований). Если они хотят, чтобы восстановить предыдущую версию они могут подойти к вам, и вы играете его обратно в

3

Если вы можете запустить свои собственные сценарии оболочки можно сбросить все базы данных в обычный файл SQL:.

# sqlite3 user.db .dump .exit > user.sql

а затем вы можете сохранить файл SQL в Subversion репозиторий

Создание базы данных обратно из SQL файла:

# sqlite3 -init user.sql user.db .exit

2

Многие из этих баз данных создаются и редко, если вообще редактируются.

Если это так, то вы не получите большую выгоду от Subversion. Это система управления версиями, а не система резервного копирования. Вы не захотите выполнять операции контроля версий, такие как diff, merge и т. Д., Поэтому я думаю, что вы получите лучший пробег из традиционного метода резервного копирования. Сжимайте файлы sqlite (насколько это возможно) и архивируйте их в течение определенного периода времени. Если вы используете это в системе Linux, вы можете посмотреть сценарии резервного копирования, такие как скрипты logrotate, которые делают то же самое для системных журналов. Поскольку базы данных sqlite хороши и чисто упакованы в один файл, восстановление старой версии может быть легко написано (просто сжимайте и скопируйте в нужное место).

В зависимости от того, сколько данных каждый пользователь хранит в своей базе данных, еще одной альтернативой является сохранение теневых копий таблиц в вашем репозитории. Когда происходит изменение, копия делается из старой таблицы до ее изменения. Таким образом, вы можете сохранить копию предыдущей (или даже последней) версии (ов) в базе данных и восстановить их с помощью простой операции с базой данных, вместо того, чтобы выкапывать старые резервные копии. Это также позволяет отменить изменения в части базы данных, не возвращая все это.

1

1 вещь, которую вы могли бы сделать:
* Всегда экспортируйте свою базу данных в файл sql во время разработки.
* Преобразование файла sql в файл базы данных либо в пользовательской задаче MSBuild, либо при любом удобном шаге инициализации при запуске приложения.
* Для того, чтобы импортировать файл SQL обратно в файл базы данных, вы можете использовать C#, похожий на:

  string sql = System.IO.File.ReadAllText(SqlFile); 
      SQLiteConnection.CreateFile(DatabaseFile); 

      string ConnectionString = @"Data Source=" + DatabaseFile; 

      using (SQLiteConnection cn = new SQLiteConnection(ConnectionString)) 
      { 
       using (SQLiteCommand cmd = new SQLiteCommand(sql, cn)) 
       { 
        cn.Open(); 
        cmd.ExecuteNonQuery(); 
       }//cmd 
      }//cn 

Таким образом, вы можете просто держать вас SQL файлы в SVN, что позволяет иметь редактируемые объединяемые файлы и просто генерировать файлы bin db на лету либо в процессе сборки, либо при запуске приложения.

Если вы решили создать двоичный файл db при запуске приложения, вы также можете сделать его базой данных в памяти, если ваше приложение не имеет достаточных разрешений для записи на диск. ваша строка подключения должна быть следующей:

Источник данных =: память:; Версия = 3; New = True;