จะปลอดภัยไหมที่จะยกเลิกการสืบค้น PostgreSQL ALTER TABLE ที่รอการล็อก?


10

เราเริ่มALTER TABLEคำถามเมื่อหลายชั่วโมงก่อนและเพิ่งรู้ว่าเพิ่งผ่านpg_stat_activityการล็อค เราค้นพบแบบสอบถามอื่น ๆ ที่ถือล็อคบนตารางที่เราต้องการแก้ไขและไม่ปล่อยให้มันไป

แบบสอบถามของเราคือแบบสอบถามแบบ "ง่าย" (การเปลี่ยนชนิดข้อมูลคอลัมน์) แต่กำลังทำงานบนตารางขนาดใหญ่

ALTER TABLEแทนที่จะฆ่ากระบวนการที่จะถือไว้ล็อคเราได้ตัดสินใจว่าเราอยากจะฆ่า

เราไม่ได้ห่อALTER TABLEในการทำธุรกรรม

เท่าที่ฉันเข้าใจความจริงที่ว่าแบบสอบถามของเรากำลังรอการล็อกหมายความว่ามันกำลังรอการล็อคอยู่เสมอและมันไม่เคยเปลี่ยนแปลงอะไรเลย

มันเป็นเรื่องจริงเหรอ? ปลอดภัยALTER TABLEหรือไม่ที่เราจะยกเลิกการสอบถามของเราทันที หรือเป็นไปได้ว่าแบบสอบถามได้แก้ไขบางสิ่งบางอย่างแล้วและการยกเลิกจะทำให้ฐานข้อมูลของเราอยู่ในสถานะกึ่งกลางหรือไม่

PS: SELECT pg_cancel_backend(pid);แผนคือการยกเลิกการใช้ หากนี่เป็นความคิดที่ไม่ดีโปรดแจ้งให้เราทราบ


1
ควรปรับเพื่อยกเลิก ALTER TABLE PostgreSQL มี DDL ของทรานแซคชันและคุณควรอยู่ในสถานะเดียวกับถ้าคุณไม่ได้รัน ALTER TABLE เลย
Josh Kupershmidt

ดังนั้นเมื่อคุณพูดว่า PostgreSQL มีธุรกรรม DDL นั่นหมายความว่าคิวรีที่เปลี่ยนสคีมานั้นมีการรันในธุรกรรมหรือไม่?
JMTyler

1
ในกรณีของคุณ ALTER TABLE คือ "เป็นหลักในการทำธุรกรรม" เนื่องจากคุณพูดว่า "เราไม่ได้ห่อตาราง ALTER ในการทำธุรกรรม" หากคุณต้องการคุณสามารถเขียน BEGIN; เปลี่ยนตาราง foo ... ; เปลี่ยนตารางบาร์ ... ; ฯลฯ ; COMMIT; - นั่นเป็นคุณสมบัตินักฆ่าที่แท้จริงของ PostgreSQL ที่มี DDL ธุรกรรม แต่สำหรับสถานการณ์ปัจจุบันของคุณใช่ตารางแก้ไขด้วยตัวเองสามารถยกเลิกได้อย่างปลอดภัยและจะถูกย้อนกลับราวกับว่ามันไม่เคยเกิดขึ้น
Josh Kupershmidt

ขอบคุณมากสำหรับการตอบกลับอย่างรวดเร็วของคุณ! นี่เป็นข้อมูลที่ดีมาก คุณช่วยโพสต์ไว้เป็นคำตอบเพื่อที่ฉันจะได้ทำเครื่องหมายว่ายอมรับได้หรือไม่?
JMTyler

คำตอบ:


13

เท่าที่ฉันเข้าใจความจริงที่ว่าแบบสอบถามของเรากำลังรอการล็อกหมายความว่ามันกำลังรอการล็อคอยู่เสมอและมันไม่เคยเปลี่ยนแปลงอะไรเลย

ขวา - ถ้าคุณเห็นว่า pg_stat_activity.waiting นั้นเป็น "true" สำหรับ ALTER TABLE นั่นก็หมายความว่ามันอดทนรอการล็อค ACCESS EXCLUSIVE บนตารางเป้าหมายและการทำงานจริง (จำเป็นต้องเปลี่ยนตารางใหม่) กำลังสร้างดัชนีใหม่และอื่น ๆ ) ยังไม่ได้เริ่ม

จะปลอดภัยไหมที่เราจะยกเลิกการสอบถาม ALTER TABLE ของเราทันที? หรือเป็นไปได้ว่าแบบสอบถามได้แก้ไขบางสิ่งบางอย่างแล้วและการยกเลิกจะทำให้ฐานข้อมูลของเราอยู่ในสถานะกึ่งกลางหรือไม่

