当前位置: 代码迷 >> 其他数据库 >> SQLite 数据库copy有关问题
  详细解决方案

SQLite 数据库copy有关问题

热度:99   发布时间:2016-05-05 08:17:22.0
SQLite 数据库copy问题
对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种改变日志文件行为的方法 中的内容
  相关解决方案