如何确保sqlite和NFS安全文件同步
我最近把我的应用程序的工作空间文件格式转换成了sqlite。为了确保在NFS(网络文件系统)上能稳定运行,我采用了一种常见的更新策略:我所有的修改都先在本地硬盘的临时位置做一个副本。只有在保存的时候,我才会把这个临时文件复制到原始文件上(可能是在NFS上)。我只在打开原始文件的时候保持对它的独占锁,这样如果其他人想打开这个文件,就会被警告说它正在被使用。
问题是:当我想把临时文件保存回原始文件时,我必须释放对原始文件的锁,这就给了其他人一个小机会去获取原始文件。
我想到了一些解决办法:
(1) 可以直接用sql把临时文件的内容倒入原始文件,也就是先删除原始文件的表,再清理原始文件,然后从临时文件中选择数据插入到原始文件。不过,我不太喜欢在NFS上对sqlite文件进行sql操作,这让我担心会出现数据损坏的问题。我这样想是不是对的?
(2) 使用一些额外的文件作为保护,防止其他人在我把临时文件复制到原始文件时插手。用文件作为互斥锁(mutex)在最好的情况下也是有问题的。我也不喜欢在应用崩溃后还有多余的文件留在那里的想法。
我在想有没有其他人有不同的解决方案。也就是说,如何在复制临时文件到原始文件的同时,确保其他应用不会趁机获取原始文件?
我使用的是python2.5,sqlalchemy 0.6.6和sqlite 3.6.20。
谢谢,
Dean
1 个回答
SQLite在使用NFS时会遇到一些问题,这主要是因为缓存和锁定机制出现了问题。如果只有你的程序在访问NFS上的文件,那就没问题了。
SQLite的备份接口就是为了帮助解决这个问题而设计的。你可以直接把备份存到NFS数据库,或者先备份到本地的临时文件,然后再复制过去。这个备份接口会处理所有的锁定和并发问题。
你可以使用APSW来访问备份接口,或者使用最新版本的pysqlite。(顺便说一下:我是APSW的作者。)