ฉันจะขอบันทึกรายการธุรกรรม postgresql ได้อย่างไร


11

ฉันมีปัญหาดังต่อไปนี้: การแจกจ่าย Linux "แนวตั้ง" (Sophos UMT) มาพร้อมกับ PostgreSQL 9.2 เพื่อจัดเก็บการกำหนดค่า น่าเสียดายเนื่องจากการอัปเดตครั้งล่าสุดดูเหมือนว่าทรานแซกชันบันทึก (WAL) ของบางอินสแตนซ์จะเพิ่มขึ้นโดยไม่ต้องล้างออก สิ่งนี้ทำให้โฟลเดอร์ pg_xlog โตขึ้นเป็นลำดับขนาดใหญ่กว่าโฟลเดอร์ฐาน

ตอนนี้ฉันอยู่ในสถานการณ์ที่ละเอียดอ่อน: เนื่องจากการเติบโตของไฟล์ WAL ที่มากเกินไปดิสก์ของหนึ่งในเครื่องเหล่านี้ (VM) จะเต็มก่อนวันจันทร์ ฉันได้เปิดเคสการสนับสนุนกับผู้จำหน่ายแล้ว แต่จนถึงตอนนี้พวกเขาไม่ได้มีประโยชน์มาก (พวกเขาแนะนำให้เราสร้าง VM ใหม่ด้วยดิสก์ขนาดใหญ่)

ฐานข้อมูลนี้ไม่ถูกสำรองเนื่องจากซอฟต์แวร์ทำการสำรองข้อมูลในลักษณะที่แตกต่างกัน (มีขั้นตอนการสำรองข้อมูลของตัวเองและส่งไฟล์สำรองทางอีเมล) และฉันคิดว่านี่เป็นสาเหตุที่ WAF เติบโตขึ้นอย่างมาก

ฉันกลัวว่าฉันไม่ได้เป็นผู้เชี่ยวชาญของ PostgreSQL ดังนั้นจึงเป็นไปได้มากที่ฉันจะถามคำถามที่งี่เง่าหรือชัดเจน แต่ขั้นตอนในการร้องขอไฟล์ WAL จะถูกล้างออกเป็นอย่างไร

เป็นการดีที่ฉันกำลังมองหาขั้นตอนที่จะทำให้ฉันสามารถล้างไฟล์ WAL เหล่านี้ในระบบที่มีปัญหาเพื่อซื้อเวลาให้เพียงพอเพื่อให้ผู้ขายออกการแก้ไขที่ดีกว่า

แก้ไข : ตามที่ร้องขอนี่คือผลลัพธ์ของSELECT version();แบบสอบถาม:

 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 แถว)

และSELECT name, current_setting(name), source FROM pg_settings WHERE source NOT IN ('default', 'override');แบบสอบถาม

 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)

Edit2

ในที่สุดเราก็ติดตั้งเซิร์ฟเวอร์ใหม่ทั้งหมด (ตามที่ร้องขอโดยฝ่ายสนับสนุนของ Sophos) แต่ใช้รุ่นก่อนหน้าและดิสก์ขนาดใหญ่กว่า เห็นได้ชัดว่าเวอร์ชั่นเก่าใช้พื้นที่สำหรับ WAL น้อยกว่ารุ่นใหม่

จากความอยากรู้ฉันได้ตรวจสอบรุ่นและพารามิเตอร์ pgsql ที่ไม่ใช่ค่าเริ่มต้น 7 และฉันได้รับผลลัพธ์ที่แตกต่างกันมาก:

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)

ดูเหมือนว่าฉันจะมีการเปลี่ยนแปลงค่อนข้างมากระหว่างสองเวอร์ชันนี้

คำตอบ:


9

ส่วนใหญ่มีแนวโน้มสิ่งที่คุณเห็นเป็นอย่างมากcheckpoint_segmentsคุณค่าและความยาวcheckpoint_timeout; อีกทางเลือกหนึ่งพวกเขาอาจตั้งค่าเป็นค่าwal_keep_segmentsที่สูงมากถ้ามันควรจะสนับสนุนการจำลองแบบการสตรีม

