V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
daiv
V2EX  ›  Python

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

  •  
  •   daiv · 2013-12-09 15:19:51 +08:00 · 10414 次点击
    这是一个创建于 3791 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我用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
    18 条回复    1970-01-01 08:00:00 +08:00
    loading
        1
    loading  
       2013-12-09 15:30:41 +08:00 via iPhone   ❤️ 1
    没遇到过…我的是每天直接cp文件备份。
    真那么脆?
    daiv
        2
    daiv  
    OP
       2013-12-09 15:35:24 +08:00 via iPhone
    @loading 数据库在用的时候能这样备份?
    xiiing
        3
    xiiing  
       2013-12-09 15:46:32 +08:00   ❤️ 1
    还没遇到过。可能是我的程序比较小。
    clino
        4
    clino  
       2013-12-09 15:52:35 +08:00
    我用得不算少,还没发现这种问题
    我这里备份数据库如果是uliweb的话只要uliweb dump一下就可以了,这个也可以用来迁移到其他数据库上
    mongodb
        5
    mongodb  
       2013-12-09 15:55:37 +08:00   ❤️ 1
    too much write and no cache buffers,makes Jack a dull...
    哦说错了
    修复容易
    一般坚持用sqlite3的话,做到保证数据一次完整写入一般问题就不大……
    在进程退出前做检测嘛...
    loading
        6
    loading  
       2013-12-09 15:55:57 +08:00 via iPhone   ❤️ 1
    @daiv 我数据很小,加锁然后复制,就几秒。量大可以看官方的方式,c语言api

    http://www.sqlite.org/c3ref/backup_finish.html
    daiv
        7
    daiv  
    OP
       2013-12-09 16:03:31 +08:00   ❤️ 1
    @clino 我用 web.py了, uliweb 这个框架,国人开发的,计划14年尝试一下的
    daiv
        8
    daiv  
    OP
       2013-12-09 16:06:03 +08:00
    @mongodb 要是1G的数据库,修复起来就很烦了。系统 reboot的时候,需要检查一下 数据库是否正在写,然后再重启?
    @loading 这个备份方案,我好好看看
    clino
        9
    clino  
       2013-12-09 16:37:10 +08:00
    @daiv 1G挺大的啊,我这里最大的差不多400+M
    da_a
        10
    da_a  
       2013-12-09 19:22:52 +08:00
    我也用sqlite3 我的更小 没什么访问
    meteor
        11
    meteor  
       2013-12-09 20:23:01 +08:00
    我们公司好像也说sqlite容易被损坏.
    love
        12
    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
        13
    ms2008  
       2013-12-09 23:09:38 +08:00
    是不是没有及时释放磁盘空间?建议定期 vacuum;
    daiv
        14
    daiv  
    OP
       2013-12-10 00:25:24 +08:00
    @ms2008 没有删除数据,所以不需要 vacuum吧。
    @love 挺多人说 sqlite 比较容易顺坏
    min
        15
    min  
       2013-12-10 02:11:19 +08:00
    @love 这话说的意思应该这么理解:只要我的库文件不坏,那么我的transaction是ACID的。
    raptor
        16
    raptor  
       2013-12-10 09:04:43 +08:00
    还没碰到过sqlite库文件损坏的情况,是不是除了你的应用本身,还有别的程序在操作数据库文件?
    ms2008
        17
    ms2008  
       2013-12-10 11:32:31 +08:00
    @daiv
    这个就不清楚了,我也经常kill,但是从没有损坏过数据文件,最多就是丢失些数据咯
    ryanking8215
        18
    ryanking8215  
       2013-12-10 16:31:42 +08:00
    嵌入式设备上用的sqlite3,也有这个现象,直接断电后特别容易出来。
    修复文件系统后一般不会出现malformed,出现的话用楼主的方法修复一下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5212 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 09:34 · PVG 17:34 · LAX 02:34 · JFK 05:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.