【问题标题】:How to backup sqlite database?如何备份sqlite数据库?
【发布时间】:2014-09-04 21:34:18
【问题描述】:

正确的方法是什么? 我只是复制 .sq3 文件吗?

如果网站上有用户并且文件在被复制的同时被写入怎么办?

【问题讨论】:

标签: database sqlite backup


【解决方案1】:

sqlite3 命令行工具具有.backup dot command

您可以通过以下方式连接到您的数据库:

sqlite3 my_database.sq3

并使用以下命令运行备份点命令:

.backup backup_file.sq3

除了与数据库的交互式连接,您还可以进行备份并在之后关闭连接

sqlite3 my_database.sq3 ".backup 'backup_file.sq3'"

无论哪种方式,结果都是数据库my_database.sq3 的名为backup_file.sq3 的副本。

它不同于定期的文件复制,因为它负责处理当前在数据库上工作的所有用户。数据库上设置了适当的锁,所以备份是独占的。

【讨论】:

  • 一条线就能搞定...sqlite3 m_database.sq3 ".backup m_database.sq3.bak"
  • @mOna:这只是一种进行备份的机制。复制意味着动态传播更改(一种分布式数据库),这不会为您做。
  • @RonJohn 它实际上复制了一个文件,但它也确保了对数据库的写访问受到适当的锁的限制,因此它是原子操作,没有中间修改。
  • 您还应该指定一个超时以最小化database is locked 错误...sqlite3 source.db ".timeout 1000" ".backup backup.db"
  • @Melvyn .timeout 命令有帮助是正确的(在内部,it calls sqlite3_busy_timeout),但是对于较大的数据库,超时应该大于 1000,因为那是以毫秒为单位的时间允许在命令再次出现“数据库已锁定”错误之前进行累积。
【解决方案2】:

.backup 是最好的方法。

sqlite3 my_database .backup my_database.back

您也可以尝试使用 .dump 命令,它使您能够将整个数据库或表转储到文本文件中。如果指定了 TABLE,则仅转储匹配 LIKE 模式 TABLE 的表。

sqlite3 my_database .dump > my_database.back

使用转储和存储制作存档副本的好方法,稍后重建数据库。

sqlite3 my_database .dump | gzip -c > my_database.dump.gz
zcat my_database.dump.gz | sqlite3 my_database

也检查这个问题Do the SQLite3 .backup and .dump commands lock the database?

【讨论】:

  • 在 SQLite 3.8.2 上,.backup 不能如上所示工作(“.backup 上缺少 FILENAME 参数”)
  • 这是最好的答案。如果您在许多人使用的工作数据库上使用 .backup ,它可能无法工作,因为在某些时候数据库被锁定。因此,如果您在 CRON 中使用它,它将无法工作并且不会告诉您有错误...最好使用 .dump (始终有效)或 SQLite 提供的 API。
  • @Memristor 但是.dump 不会为其他人锁定数据库吗? FWIW,与中断的服务相比,我更喜欢失败的备份(向管理员发送邮件)。
  • 请在您的答案中修正 .backup 语法。它不需要'>'运算符
  • @Memristor 但存在锁是有原因的,即在写入过程中不转储损坏的数据库。首先发出 .timeout [ms] 可以更好地解决问题; .backup 之前的命令;这样 .backup 将在失败前等待锁定释放最多 [ms] 毫秒。
【解决方案3】:

简短的回答是

sqlite3 m_database.sq3 ".backup m_database.sq3.bak"

【讨论】:

    猜你喜欢
    • 2015-04-21
    • 1970-01-01
    • 2019-08-25
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    相关资源
    最近更新 更多