Làm thế nào tôi có thể yêu cầu một bản ghi nhật ký giao dịch postgresql?


11

Tôi có một vấn đề sau: một bản phân phối Linux "dọc" (Sophos UMT) đi kèm với PostgreQuery 9.2 để lưu trữ cấu hình của nó. Thật không may, kể từ lần cập nhật cuối cùng, có vẻ như nhật ký giao dịch (WAL) của một số trường hợp đang phát triển mà không bao giờ bị xóa. Điều này làm cho thư mục pg_xlog lớn lên nhiều bậc so với thư mục cơ sở.

Bây giờ tôi đang ở trong một tình huống tế nhị: do sự phát triển quá mức của các tệp WAL, đĩa của một trong những máy này (VM) sẽ đầy trước ngày thứ Hai. Tôi đã mở một trường hợp hỗ trợ với nhà cung cấp nhưng cho đến nay, chúng không hữu ích lắm (họ đề nghị chúng tôi xây dựng lại VM với các đĩa lớn hơn).

Cơ sở dữ liệu này không bao giờ được sao lưu vì phần mềm đang thực hiện sao lưu theo một cách khác (nó có quy trình sao lưu riêng và gửi các tệp sao lưu qua email) và tôi cho rằng đây là lý do tại sao WAFs đang phát triển rất nhiều.

Tôi sợ rằng tôi không phải là một chuyên gia PostgreQuery nên rất có thể tôi đang hỏi một câu hỏi ngớ ngẩn hoặc rõ ràng, nhưng thủ tục để yêu cầu các tệp WAL được xóa là gì?

Lý tưởng nhất là tôi đang tìm kiếm một quy trình cho phép tôi xóa các tệp WAL này trên hệ thống có vấn đề để mua cho mình đủ thời gian để khiến nhà cung cấp đưa ra cách khắc phục tốt hơn.

Chỉnh sửa : Theo yêu cầu, đây là đầu ra của SELECT version();truy vấn:

 PostgreSQL 9.2.4 on i686-pc-linux-gnu, compiled by gcc (SUSE Linux) 4.3.4 [gcc-4_3-branch revision 152973], 32-bit

(1 hàng)

SELECT name, current_setting(name), source FROM pg_settings WHERE source NOT IN ('default', 'override');truy vấn

 hot_standby                      | on                  | configuration file
 listen_addresses                 | *                   | configuration file
 log_destination                  | syslog              | configuration file
 log_min_duration_statement       | -1                  | configuration file
 log_min_error_statement          | error               | configuration file
 log_min_messages                 | notice              | configuration file
 maintenance_work_mem             | 512MB               | configuration file
 max_connections                  | 300                 | configuration file
 max_files_per_process            | 1000                | configuration file
 max_prepared_transactions        | 0                   | configuration file
 max_stack_depth                  | 2MB                 | configuration file
 max_standby_streaming_delay      | 10s                 | configuration file
 max_wal_senders                  | 10                  | configuration file
 password_encryption              | on                  | configuration file
 pg_stat_statements.max           | 1000                | configuration file
 pg_stat_statements.save          | on                  | configuration file
 pg_stat_statements.track         | all                 | configuration file
 pg_stat_statements.track_utility | off                 | configuration file
 port                             | 5432                | configuration file
 random_page_cost                 | 2                   | configuration file
 replication_timeout              | 1min                | configuration file
 seq_page_cost                    | 1                   | configuration file
 shared_buffers                   | 512MB               | configuration file
 shared_preload_libraries         | pg_stat_statements  | configuration file
 ssl                              | off                 | configuration file
 stats_temp_directory             | pg_stat_tmp         | configuration file
 superuser_reserved_connections   | 20                  | configuration file
 synchronous_commit               | local               | configuration file
 syslog_facility                  | local0              | configuration file
 syslog_ident                     | postgres            | configuration file
 temp_buffers                     | 256MB               | configuration file
 temp_file_limit                  | -1                  | configuration file
 TimeZone                         | GMT                 | configuration file
 timezone_abbreviations           | AlmostAll           | configuration file
 track_activities                 | on                  | configuration file
 track_activity_query_size        | 4096                | configuration file
 track_counts                     | on                  | configuration file
 track_functions                  | none                | configuration file
 track_io_timing                  | on                  | configuration file
 unix_socket_directory            | /var/run/postgresql | configuration file
 unix_socket_group                | postgres            | configuration file
 unix_socket_permissions          | 0777                | configuration file
 update_process_title             | on                  | configuration file
 vacuum_defer_cleanup_age         | 0                   | configuration file
 wal_buffers                      | 16MB                | configuration file
 wal_keep_segments                | 100                 | configuration file
 wal_level                        | hot_standby         | configuration file
 wal_receiver_status_interval     | 5s                  | configuration file
 work_mem                         | 512MB               | configuration file
