Làm thế nào để sao lưu cơ sở dữ liệu sqlite?


93

Cách thích hợp để làm điều đó là gì? Tôi chỉ sao chép tệp .sq3?

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



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

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

Hiện nay là một yêu cầu tính năng để lộ API backup sql trong php: bugs.php.net/bug.php?id=70950
Brian Minton

Câu trả lời:


152

Công cụ dòng lệnh sqlite3 có tính năng .backuplệnh dot .

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

sqlite3 my_database.sq3

và chạy lệnh dấu chấm sao lưu 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ể sao lưu và đóng kết nối sau đó với

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

Dù bằng cách nào thì kết quả là một bản sao có tên backup_file.sq3củ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ó chăm sóc bất kỳ người dùng nào hiện đang làm việc trên cơ sở dữ liệu. Có các khóa thích hợp được thiết lập trên cơ sở dữ liệu, vì vậy việc sao lưu được thực hiện độc quyền.


68
Bạn có thể làm tất cả trong một dòng ...sqlite3 m_database.sq3 ".backup m_database.sq3.bak"
Đánh dấu Setchell

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

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

Cảm ơn vì đã trả lời :)
mOna 19/10/16

1
@RonJohn Nó thực sự tạo ra một bản sao của một tệp, nhưng nó cũng bảo đảm rằng quyền truy cập ghi vào cơ sở dữ liệu bị hạn chế với các khóa thích hợp, vì vậy đó là một hoạt động nguyên tử, không có sửa đổi trung gian.
Googie

5

. sao lưu là cách tốt nhất.

sqlite3 my_database .backup my_database.back

bạn cũng có thể thử lệnh .dump, nó cung cấp cho bạn khả năng kết xuất toàn bộ cơ sở dữ liệu hoặc các bảng vào một tệp văn bản. Nếu TABLE được chỉ định, chỉ kết xuất các bảng phù hợp với BẢNG mẫu LIKE.

sqlite3 my_database .dump > my_database.back

Một cách tốt để tạo một bản sao lưu trữ bằng cách sử dụng kết xuất và lưu trữ, Hãy xây dựng lại cơ sở dữ liệu sau đó.

sqlite3 my_database .dump | gzip -c > my_database.dump.gz
zcat my_database.dump.gz | sqlite3 my_database

Cũng kiểm tra câu hỏi này Các lệnh SQLite3 .backup và .dump có khóa cơ sở dữ liệu không?


4
Mở SQLite 3.8.2, .backupkhông hoạt động như trình bày ở trên ( "thiếu đối số FILENAME trên .backup")
Francesc Rosas

4
Đây là câu trả lời tốt nhất. Nếu bạn đang sử dụng .backup trên một cơ sở dữ liệu đang hoạt động được nhiều người sử dụng, nó có thể không hoạt động vì tại một số điểm cơ sở dữ liệu bị khóa. Vì vậy, nếu bạn đang sử dụng cái này trong CRON, nó sẽ không hoạt động và sẽ không cho bạn biết có lỗi ... tốt hơn hãy sử dụng .dump (mọi cách đều hoạt động) hoặc API do SQLite cung cấp.
Memristor

@Memristor Nhưng .dump không khóa DB cho những người khác? FWIW, tôi muốn sao lưu không thành công (với thư cho quản trị viên) hơn là một dịch vụ bị gián đoạn.
Torsten Bronger

1
Vui lòng sửa cú pháp .backup trong câu trả lời của bạn. Nó không cần toán tử '>'
Nashev

-23
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();
}

Bạn đang ngụ ý sao chép theo chương trình ở cấp hệ thống tệp của tệp cơ sở dữ liệu?
Andreas Tasoulas

4
1. Bạn thậm chí không nói mã này là ngôn ngữ gì. OP cho biết anh ta đang sử dụng PHP nhưng đây có vẻ là mã java. 2. Bạn sao chép từng byte một tệp. Làm như vậy có lợi gì? Java (và php) có các phương thức để sao chép tệp. Đọc docs.oracle.com/javase/tutorial/essential/io/copy.html 3. Điều này không giải quyết vấn đề mà db có thể được ghi trong khi bạn sao chép nó.
Christopher K.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.