2014-09-04 24 views
50

Cách thích hợp để làm điều đó là gì? Tôi chỉ cần sao chép tệp .sq3?Làm thế nào để sao lưu cơ sở dữ liệu sqlite?

Điều gì sẽ xảy ra nếu có người dùng trên trang web và tệp đang được viết khi đang được sao chép?

+4

[SQLite có API cho điều này] (http://sqlite.org/backup.html) –

+1

Ngôn ngữ và trình điều khiển nào bạn đang sử dụng để truy cập cơ sở dữ liệu? –

+1

Tôi đang sử dụng PHP và phần mở rộng PDO – thelolcat

Trả lời

88

Công cụ dòng lệnh sqlite3 có .backup dot command.

Bạn có thể kết nối với cơ sở dữ liệu của bạn với:

sqlite3 my_database.sq3 

và chạy backup dot lệnh với:

.backup backup_file.sq3 

Thay vì kết nối tương tác với cơ sở dữ liệu, bạn cũng có thể thực hiện sao lưu và đóng kết nối sau đó với

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

Dù sao kết quả là bản sao tên là backup_file.sq3 của cơ sở dữ liệu my_database.sq3.

Nó khác với việc sao chép tệp thường xuyên vì nó xử lý mọi người dùng hiện đang làm việc trên cơ sở dữ liệu. Có các khóa thích hợp được đặt trên cơ sở dữ liệu, vì vậy bản sao lưu được thực hiện độc quyền.

+56

Bạn có thể làm tất cả trong một dòng ... 'sqlite3 m_database.sq3" .backup m_database.sq3.bak "' –

+0

@Googie: Chúng ta có thể sử dụng nó để nhân rộng không? hoặc – mOna

+3

@mOna: Đây chỉ là một cơ chế để tạo bản sao lưu. Nhân rộng có nghĩa là tuyên truyền những thay đổi trên bay (loại cơ sở dữ liệu phân tán), điều này sẽ không làm cho bạn. – Googie

-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

Vui lòng giải thích mã nào. – Ram

+0

Bạn có ngụ ý sao chép có lập trình trong cấp tệp hệ thống của tệp cơ sở dữ liệu không? – atas

+8

Xin vui lòng không làm điều này ... –

0

Đối với real-time backup (sao chép chỉ các trang sửa đổi), bạn có thể sử dụng litereplica.

Thực hiện sao chép cơ sở dữ liệu một hướng với hỗ trợ khôi phục điểm trong thời gian, vì vậy nếu một bản ghi hoặc bảng vô tình bị xóa, chúng tôi có thể khôi phục db (bản chính hoặc bản sao) về một số điểm trước khi sự cố xảy ra.

Bản sao lưu được cập nhật sau mỗi giao dịch sao cho nếu xảy ra lỗi trong máy chính, bạn có bản sao lưu được cập nhật ở điểm cuối khác.

Ở phía bên chủ ứng dụng sẽ mở db sử dụng một URI được sửa đổi như sau:

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

Và trong bản sao/bên sao lưu bạn phải có một ứng dụng đang chạy để nhận các bản cập nhật. Ứng dụng này sẽ mở ra các bản sao db sử dụng một URI như thế này:

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

Để kích hoạt Point-in-Time phục hồi chúng ta phải thêm một số thông số để tên file URI, Eg .:

&pitr=on&pitr_limit=200M 

Nó có thể được kích hoạt trong db chính như trong bản sao lưu/bản sao.

Và để cho phép mã hóa (cơ sở dữ liệu và thông tin liên lạc), chúng tôi thêm một cái gì đó như:

&cipher=chacha20&key=your_key_here 
0

.backup là cách tốt nhất.

sqlite3 my_database .backup > my_database.back 

bạn cũng có thể thử .dump, Dump cơ sở dữ liệu ở định dạng văn bản SQL, Nếu TABLE chỉ định, chỉ đổ bảng phù hợp với mẫu TABLE LIKE.

sqlite3 my_database .dump > my_database.back 
+0

Trên SQLite 3.8.2, '.backup' không hoạt động như được hiển thị ở trên (" thiếu đối số FILENAME trên .backup ") –

Các vấn đề liên quan