(69 rows)

Chỉnh sửa2

Cuối cùng chúng tôi đã cài đặt lại toàn bộ máy chủ (theo yêu cầu của bộ phận hỗ trợ Sophos) nhưng sử dụng phiên bản trước và một đĩa lớn hơn. Rõ ràng, phiên bản cũ đang sử dụng ít không gian hơn cho WAL so với phiên bản mới.

Vì tò mò, tôi đã chạy kiểm tra phiên bản và các tham số pssql mặc định 7non và tôi nhận được kết quả khá khác nhau:

PostgreSQL 8.4.14 on i686-pc-linux-gnu, compiled by GCC gcc (SUSE Linux) 4.3.4 [gcc-4_3-branch revision 152973], 32-bit

              name               | current_setting |        source
---------------------------------+-----------------+----------------------
 autovacuum_analyze_scale_factor | 0.0005          | configuration file
 checkpoint_segments             | 12              | configuration file
 checkpoint_warning              | 0               | configuration file
 escape_string_warning           | off             | configuration file
 fsync                           | on              | configuration file
 listen_addresses                | *               | configuration file
 log_destination                 | syslog          | configuration file
 log_timezone                    | Europe/Zurich   | command line
 maintenance_work_mem            | 1GB             | configuration file
 max_connections                 | 300             | configuration file
 max_stack_depth                 | 2MB             | environment variable
 port                            | 5432            | configuration file
 shared_buffers                  | 32MB            | configuration file
 standard_conforming_strings     | off             | configuration file
 syslog_facility                 | local0          | configuration file
 syslog_ident                    | postgres        | configuration file
 temp_buffers                    | 1024            | configuration file
 TimeZone                        | UTC             | configuration file
 timezone_abbreviations          | AlmostAll       | configuration file
 work_mem                        | 512MB           | configuration file
(20 rows)

Có vẻ như tôi có khá nhiều thay đổi ở giữa hai phiên bản này.

Câu trả lời:


9

Rất có thể những gì bạn đang thấy là một checkpoint_segmentsgiá trị lớn và lâu dài checkpoint_timeout; cách khác, chúng có thể đã đặt wal_keep_segmentsthành một giá trị rất lớn nếu nó được cho là hỗ trợ sao chép phát trực tuyến.

Bạn có thể buộc một điểm kiểm tra bằng CHECKPOINTlệnh. Điều này có thể khiến cơ sở dữ liệu bị đình trệ một thời gian nếu nó đã tích lũy được một lượng WAL khổng lồ và không được viết nền. Nếu checkpoint_completion_targetthấp (dưới 0,8 hoặc 0,9) thì có khả năng là một công việc tồn đọng lớn phải làm vào thời điểm kiểm tra. Hãy chuẩn bị cho cơ sở dữ liệu trở nên chậm và không phản hồi trong quá trình kiểm tra. Bạn không thể hủy bỏ một điểm kiểm tra khi nó bắt đầu bằng các phương tiện thông thường; bạn có thể đánh sập cơ sở dữ liệu và khởi động lại nó, nhưng điều đó chỉ đưa bạn trở lại nơi bạn đang ở.

Tôi không chắc chắn, nhưng tôi có cảm giác một trạm kiểm soát cũng có thể dẫn đến sự phát triển của cơ sở dữ liệu chính - và làm như vậy trước khi bất kỳ không gian nào được giải phóng trong WAL, nếu có. Vì vậy, một trạm kiểm soát có khả năng kích hoạt bạn hết dung lượng, một thứ rất khó phục hồi mà không cần thêm nhiều bộ nhớ ít nhất là tạm thời.

Bây giờ sẽ là thời điểm rất tốt để có một bản sao lưu cơ sở dữ liệu thích hợp - sử dụng pg_dump -Fc dbnameđể kết xuất từng cơ sở dữ liệu và pg_dumpall --globals-onlykết xuất định nghĩa người dùng, v.v.

