sqlite 3 很容易被破坏呀,有没有解决办法?

2013-12-09 15:19:51 +08:00
 daiv
我用python,所以喜欢自带的sqlite 3,轻便,简单。

最近用多了,才发现,sqlite容易被损坏,例如程序突然被Kill,或者系统重启,都有可能。
不管有没有事务,都会有被破坏的可能性。
“Database disk image is malformed”
当然有修复办法,很麻烦,而且文件大了更麻烦。

所以问问大家,有没有这方面的经验,让我也学习一下

=== ===
PS:
sqlite3写数据的时候,有锁。比较直接的解决方案是,采用ssd硬盘,这样写入速度特别快,基本不影响读取了,有锁也是偶尔的了。

PS:
网上找的修复办法,有用。
sqlite3 old.db(注:损坏的db文件)
.output tmp.sql
.dump
.quit
然后读取数据到新的db
sqlite3 new.db
.read tmp.sql
.quit
10423 次点击
所在节点    Python
18 条回复
loading
2013-12-09 15:30:41 +08:00
没遇到过…我的是每天直接cp文件备份。
真那么脆?
daiv
2013-12-09 15:35:24 +08:00
@loading 数据库在用的时候能这样备份?
xiiing
2013-12-09 15:46:32 +08:00
还没遇到过。可能是我的程序比较小。
clino
2013-12-09 15:52:35 +08:00
我用得不算少,还没发现这种问题
我这里备份数据库如果是uliweb的话只要uliweb dump一下就可以了,这个也可以用来迁移到其他数据库上
mongodb
2013-12-09 15:55:37 +08:00
too much write and no cache buffers,makes Jack a dull...
哦说错了
修复容易
一般坚持用sqlite3的话,做到保证数据一次完整写入一般问题就不大……
在进程退出前做检测嘛...
loading
2013-12-09 15:55:57 +08:00
@daiv 我数据很小,加锁然后复制,就几秒。量大可以看官方的方式,c语言api

http://www.sqlite.org/c3ref/backup_finish.html
daiv
2013-12-09 16:03:31 +08:00
@clino 我用 web.py了, uliweb 这个框架,国人开发的,计划14年尝试一下的
daiv
2013-12-09 16:06:03 +08:00
@mongodb 要是1G的数据库,修复起来就很烦了。系统 reboot的时候,需要检查一下 数据库是否正在写,然后再重启?
@loading 这个备份方案,我好好看看
clino
2013-12-09 16:37:10 +08:00
@daiv 1G挺大的啊,我这里最大的差不多400+M
da_a
2013-12-09 19:22:52 +08:00
我也用sqlite3 我的更小 没什么访问
meteor
2013-12-09 20:23:01 +08:00
我们公司好像也说sqlite容易被损坏.
love
2013-12-09 21:13:04 +08:00
我sqlite用得不多,不过看sqlite的官网features第一条就是:

Transactions are atomic, consistent, isolated, and durable (ACID) even after system crashes and power failures.

这不是说sqlite在任意情况下的crash都不会引起文件损坏的吗?
ms2008
2013-12-09 23:09:38 +08:00
是不是没有及时释放磁盘空间?建议定期 vacuum;
daiv
2013-12-10 00:25:24 +08:00
@ms2008 没有删除数据,所以不需要 vacuum吧。
@love 挺多人说 sqlite 比较容易顺坏
min
2013-12-10 02:11:19 +08:00
@love 这话说的意思应该这么理解:只要我的库文件不坏,那么我的transaction是ACID的。
raptor
2013-12-10 09:04:43 +08:00
还没碰到过sqlite库文件损坏的情况,是不是除了你的应用本身,还有别的程序在操作数据库文件?
ms2008
2013-12-10 11:32:31 +08:00
@daiv
这个就不清楚了,我也经常kill,但是从没有损坏过数据文件,最多就是丢失些数据咯
ryanking8215
2013-12-10 16:31:42 +08:00
嵌入式设备上用的sqlite3,也有这个现象,直接断电后特别容易出来。
修复文件系统后一般不会出现malformed,出现的话用楼主的方法修复一下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/92404

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX