2014-09-04 436 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