Nếu bạn có khả năng thời gian chết, ngăn chặn các cơ sở dữ liệu và lấy một bản sao mức file-system của toàn bộ thư mục dữ liệu (thư mục chứa pg_xlog, pg_clog, global, base, vv). Không làm điều này trong khi máy chủ đang chạy và không bỏ sót bất kỳ tệp hoặc thư mục nào, tất cả chúng đều quan trọng (tốt, ngoại trừ pg_log, nhưng dù sao thì vẫn nên giữ nhật ký văn bản).

Nếu bạn muốn nhận xét cụ thể hơn về nguyên nhân có thể (và vì vậy tôi có thể tin tưởng hơn vào giả thuyết của mình), bạn có thể chạy các truy vấn sau và dán đầu ra của chúng vào câu trả lời của bạn (trong một khối được thụt mã) 'm đã thông báo:

SELECT version();

SELECT name, current_setting(name), source
  FROM pg_settings
  WHERE source NOT IN ('default', 'override');

Có thể việc thiết lập checkpoint_completion_target = 1sau đó dừng và khởi động lại DB có thể khiến nó bắt đầu tích cực viết ra hàng đợi WAL. Nó sẽ không miễn phí cho đến khi nó thực hiện một điểm kiểm tra, nhưng bạn có thể buộc một lần hoạt động viết bị chậm lại (như được đo bằng sar, iuler, v.v.). Tôi chưa thử nghiệm xem liệu có checkpoint_completion_targetảnh hưởng đến WAL đã được viết khi thay đổi trong khởi động lại không; trước tiên hãy xem xét thử nghiệm này trên một bài kiểm tra vứt bỏ PostgreSQL bạn initdbtrên một máy khác.

Sao lưu không liên quan gì đến việc duy trì và tăng trưởng WAL; nó không liên quan đến sao lưu.

Xem:


Cảm ơn rất nhiều cho câu trả lời chi tiết. Tôi đã cập nhật bằng câu hỏi với kết quả của hai truy vấn bạn cung cấp. Tôi không thể thấy bất cứ điều gì liên quan đến trạm kiểm soát, mặc dù. Trong lúc này, chúng tôi đã quyết định cắn viên đạn và cài đặt lại toàn bộ hệ thống với một đĩa lớn hơn: điều đó sẽ cho chúng tôi đủ thời gian để nhận được bản sửa lỗi được hỗ trợ từ Sophos.
Stephane

@Stephane Bạn không cần phải cài đặt lại - bạn chỉ có thể ghi hình ảnh máy cũ sang đĩa lớn hơn sau đó di chuyển PostgreQuery sang phân vùng lớn hơn mới được tạo. Điều đó nói rằng, tùy thuộc vào kinh nghiệm của bạn với Linux sysadmin cấp thấp, việc cài đặt lại có thể dễ dàng hơn.
Craig Ringer

@Stephane Bạn wal_keep_segmentsđược đặt thành 100, do đó, điều đó có nghĩa là bạn sẽ có tối đa 1.6GB lưu trữ WAL được giữ lại để sử dụng bởi một bản sao phát trực tuyến khi máy chủ chính không còn cần đến chúng nữa. Nếu bạn không sử dụng sao chép phát trực tuyến (với tư cách là máy chủ chính), bạn có thể đặt wal_keep_segmentsthành không và lấy lại không gian đó. checkpoint_segmentsDường như của bạn là mặc định, vì vậy bạn không nên có bất cứ thứ gì nhiều hơn 3 * 16 = 48MB WAL nếu nó không dành cho bạn wal_keep_segments. Điều kỳ lạ là bạn đã hot_standbybật - đây có phải là bản sao không?
Craig Ringer

Cảm ơn một lần nữa. Hệ thống không phải là một phần của bất kỳ bản sao nào, nhưng phần mềm sử dụng nó (tường lửa Sopho UTM) có thể được sử dụng trong chế độ chuyển đổi dự phòng chủ động / thụ động để có thể cài đặt theo mặc định.
Stephane

@Stephane Vâng, đó là nó. Tôi muốn chuyển wal_keep_segmentssang 0và khởi động lại PostgreSQL cá nhân. Tôi chưa xác minh rằng nó sẽ xóa WAL không mong muốn, nhưng tôi hy vọng nó sẽ làm như vậy. Tôi không khuyên bạn nên gỡ bỏ nó bằng tay; loại bỏ các tệp lưu trữ WAL sai sẽ hoàn toàn ngăn cơ sở dữ liệu của bạn hoạt động.
Craig Ringer
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.