3
A
回答
1
根据数据库的大小,连续轮询和生成校验和可能对机器来说过于密集。
您是否考虑过监视操作系统文件系统上存储的上次修改元数据?
6
根据http://www.sqlite.org/fileformat.html SQLite3在数据库文件的字节24..27
中维护file change counter
。它是独立的文件更改时间,其中,例如,可以二进制后更改,而没有任何改变都恢复或回滚:
$ sqlite3 test.sqlite 'create table test (test)'
$ od --skip-bytes 24 --read-bytes=4 -tx1 test.sqlite | sed -n '1s/[^[:space:]]*[[:space:]]//p' | tr -d ' '
00000001
$ sqlite3 test.sqlite "insert into test values ('hello world');"
$ od --skip-bytes 24 --read-bytes=4 -tx1 test.sqlite | sed -n '1s/[^[:space:]]*[[:space:]]//p' | tr -d ' '
00000002
$ sqlite3 test.sqlite "delete from test;"
$ od --skip-bytes 24 --read-bytes=4 -tx1 test.sqlite | sed -n '1s/[^[:space:]]*[[:space:]]//p' | tr -d ' '
00000003
$ sqlite3 test.sqlite "begin exclusive; insert into test values (1); rollback;"
$ od --skip-bytes 24 --read-bytes=4 -tx1 test.sqlite | sed -n '1s/[^[:space:]]*[[:space:]]//p' | tr -d ' '
00000003
为了真正确保两个数据库文件都是“平等”的只能是你转储文件后(.dump
),将输出减少到INSERT
语句并对结果进行排序以进行比较(可能通过一些加密安全校验和)。但这太简单了。
1
如果其中一个sqlite数据库仅用作副本(只读),并且您想要检查原始数据库文件是否已更新,以便您可以更新副本(例如从Web上进行更新,而无需下载那么你可以比较两个数据库文件(数据库头文件)的前100个字节http://www.sqlite.org/fileformat.html
对于数据库头的字节24..27,SQlite doc说:
24..27 4
文件更改计数器。每一个数据库事务提交时,存储在这一领域的32位无符号整数的值增加
看来,当一个数据库事务提交的文件更改计数器不增加,但只有经过一些测试包含select语句,这是您在事务中包装选择并提交结束事务时所需的行为。
相关问题
- 1. SQLite校验其数据吗?
- 2. Sqlite中的校验和计算表
- 3. 根据数据扭转校验和
- 4. Liquibase - 校验和因不同的数据库供应商而异
- 5. Fletchers16校验和适合小数据吗?
- 6. 从MD5校验和中提取数据
- 7. 数据库并发性 - 校验和vs时间戳
- 8. Visual Studio数据库单元测试 - 校验和
- 9. Elixir中CRC16校验和的库
- 10. maven:“校验和校验失败,没有可用的校验和”,为什么?
- 11. Jquery校验和
- 12. Laravel数据库字符集和校对
- 13. SQLite数据库和Python
- 14. Android ExpandableListView和SQLite数据库
- 15. SQLite数据库和语言
- 16. Android SQLite数据库和SharedPreferences
- 17. AsyncTask和SQLite数据库
- 18. Monotouch和sqlite数据库
- 19. sqlite数据库锁定后校园帐户
- 20. 使用校验和标记共享库
- 21. Adler32和MD4的校验和
- 22. HDFS中的数据完整性:哪些数据节点验证校验和?
- 23. IPV4头校验和验证
- 24. 数据库SQLite的
- 25. 如何验证我的数据库中存在的数据sqlite
- 26. 校验和VBScript中
- 27. MD5/SHA1校验和
- 28. 校验和计算
- 29. 增量校验和
- 30. OpenSSL SHA1校验和
+1以我没有想到的方式使用od。 – 2011-02-17 13:25:08