PostgreQuery trên mạng bị đóng băng


7

Trong Derby (một cơ sở dữ liệu nhúng được viết bằng Java, phần lớn được sử dụng để thử nghiệm hoặc tạo mẫu), có các lệnh "đóng băng" và "giải phóng" có thể được sử dụng trong quá trình sao lưu trực tuyến . "Đóng băng" chỉ đơn giản là làm cho tất cả các truy cập cơ sở dữ liệu bị chặn cho đến khi "giải phóng" được gọi. Điều này hữu ích để sao lưu bằng chương trình bên ngoài, điều mà bạn có thể làm nếu chương trình bên ngoài nhanh hơn nhiều so với sử dụng giải pháp sao lưu nội bộ của Derby. Đối với trường hợp sử dụng của tôi, tôi có thể chụp ảnh nhanh gần như ngay lập tức bằng cách sử dụng một số tiện ích hệ thống tệp tích hợp, vì vậy đây là hoạt động liên tục (không phải O(length of DB files)).

Tôi đang di chuyển một ứng dụng vượt trội so với Derby sang PostgreSQL và tôi tự hỏi liệu có thứ gì có thể so sánh ở đó mà tôi có thể sử dụng để dập tắt tất cả các kết nối hay không. Ngoài ra, tôi muốn biết điểm nối tiếp của tôi là gì từ bên trong ứng dụng của mình để tôi không bị rơi vào trạng thái khó xử, vì vậy việc có thể tạm dừng / tiếp tục tất cả các truy cập khác là điều rất tốt đối với tôi.

Vì PostgreQuery có nhật ký giao dịch, tôi chỉ có thể chụp ảnh nhanh mà không "đóng băng", nhưng ảnh chụp nhanh sẽ cần được chạy qua cơ chế khôi phục của PostgreQuery trước khi tôi có thể sử dụng nó vì nếu không thì những gì được lưu trữ trên đĩa sẽ giống như khi tôi kéo phích cắm trên một hệ thống tập tin bình thường. Giải pháp này không lý tưởng.

EDIT Tôi đã học pg_start_backup()được gần, nhưng nó không khiến các giao dịch đến bị chặn cho đến khi có một cuộc gọi phù hợp pg_stop_backup(), buộc tôi phải thực hiện khôi phục tại thời điểm để pg_start_backup()trả về id giao dịch từ ảnh chụp nhanh của hệ thống tệp. Sẽ thật tuyệt nếu không phải thực sự tắt PostgreSQL để có được điều này (có lẽ có một lệnh giả tắt để giữ kết nối mở?).


Tôi nghĩ rằng bạn đang tìm kiếm pg_start_backup(): postgresql.org/docs/civerse/static/ , Nhưng bạn nên đọc cái này: postgresql.org/docs/civerse/static/backup-file.html để hiểu lý do tại sao bạn không thể lấy một hệ thống tệp sao lưu trong khi máy chủ đang chạy
a_horse_with_no_name

Tôi sẽ đề nghị chuyển câu hỏi này sang dba.SE.
Erwin Brandstetter

@a_horse_with_no_name đã pg_start_backup()đóng. Có cách nào để thực sự chặn các ghi khác để ảnh chụp nhanh được đảm bảo nhất quán hay không (ngoài việc tắt cơ sở dữ liệu trước khi chụp nhanh)? Mặt khác, có vẻ như tôi vẫn phải thực hiện khôi phục tại thời điểm giao dịch pg_start_backup()để tránh phục hồi các giao dịch xảy ra giữa pg_start_backup()ảnh chụp nhanh và hệ thống tệp.
Dan

@Dan: Hừm, tôi chỉ có thể đăng nhập vào các trang web stackexchange khác bằng cùng một tài khoản bằng cách sử dụng tài khoản stackexchange.
Erwin Brandstetter

@Dan: Chỉ cần gắn cờ nó yêu cầu di chuyển, người điều hành sẽ di chuyển nó cho bạn.
Erwin Brandstetter

Câu trả lời:


9

Không có chính xác tương đương với những gì bạn muốn. Các tùy chọn bao gồm:

Ảnh chụp hệ thống tệp nguyên tử

Nếu bạn đang sử dụng ảnh chụp nhanh hệ thống tệp nguyên tử, bạn không cần phải đóng băng cơ sở dữ liệu. Nó có thể giúp phục hồi nhanh hơn một chút nếu bạn buộc CHECKPOINTlần đầu tiên, nhưng đó là về nó. Khi bạn chụp ảnh chụp nhanh hệ thống tập tin và sao chép nó, sau đó bắt đầu sao chép, vào PostgreSQL, nó như thể nó bị hỏng và đang bắt đầu sao lưu. Điều đó hoàn toàn tốt, nó an toàn và được thiết kế để hoạt động theo cách đó.

