2012-06-05 44 views
6

Tôi có cơ sở dữ liệu sqlite trên máy chủ cục bộ của mình (Win NT) và muốn sao lưu nó. Tôi muốn sử dụng lệnh shell '.backup' để thực hiện tác vụ này. Nhưng có vẻ như tôi có thể chèn một hàng mới vào cơ sở dữ liệu trong quá trình sao lưu.lệnh sqlite3 shell '.backup' và giao dịch

Lệnh shell '.backup' có bắt đầu giao dịch độc quyền mới trên cơ sở dữ liệu của tôi không?

Tôi nghĩ khi tôi thực thi lệnh shell '.backup', nó sẽ khóa cơ sở dữ liệu của tôi.

Trả lời

3

Phương thức sao lưu sqlite3 không khóa cơ sở dữ liệu. Tôi sẽ đề nghị sử dụng workaround sau đây nếu bạn muốn khóa cơ sở dữ liệu:

  • Bắt đầu một giao dịch (chia sẻ khóa)
  • Bằng cách sử dụng bất kỳ tuyên bố INSERT, cơ sở dữ liệu nhận được một khóa dành riêng. Tuy nhiên, câu lệnh INSERT này có thể trống.
  • Sao lưu cơ sở dữ liệu.
  • Kết thúc giao dịch bằng cách sử dụng ROLLBACK hoặc COMMIT.

Code:

BEGIN; 
INSERT INTO <anytable> SELECT * FROM <anytable> WHERE 1=0; 
.backup <database> <file> 
ROLLBACK; 

Một cách ít hacky sẽ là nếu bạn đang sử dụng một bảng có tên là 'backup' và bạn đang chèn liên tiếp (ngày, ..) cho mỗi bản sao (nếu thông tin này phù hợp với bạn).