คุณสามารถบังคับด่านด้วยCHECKPOINTคำสั่ง นี่อาจทำให้ฐานข้อมูลหยุดชะงักในบางครั้งหากมีการสะสม WAL จำนวนมากและยังไม่ได้เขียนพื้นหลัง หากcheckpoint_completion_targetอยู่ในระดับต่ำ (น้อยกว่า 0.8 หรือ 0.9) แล้วมีแนวโน้มที่จะเป็นใหญ่ค้างของงานที่ต้องทำในเวลาที่ด่าน เตรียมพร้อมสำหรับฐานข้อมูลให้ช้าและไม่ตอบสนองระหว่างจุดตรวจ คุณไม่สามารถยกเลิกด่านได้เมื่อเริ่มต้นด้วยวิธีปกติ คุณสามารถพังฐานข้อมูลและรีสตาร์ทได้ แต่นั่นทำให้คุณกลับไปยังที่ที่คุณอยู่

ฉันไม่แน่ใจ แต่ฉันมีความรู้สึกว่าจุดตรวจสอบอาจส่งผลให้ฐานข้อมูลหลักเติบโตขึ้น - และทำก่อนที่จะมีพื้นที่ว่างใน WAL ถ้าเป็นเช่นนั้น ดังนั้นจุดตรวจอาจทำให้คุณหมดพื้นที่ได้สิ่งที่ยากมากในการกู้คืนจากโดยไม่ต้องเพิ่มที่เก็บข้อมูลอย่างน้อยก็ชั่วคราว

ตอนนี้เป็นเวลาที่ดีมากที่จะได้รับการสำรองข้อมูลที่เหมาะสมของฐานข้อมูล - ใช้pg_dump -Fc dbnameเพื่อถ่ายโอนข้อมูลแต่ละฐานข้อมูลและpg_dumpall --globals-onlyเพื่อกำหนดข้อกำหนดของผู้ใช้ ฯลฯ

หากคุณสามารถจ่ายได้หยุดทำงานหยุดฐานข้อมูลและใช้สำเนาระดับระบบไฟล์ของไดเรกทอรีข้อมูลทั้งหมด (โฟลเดอร์ที่มีpg_xlog, pg_clog, global, baseฯลฯ ) อย่าทำเช่นนี้ในขณะที่เซิร์ฟเวอร์กำลังทำงานและไม่ละเว้นไฟล์หรือโฟลเดอร์ใด ๆทั้งหมดเป็นสิ่งสำคัญ (ดียกเว้นpg_logแต่เป็นความคิดที่ดีที่จะเก็บบันทึกข้อความไว้)

หากคุณต้องการความคิดเห็นที่เฉพาะเจาะจงมากขึ้นเกี่ยวกับสาเหตุที่น่าจะเป็น (และเพื่อให้ฉันมั่นใจในสมมติฐานของฉันมากขึ้น) คุณสามารถเรียกใช้แบบสอบถามต่อไปนี้และวางผลลัพธ์ลงในคำตอบของคุณ (ในบล็อกที่มีโค้ด) ได้รับแจ้ง:

SELECT version();

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

เป็นไปได้ว่าการตั้งค่าcheckpoint_completion_target = 1จากนั้นหยุดและเริ่มการทำงานของฐานข้อมูลใหม่อาจทำให้การเริ่มต้นเขียน WAL อย่างจริงจัง มันจะไม่ปล่อยให้ว่างจนกว่ามันจะเป็นจุดตรวจสอบ แต่คุณสามารถบังคับหนึ่งเมื่อกิจกรรมการเขียนช้าลง (วัดได้ด้วย sar, iostat ฯลฯ ) ฉันไม่ได้ทดสอบว่าcheckpoint_completion_targetมีผลกับ WAL ที่เขียนไปแล้วหรือยังเมื่อมีการเปลี่ยนแปลงในการรีสตาร์ท ลองทดสอบสิ่งนี้กับการทดสอบแบบใช้มือถือ PostgreSQL ให้คุณinitdbบนเครื่องอื่นก่อน