การยกเลิกการสืบค้น (หรือเทียบเท่าย้อนกลับธุรกรรม) ใน PostgreSQL ไม่มีอันตรายจากความเสียหายของฐานข้อมูลที่คุณอาจถูก spooked โดยในฐานข้อมูลอื่น ๆ (เช่นคำเตือนที่น่ากลัวที่ด้านล่างของหน้านี้) นั่นเป็นเหตุผลที่ไม่ใช่ผู้ใช้ superusers ในรุ่นล่าสุดมีอิสระในการใช้งานpg_cancel_backend()และpg_terminate_backend()ฆ่าแบบสอบถามของตัวเองที่ทำงานในแบ็กเอนด์อื่น ๆ - พวกเขาปลอดภัยที่จะใช้โดยไม่ต้องกังวลเกี่ยวกับความเสียหายของฐานข้อมูล ท้ายที่สุด PostgreSQL จะต้องเตรียมพร้อมที่จะจัดการกับกระบวนการใด ๆ ที่ถูกกำจัดเช่น SIGKILL จาก OOM killer, การปิดเซิร์ฟเวอร์ ฯลฯ นั่นคือสิ่งที่บันทึก WALใช้

คุณอาจเห็นว่าใน PostgreSQL เป็นไปได้ที่จะดำเนินการคำสั่ง DDL ส่วนใหญ่ที่ซ้อนอยู่ภายในธุรกรรม (หลายคำสั่ง) เช่น

BEGIN;
ALTER TABLE foo ...;
ALTER TABLE bar ...;
-- more stuff
COMMIT; -- or ROLLBACK; if you've changed your mind

(ยอดเยี่ยมสำหรับการตรวจสอบให้แน่ใจว่าการโยกย้ายสคีมาไปด้วยกันหรือไม่เลย) คุณพูดว่า:

เราไม่ได้ห่อALTER TABLEในการทำธุรกรรม

ที่ดีสำหรับคำสั่งเดียว - จากเอกสาร ,

PostgreSQL ปฏิบัติจริง ๆ กับคำสั่ง SQL ทุกคำว่ากำลังดำเนินการภายในธุรกรรม หากคุณไม่ได้ใช้คำสั่ง BEGIN คำสั่งแต่ละคำสั่งจะมี BEGIN โดยนัยและ (ถ้าสำเร็จ) COMMIT ล้อมรอบคำสั่งนั้น กลุ่มของข้อความสั่งที่ล้อมรอบด้วย BEGIN และ COMMIT บางครั้งเรียกว่าบล็อกธุรกรรม

ดังนั้นการยกเลิกที่ALTER TABLEผ่านpg_cancel_backend()หรือ Ctrl-C ที่ออกจากพรอมต์ควบคุม psql จะมีผลคล้ายกันราวกับว่าคุณได้ทำ

BEGIN;
ALTER TABLE ... ;
ROLLBACK;

(แม้ว่าอย่างที่คุณหวังว่าจะได้เห็นการยกเลิกที่มีราคาแพงALTER TABLEสามารถบันทึกฐานข้อมูลจากการบดที่ไม่จำเป็นจำนวนมากหากคุณกำลังจะไปROLLBACKต่อไป)


5

หากต้องการอธิบายรายละเอียดเกี่ยวกับคำตอบที่ถูกต้องและยอดเยี่ยมของ Josh:

จะปลอดภัยไหมที่เราจะยกเลิกการสอบถาม ALTER TABLE ของเราทันที?

ใช่.

มันจะปลอดภัยแม้ว่าจะอยู่กลางการเขียนตารางใหม่

หากคุณต้องการให้คุณสามารถปิดเซิร์ฟเวอร์ PostgreSQL ทั้งหมดหรือในความเป็นจริงแล้วเครื่องที่ทำงานอยู่ให้รีสตาร์ทและทุกอย่างจะเรียบร้อย DDL ใน PostgreSQL มีการทำธุรกรรมและปลอดภัยผิดพลาด

การดำเนินการ DDL ถูกบันทึกผ่าน WAL และรับประกันว่าจะสามารถย้อนกลับหรือดำเนินการให้เสร็จสิ้นเมื่อการกู้คืนเกิดความผิดพลาดหรือยกเลิก


3
เพียงแค่ทราบเกี่ยวกับ "คุณสามารถปิดเซิร์ฟเวอร์ PostgreSQL ทั้งหมดได้หรือในความเป็นจริงแล้วเครื่องที่ทำงานเริ่มต้นใหม่และทุกอย่างจะดี" - ค่อนข้างเป็นจริงตราบใดที่คุณมีฮาร์ดแวร์ที่เชื่อถือได้ซึ่งไม่โกหก fsync , wiki.postgresql.org/wiki/Reliable_Writes
Josh Kupershmidt

2
@JoshKupershmidt แน่นอน แต่นั่นไม่ใช่ DDL เฉพาะ หากคุณมีปัญหาในการซิงค์แล้วคุณจะผิดพลาดไม่ปลอดภัยสำหรับทุกอย่าง
Craig Ringer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.