2014-09-04 109 views
50

做什么是正确的方法? 我只是复制.sq3文件?如何备份sqlite数据库?

如果网站上有用户,并且文件正在被复制,该怎么办?

+4

[SQLite的有一个API为这个(http://sqlite.org/backup.html) – 2014-09-04 23:47:37

+1

什么语言和驱动程序是您使用访问数据库? – 2014-09-05 07:28:52

+1

我使用PHP和PDO扩展 – thelolcat 2014-09-05 21:46:21

回答

88

sqlite3命令行工具功能.backup dot command

您可以连接到数据库:

sqlite3 my_database.sq3 

,并运行备份点命令:

.backup backup_file.sq3 

而是到数据库的交互连接的,你也可以做备份和然后关闭连接

sqlite3 my_database.sq3 ".backup 'backup_file.sq3'" 

无论哪种方式,结果是副本名为backup_file.sq3的数据库my_database.sq3

这与定期进行文件复制有所不同,因为它负责处理当前在数据库中工作的任何用户。在数据库上设置了适当的锁,因此备份是专门完成的。

+56

你可以做到这一切一行...'sqlite3 m_database.sq3“.backup m_database.sq3.bak”' – 2014-09-07 18:02:48

+0

@Googie:我们可以用它来复制吗?或 – mOna 2016-10-18 07:48:10

+3

@mOna:这只是一个制作备份的机制。复制意味着即时传播更改(分布式数据库的种类),这不会为您做。 – Googie 2016-10-19 08:22:13

-11
try { 
    final String inFileName = "/data/data/your app package/databases/db"; 
    File dbFile = new File(inFileName); 
    FileInputStream fis = new FileInputStream(dbFile); 
    String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/CALC/Backup"; 
    File dir = new File(path); 
    if (!dir.exists()) dir.mkdirs(); 
    String outFileName = path + "/filename"; // output file name 
    // Open the empty db as the output stream 
    OutputStream output = new FileOutputStream(outFileName); 

    // Transfer bytes from the inputfile to the outputfile 
    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = fis.read(buffer)) > 0) { 
     output.write(buffer, 0, length); 
    } 
    Toast.makeText(getActivity(), "Backup Successfully", 2).show(); 
    // Close the streams 
    output.flush(); 
    output.close(); 
    fis.close(); 
} 
catch (Exception e) { 
    e.printStackTrace(); 
} 
+2

请解释一下代码的作用。 – Ram 2015-07-10 13:24:34

+0

您是否暗示以数据库文件的文件系统级别进行编程复制? – atas 2015-07-17 08:29:42

+8

请不要这样做...... – 2016-04-28 22:12:37

0

对于实时增量备份(仅复制修改的页面),您可以使用litereplica

它实现了单向数据库复制,支持时间点恢复,所以如果一个记录或表被意外删除,我们可以将数据库(主数据库或副本数据库)还原到问题出现之前的某个时间点。

备份在每次事务处理后都会更新,因此如果主机发生故障,您在另一个端点中有更新的备份。

在主机侧的应用程序将打开使用修改的URI分贝,就像这样:

“file:/path/to/main.db?replica=master&slave=tcp://my.server.ip:1234” 

而且你必须有一个运行的应用程序,以接收更新的副本/备份的一面。这个程序将打开副本DB使用URI是这样的:

“file:/path/to/copy.db?replica=slave&bind=tcp://0.0.0.0:1234” 

要启用即时点时间恢复,我们必须添加一些参数到URI的文件名,例如:

&pitr=on&pitr_limit=200M 

它可以在主数据库中启用,如在备份/副本中一样。

并启用加密(数据库和通信),我们添加类似:

&cipher=chacha20&key=your_key_here 
0

是的.backup最好的方式。

sqlite3 my_database .backup > my_database.back 

,你也可以尝试使用.dump,转储数据库中的SQL文本格式,如果指定的表,只转储表匹配LIKE模式表。

sqlite3 my_database .dump > my_database.back 
+0

在SQLite 3.8.2上,'.backup'不能像上面显示的那样工作(“在.backup上缺少FILENAME参数”) – 2017-10-18 09:11:10