如何备份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(); }