Cách tiếp cận này chỉ hợp lệ nếu ảnh chụp nhanh là nguyên tử - tất cả đều ở cùng một thời điểm ảo. Bạn không thể có được một ảnh chụp nhanh nguyên tử trên nhiều hệ thống tệp (ít nhất là trên Linux), vì vậy nếu DB của bạn được phân chia trên nhiều không gian bảng hoặc WAL nằm trên một đĩa riêng biệt thì bạn không thể sử dụng phương pháp này.

pg_start_backup / pg_stop_backup

Nếu bạn không thể thực hiện một ảnh chụp nhanh nguyên tử, bạn có thể kích hoạt lưu trữ WAL, chạy pg_start_backup, sao chép DB, chạy pg_stop_backupvà chụp các lưu trữ WAL cuối cùng được tạo.

Nó phức tạp hơn một chút, nhưng nó cung cấp cho bạn một bản sao lưu nhất quán mà không dừng ghi và không cần ảnh chụp nhanh nguyên tử cấp hệ thống tệp.

pg_basebackup

Một cách khác để sử dụng pg_start_backuppg_stop_backuplà sử dụng pg_basebackupđể thực hiện một bản sao phát trực tuyến của DB qua giao thức sao chép PostgreQuery với --xlog-method=stream. Điều này chỉ yêu cầu kết nối sao chép PostgreSQL, không yêu cầu dừng DB và khá liền mạch.

--xlog-method=streamchỉ được thêm vào trong các phiên bản gần đây và pg_basebackupbản thân nó còn khá mới.

pg_dump

Ban đầu tôi không đề cập đến nó bởi vì bạn đang tìm kiếm các công cụ bên ngoài, nhưng luôn luôn pg_dumpcó một SERIALIZABLEảnh chụp nhanh cơ sở dữ liệu và loại bỏ nó. DB tiếp tục chạy như bình thường (nó vẫn có thể chấp nhận ghi) và kết xuất hoàn toàn phù hợp với nội bộ kể từ khi bạn bắt đầu kết xuất.

Viết tĩnh

Dừng tất cả các giao dịch đến sẽ không dừng viết PostgreSQL. Nó vẫn sẽ có liên VACUUMquan đến autovacuum, điểm kiểm tra để thực hiện, số liệu thống kê để viết, v.v.

Không có tính năng nào trong PG để dừng tất cả các ghi vào thời điểm này. Nó có thể là tốt để thêm, nhưng tôi không biết bất cứ ai làm việc trên nó.

Một số hệ thống tệp, như XFS, hỗ trợ ghi đóng băng ở cấp hệ thống tệp; điều này làm cho tất cả ghi bị chặn cho đến khi đóng băng được phát hành. An toàn để đóng băng tất cả các hệ thống tệp sau đó sao chép tất cả các hệ thống tệp.


Cảm ơn, điều đó xóa một số điều. Tôi có một yêu cầu nữa tôi quên đề cập - Tôi đang cố gắng dừng ghi vì tôi đang sử dụng chức năng này để tạo ảnh chụp nhanh phù hợp với nguồn dữ liệu khác. Nếu tôi không thể chặn ghi, có thể hai nguồn dữ liệu có thể không nhất quán trong ảnh chụp nhanh.
Dan

@Dan: bạn có thể chụp ảnh nhanh nhất quán bằng pg_dump mà không cần chặn ghi.
a_horse_with_no_name

@a_horse_with_no_name Tôi đã chọn nó như một pg_dumptùy chọn không phải là một tùy chọn từ "Điều này hữu ích để sao lưu bằng chương trình bên ngoài, bạn có thể làm gì nếu chương trình bên ngoài nhanh hơn nhiều so với sử dụng giải pháp sao lưu nội bộ của Derby" với tác giả muốn tương tự cho PGS. Tuy nhiên, nên đề cập đến.
Craig Ringer

@a_horse_with_no_name CraigRinger hiểu tôi chính xác về điều này.
Dan

1
Như một lưu ý cuối cùng, một chuyên gia PostgreQuery trong công ty của tôi đã giải thích rằng việc tắt cá thể là cách duy nhất để có được chính xác những gì tôi muốn.
Dan
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.