对sqlite 数据不是很熟悉,拜托大家帮忙回答。
现有
123.db,123.db-journal;知道123.db-journal是个临时文件,现在需要copy这个123.db数据库的完整的内容,就是也需要copy 123.db-journal的内容,但是由于undo,redo,需要这个journal文件,我不能直接commit掉这个数据,那么现在我该怎么去做,才能copy出完成数据。
------解决方案--------------------
没有明白
journal是一个不同于数据库文件的另一个文件,它在事务开始时创建,当事务结束时就删除了
------解决方案--------------------
没有办法。 你必须先提交。
------解决方案--------------------
这个没办法,这个LOG文件 journal 是写在 123_BAK.db 的数据文件中的。你需要研究一下SQLITE的源代码,然后直接修改 123_BAK.db 对应的位置的文件名。
------解决方案--------------------
转
Rollback journals
回滚日志文件,用于实现数据库的原子提交和回滚。 此文件和数据库文件总是在同一个目录,并且有相同的文件名,但是在文件名中添加了一个-journal 字符串。此文件一般在transaction开始时创建,transaction结束时删除。
如果系统crash,Rollback journals文件将被保留,下次打开数据库文件时,系统会检查有没有Rollback journals文件存在,如果有就用它来恢复数据库。
2种改变日志文件行为的方法
(1)PRAGMA locking_mode=EXCLUSIVE; 日志文件在第一个transaction开始时创建,但是不被删除,直到exclusive access mode is exited。
(2)修改journaling mode pragma的值,
相关命令
sqlite3>PRAGMA journal_mode;
sqlite3>PRAGMA database.journal_mode;
sqlite3>PRAGMA journal_mode = DELETE
------解决方案--------------------
TRUNCATE
------解决方案--------------------
PERSIST
------解决方案--------------------
MEMORY
------解决方案--------------------
WAL
------解决方案--------------------
OFF
sqlite3>PRAGMA database.journal_mode = DELETE
------解决方案--------------------
TRUNCATE
------解决方案--------------------
PERSIST
------解决方案--------------------
MEMORY
------解决方案--------------------
WAL
------解决方案--------------------
OFF
几个解释
(1)DELETE(默认值), 跟上面描述的一样,transaction结束时删除Rollback journals文件。
(2)TRUNCATE, transaction commit后不是delete ,而是truncate Rollback journals文件长度=0,在有些系统上truncate文件比delete快。
(3)PERSIST,不删除也不truncate,只讲文件头中长度设置为0
(4)MEMORY,将rollback journal存在volatile RAM内存中,避免了磁盘I/O, 牺牲了安全性和完整性,如果系统crash,数据库文件可能也crash
(5)WAL, 用write-ahead log代替rollback journal 来实现transactions atomic. A database in WAL journaling mode can only be accessed by SQLite version 3.7.0 or later.
更多关于WAL的可看这个连接 http://www.sqlite.org/wal.html
------解决方案--------------------
没有 ,要看看SQLITE的源码
参考一下 2种改变日志文件行为的方法 中的内容