Rsync / Sqlite数据库

有没有人曾经尝试rsync'ing sqlite数据库?

数据同步时可以访问数据吗?

我会认为这是危险的。

SQLite数据库也有需要保留的日志文件。

如果你

  • rsync数据库没有在事务中间的日志文件
  • 复制数据库文件
  • 访问副本

你很可能会遭受腐败。

改用SQLite的在线备份API 。

假设你想通过shell命令来做到这一点,你可以做一些事情:

ssh user@host 'sqlite3 "/path/to/db.sqlite" ".backup /path/to/dbbackup.sqlite"' rsync user@host:"/path/to/dbbackup.sqlite" "db.sqlite" 

首先,安全地创build现有数据库的备份,然后将其复制到您自己的机器上的“db.sqlite”。

挪亚指出,这是危险的。 你的数据库将被损坏。

您可以改用litereplica库。

它完成了所有关于正常SQLite事务的幕后工作。 并增量(只有更改的页面被传送)。

或者rqlite库。

最后一个需要安装Go语言。

不,sqlite数据库默认情况下并不总是一致的。 但是,search“sqlite复制文件”已经find了一个与SQLite进行在线备份的页面,我怀疑这个页面会涵盖所有您可能遇到的问题。

以前的答案是正确的。

但是,如果你100%确定你的数据库只有读取活动,你可以安全地采取任何一种数据库文件的副本。 我已经在一个没有问题的生产应用程序(cp,tar,rsync,scp,sftp)中完成了这个工作。 数据库文件只能在操作系统级(chmod aw)设置为只读,而数据库写入尝试会给出错误

 Error: attempt to write a readonly database 

而所有select正常工作。

那么当然,这种方法对于你的申请可能也可能不可行。 可以使用相同的方法来防止未经授权的写入,如Web应用程序上的SQL注入。

  • 当没有事务打开时,数据库的rsync将会正常。

  • 在事务处于打开状态时,数据库的rsync将导致损坏。 原因:您将在稍微不同的时间点获取数据库及其随附的日志文件,打破SQLite将日志与数据库进行协调的一致性。 如果SQLite无法协调日志与数据库,那么数据库将处于不一致的状态,无法告诉部分应用事务的部分内容。

为了能够同步SQLite数据库,您将需要:

  • 使用SQLite自己的CLI命令来创build数据库文件的备份副本。 这将等待获得写入locking,并复制文件,然后释放写入locking,从而确保没有事务部分应用。 然后,rsync复制。

     .backup ?DB? file 
  • 或者,在进行rsync的同时,使用SQLite数据库closures所有进程。