如何备份sqlite数据库?

什么是正确的方法来做到这一点? 我只是复制.sq3文件?

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

sqlite3命令行工具具有.backup dot命令 。

您可以通过以下方式连接到数据库:

 sqlite3 my_database.sq3 

并用以下命令运行backup dot命令:

 .backup backup_file.sq3 

除了与数据库的交互式连接外,您还可以执行备份,然后closures连接

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

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

这与定期进行文件复制不同,因为它负责处理当前在数据库上工作的任何用户。 在数据库上设置了正确的锁,所以备份是独占的。

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

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

备份在每个事务之后都会更新,所以如果主机发生故障,您在另一个端点上有更新的备份。

在主端,应用程序将使用修改后的URI打开数据库,如下所示:

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

而在副本/备份方面,你必须有一个正在运行的应用程序来接收更新。 这个应用程序将打开复制数据库使用这样的URI:

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

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

 &pitr=on&pitr_limit=200M 

它可以在主数据库中作为备份/副本启用。

为了启用encryption(数据库和通信),我们添加如下内容:

 &cipher=chacha20&key=your_key_here 

.backup是最好的方法。

 sqlite3 my_database .backup > my_database.back 

您也可以尝试.dump,以SQL文本格式转储数据库,如果指定了TABLE,则只转储与LIKE模式TABLE匹配的表。

 sqlite3 my_database .dump > my_database.back 
 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(); }