เท่าที่ฉันเข้าใจความจริงที่ว่าแบบสอบถามของเรากำลังรอการล็อกหมายความว่ามันกำลังรอการล็อคอยู่เสมอและมันไม่เคยเปลี่ยนแปลงอะไรเลย
ขวา - ถ้าคุณเห็นว่า 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
ต่อไป)