Có thể nhanh chóng tạo / khôi phục ảnh chụp nhanh cơ sở dữ liệu với PostgreSQL không?


52

Trước hết, tôi là nhà phát triển, không phải DBA hay sysadmin; làm ơn dịu dàng :)

Tôi đang làm việc trên một quy trình làm việc của ứng dụng trong đó một hành động của người dùng sẽ kích hoạt các thay đổi phức tạp trong cơ sở dữ liệu - tạo hàng trăm bản ghi trong một số bảng, cập nhật hàng trăm bản ghi trong các bảng khác, v.v. Tất cả, khoảng 12 bảng (trong số ~ 100 bảng ) bị xúc động bởi hành động này. Do sự phức tạp, tôi rất khó có thể hoàn nguyên thủ công tất cả các thay đổi trước khi tôi có thể chạy thử nghiệm khác. Trong phần lớn thời gian phát triển của mình, tôi chỉ có thể chèn câu lệnh "ROLLBACK" gần cuối quy trình làm việc, nhưng khi tôi đến gần để cam kết các thay đổi của mình, tôi cần kiểm tra thực tế.

Tôi có một bản sao cục bộ của cơ sở dữ liệu sản xuất để làm việc. Trong trường hợp của tôi, việc bán phá giá và khôi phục giữa các bài kiểm tra nhanh hơn so với việc viết một tập lệnh để hoàn tác tất cả các thay đổi. Nó nhanh hơn, nhưng nó vẫn làm tôi chậm đi rất nhiều (quá trình khôi phục mất khoảng 20 phút trên máy tính xách tay cũ của tôi). Có cách nào để tôi có thể lưu ảnh chụp nhanh về trạng thái hiện tại của cơ sở dữ liệu và sau đó nhanh chóng khôi phục nó không?

Tôi được đảm bảo là người dùng duy nhất trên hệ thống và tôi có quyền truy cập root. Kết xuất cơ sở dữ liệu là ~ 100MB khi tar'ed và gzip'ed. Phiên bản PostgreSQL là 8.3.

Cảm ơn trước cho bất kỳ ý tưởng hữu ích.


Bạn nói rằng bạn có kết xuất cơ sở dữ liệu, điều đó là không đủ? Kiểm tra hệ thống của bạn, nếu có lỗi xảy ra, hãy sử dụng kết xuất để đưa DB trở lại trạng thái ban đầu và tiếp tục phát triển.
DrColossos

1
Bạn đang khôi phục chỉ các bảng đã thay đổi?
Jack Douglas

1
@Jack Douglas: Tôi đang khôi phục DB hoàn chỉnh từ bãi chứa. Các bảng trong câu hỏi chiếm khoảng 2/3 dữ liệu và tôi vẫn phải lo lắng về thứ tự khôi phục chính xác và hạn chế khóa ngoại.
Zilk

1
@DrColossus: có, các bãi chứa đủ để khôi phục trạng thái trước đó, nhưng việc tạo và áp dụng chúng rất chậm.
Zilk

Câu trả lời:


35

Bạn có thể sử dụng ảnh chụp nhanh ở cấp hệ thống tệp, nhưng thường khá cồng kềnh, cần hệ thống tệp đặc biệt và không phải lúc nào cũng có sẵn, đặc biệt là trên các máy tính xách tay cũ. ;-)

Làm thế nào về bạn tạo trạng thái cơ sở của bạn như là một cơ sở dữ liệu, và sau đó tạo một cơ sở dữ liệu mới từ nó để chạy thử, sử dụng CREATE DATABASE ... TEMPLATEchức năng. Sau khi kiểm tra, bạn ném cơ sở dữ liệu đó đi. Sau đó, hạn chế tốc độ của bạn về cơ bản chỉ là thời gian đến cp -Rthư mục cơ sở dữ liệu. Đó là nhanh như bạn sẽ nhận được mà không có phép thuật chụp nhanh hệ thống tập tin.


Đó là một ý tưởng rất tốt. Tôi đã không nghĩ về các mẫu cơ sở dữ liệu. Cảm ơn bạn!
Zilk

1
Đây là một giải pháp tuyệt vời, nhanh hơn 5x so với drop-restore nhưng có một nhược điểm: bạn cần bỏ các kết nối hiện tại trước khi thực hiện việc này nếu không nó sẽ không chạy được.
sorin

Cập nhật: điều này sẽ không hoạt động trong sản xuất vì cơ sở dữ liệu nguồn sẽ có kết nối với nó. Chúng ta cần một giải pháp khác.
sorin

11

Sử dụng Stellar , nó giống như git cho cơ sở dữ liệu:

Stellar cho phép bạn nhanh chóng khôi phục cơ sở dữ liệu khi bạn đang viết di chuyển cơ sở dữ liệu, chuyển nhánh hoặc làm rối với SQL. PostgreSQL và MySQL (một phần) được hỗ trợ.