การสำรองข้อมูลไม่มีส่วนเกี่ยวข้องกับการเก็บรักษาและการเติบโตของ WAL มันไม่เกี่ยวข้องกับการสำรองข้อมูล

ดู:


ขอบคุณมากสำหรับคำตอบอย่างละเอียด ฉันได้อัปเดตด้วยคำถามพร้อมกับผลลัพธ์ของคำค้นหาทั้งสองที่คุณให้ไว้ แต่ฉันไม่เห็นสิ่งที่เกี่ยวข้องกับจุดตรวจ ในระหว่างนี้เราได้ตัดสินใจที่จะแสดงหัวข้อย่อยและติดตั้งระบบใหม่ทั้งหมดด้วยดิสก์ที่มีขนาดใหญ่กว่า: ซึ่งจะทำให้เรามีเวลามากพอที่จะรับการแก้ไขที่สนับสนุนจาก Sophos
Stephane

@Stephane คุณไม่จำเป็นต้องติดตั้งใหม่ - คุณสามารถเพียงแค่อิมเมจเครื่องเก่าไปยังดิสก์ที่ใหญ่กว่าแล้วย้าย PostgreSQL ไปยังพาร์ติชันที่สร้างขึ้นใหม่ ที่กล่าวว่าขึ้นอยู่กับประสบการณ์ของคุณด้วยการดูแลระบบ Linux ระดับต่ำมันอาจจะง่ายต่อการติดตั้งใหม่
Craig Ringer

@Stephane ของคุณwal_keep_segmentsถูกตั้งค่าเป็น100ดังนั้นจะหมายความว่าคุณควรเก็บถาวร WAL สูงสุด 1.6GB สำหรับการใช้งานโดยสตรีมมิ่งแบบจำลองเมื่อเซิร์ฟเวอร์หลักไม่ต้องการใช้อีกต่อไป หากคุณไม่ได้ใช้การจำลองแบบการสตรีม (เป็นเซิร์ฟเวอร์หลัก) คุณสามารถตั้งค่าwal_keep_segmentsเป็นศูนย์และคืนพื้นที่นั้น ของคุณcheckpoint_segmentsดูเหมือนว่าจะเริ่มต้นดังนั้นคุณจึงไม่ควรจะมีอะไรมากไปกว่า 3 * 16 = 48MB ของ WAL wal_keep_segmentsถ้ามันไม่ได้สำหรับคุณ นอกจากนี้ยังแปลกที่คุณhot_standbyเปิดใช้งาน - นี่เป็นแบบจำลองหรือไม่
Craig Ringer

ขอบคุณอีกครั้ง. ระบบไม่ได้เป็นส่วนหนึ่งของแบบจำลองใด ๆ แต่ซอฟต์แวร์ที่ใช้ (ไฟร์วอลล์ Sopho UTM) สามารถใช้ในโหมด failover แบบแอ็คทีฟ / พาสซีฟดังนั้นจึงเป็นไปได้ว่าการตั้งค่านี้เป็นค่าเริ่มต้น
Stephane

@Stephane ใช่นั่นแหล่ะ ฉันหันwal_keep_segmentsไป0และเริ่มต้น PostgreSQL ส่วนตัว ฉันไม่ได้ตรวจสอบว่าจะลบ WAL ที่ไม่ต้องการ แต่ฉันคาดหวังให้ทำเช่นนั้น ฉันไม่แนะนำให้ลบออกด้วยตนเอง การลบไฟล์เก็บถาวร WAL ผิดจะทำให้ฐานข้อมูลของคุณไม่ทำงาน
Craig Ringer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.