liquidibase không hỗ trợ nó như Stellar, nơi bạn có thể làm việc với cơ sở dữ liệu (ví dụ: trong các bài kiểm tra đơn vị) và có thể phải quay trở lại một số trạng thái hoặc thời gian được gắn thẻ trước đó.
Andreas Dietrich

Stellar nghe có vẻ là một ý tưởng tuyệt vời, nhưng không hiệu quả với tôi
Orlando

5

Nếu cơ sở dữ liệu của bạn chạy trong Virtualbox , bạn có thể dễ dàng lưu ảnh chụp nhanh và khôi phục ảnh chụp nhanh của cả trạng thái cơ sở dữ liệu và hệ điều hành trong vài giây (hoặc 1-2 phút nếu bạn thực sự có nhiều dữ liệu trong cơ sở dữ liệu hoặc HĐH hoặc bộ nhớ nhỏ được phân bổ cho máy ảo) miễn phí.

Trong / hầu hết các trường hợp của bạn, tốt nhất nên cài đặt một linux nhẹ (hơn máy chủ Windows) để chạy máy ảo nơi cơ sở dữ liệu được lưu trữ cho bạn biết bạn có ít nguồn tài liệu có sẵn trên máy tính xách tay của mình.


Trên trang sản xuất, tôi sử dụng các bản sao lưu ảnh chụp nhanh của MediaTemple để đạt được kết quả tương tự (nhưng đó là 20 đô la cho mỗi khe sao lưu và cụ thể cho dịch vụ lưu trữ web đó, do đó có thể không phù hợp với bạn).


À không sao, tôi không thấy bình luận của bạn mà đề cập đến bạn đã biết về hộp ảo.
wildpeaks

3

Có lẽ không phải là câu trả lời mà bạn đang hy vọng, nhưng bạn đã xem xét một số mức độ chụp nhanh hơn - LVM chẳng hạn?


Vâng, điều đó đã đến với tâm trí. Thật không may, ảnh chụp nhanh hệ thống tập tin không được hỗ trợ bởi FS tôi hiện đang sử dụng (ext3). Một tùy chọn khác là thiết lập một VM như Virtualbox để chạy thử.
Zilk

2

Tìm thấy câu hỏi này khi cố gắng làm tương tự và kết thúc bằng git trên thư mục dữ liệu postgresql. Loại bỏ các thay đổi dễ dàng như:

git reset --hard

6
Điều này là không sử dụng cho các cơ sở dữ liệu lớn. Thêm vào đó, tại sao lại tra tấn git với các tệp nhị phân có kích thước khác nhau?
RolandoMySQLDBA

0

Tuy nhiên, một tùy chọn khác có thể được thử nghiệm là thực sự lưu một bản sao của thư mục dữ liệu postgresql, sau đó chỉ cần viết lại thư mục hiện có với bản sao khi bạn muốn khôi phục nó. Nó sẽ đòi hỏi nhiều không gian hơn trong đĩa, nhưng chắc chắn sẽ nhanh hơn khôi phục từ bản sao lưu. Tuy nhiên, tôi không chắc chắn liệu điều này có nhanh hơn phương thức mẫu hay không, vì vậy trước tiên nên thực hiện một số thử nghiệm.


0

Mặc dù tôi phải nói rằng Stellargit reset --hardlà một giải pháp thú vị, tôi sẽ gặp vấn đề với các cơ sở dữ liệu và kiểm tra lớn hơn và tôi sử dụng các Virtualboxgiải pháp, v.v. đang sử dụng kim loại trần, vv giải pháp.

Do đó, tôi phải đề cập đến ZFSnhư một hệ thống tập tin để xem xét cho những điều này trong tương lai vì những lý do sau đây mà @Peter Eisentraut cũng đề cập:

  1. Ảnh chụp nhanh - đặc biệt là khi bạn sao chép từ Prod sang QA / DR, bạn có thể sử dụng cùng một "hệ thống tập tin" cho các bài kiểm tra:
#On a replication node, rather stop, snap, restore for a "consistent" backup ;)
su -l -c "/usr/bin/m2ee stop" acw_qa
pg_ctlcluster ${=QA} stop --force
zfs destroy -R $SNAPSHOT
pg_ctlcluster ${=REPLICATION} stop --force
zfs snapshot $SNAPSHOT
pg_ctlcluster ${=REPLICATION} start

zfs destroy $CLONE
zfs clone -o mountpoint=$CLONEDIR $SNAPSHOT $CLONE
rm $CLONEDIR/$CLUSTER/recovery.conf
pg_ctlcluster ${=QA} start
su -l -c "/usr/bin/m2ee start" acw_qa
  1. để thực hiện kiểm tra, ngay trước khi kiểm tra, hãy dừng postgresql như trên, zfs snapshot $SNAPSHOTkhởi động postgresql, sau đó để khôi phục, dừng postgresql và chỉzfs rollback $SNAPSHOT

  2. Nén - Postgresql được nén 3: 1 điển hình trong cơ sở dữ liệu của tôi, vì vậy bạn có thể thực hiện nhiều thử nghiệm hơn nữa;)

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.