มีการรีสตาร์ทที่ดีหรือปลอดภัยสำหรับ mysql เช่น apache httpd หรือไม่


29

ฉันต้องการเริ่ม mysql ใหม่อย่างสง่างามเช่นเดียวกับ httpd ที่มีการเสิร์ฟเธรดก่อนที่จะรีสตาร์ท ฉันจะไม่ชอบข้อความค้นหาที่ละเมิด

คำตอบ:


37

ลำดับการปิด "ขอ" ใด ๆ ใน MySQL (สั้นkill -9) ค่อนข้างสง่างามเนื่องจากความคืบหน้าของการทำธุรกรรม (ในตารางธุรกรรม) ถูกย้อนกลับ แต่นี่เป็นสองวิธีที่จะทำให้การรีสตาร์ทเป็นไปอย่างสะอาดที่สุด

หมายเหตุ: หากคุณกำลังปิดเซิร์ฟเวอร์สำหรับการอัพเกรดอย่าใช้กระบวนการนี้ ให้ทำตามกระบวนการที่มีรายละเอียดในคำตอบนี้แทน

มิฉะนั้นหากคุณเพิ่งรีสตาร์ทเซิร์ฟเวอร์ที่มีประโยชน์อย่างอื่นเพื่อให้คุณสามารถเปลี่ยนตัวแปรโกลบอลแบบอ่านอย่างเดียวหรือบางอย่างที่คล้ายกันนี่คือเส้นทางที่สง่างาม:

ก่อนอื่นให้เปิดใช้งานinnodb_fast_shutdownหากยังไม่ได้ดำเนินการ สิ่งนี้ไม่เกี่ยวข้องโดยตรงกับความสง่างามของการปิดเครื่อง แต่ควรทำให้เซิร์ฟเวอร์ของคุณเร็วขึ้น

mysql> SHOW VARIABLES LIKE 'innodb_fast_shutdown';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| innodb_fast_shutdown | 0     |
+----------------------+-------+
1 row in set (0.00 sec)

mysql> SET GLOBAL innodb_fast_shutdown = 1;
Query OK, 0 rows affected (0.01 sec)

จากนั้นแนะนำให้เซิร์ฟเวอร์ปิดตารางที่เปิดอยู่ทั้งหมดทันทีที่ไม่มีการสืบค้นที่สืบค้นอยู่ในปัจจุบัน ขั้นตอนนี้ไม่เกี่ยวข้องกับการปิดระบบที่สง่างาม แต่จะทำให้ขั้นตอนต่อไปทำงานได้เร็วขึ้น:

mysql> FLUSH LOCAL TABLES;
Query OK, 0 rows affected (41.12 sec)

FLUSH TABLESคำสั่ง (มีตัวเลือกLOCALคำหลักที่หลีกเลี่ยงล้างที่ไม่จำเป็น แต่ไม่เป็นอันตรายอย่างอื่นของทาสใด ๆ ) จะป้องกันและจะแจ้งให้คุณไม่กลับจนกว่าของตารางสามารถปิดได้ เมื่อแต่ละตารางได้รับ "flushed" (ปิด) หากแบบสอบถามในภายหลังอ้างอิงตารางนั้นจะถูกเปิดใหม่โดยอัตโนมัติ แต่ก็ไม่เป็นไร สิ่งที่เราประสบความสำเร็จในขั้นตอนนี้คือการทำงานน้อยลงสำหรับขั้นตอนสุดท้าย:

mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (13.74 sec)

mysql>

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

คุณไม่สามารถมีล็อคอ่านทั่วโลกจนทุกคนที่กำลังทำงานอยู่ "การเขียน" แบบสอบถาม (กล่าวคือทุกอย่างสวยมาก แต่SELECT) จะทำ การออกคำขอล็อคจะทำให้การสืบค้นที่มีอยู่เสร็จสิ้น แต่จะไม่อนุญาตให้เริ่มการสืบค้นใหม่

พรอมต์ของคุณจะไม่กลับมาจนกว่าคุณจะล็อคส่วนกลางนี้ดังนั้นทุกคำถามที่อยู่ในระหว่างดำเนินการเมื่อคุณขอให้ล็อคสามารถเสร็จสิ้นและคุณรู้ว่าพวกเขากำลังเสร็จสิ้นเพราะคุณได้รับพรอมต์กลับมา ข้อความค้นหาใด ๆ ที่ตามมาที่พยายามเขียนสิ่งใด ๆ ลงในตารางใด ๆ จะหยุดการเปลี่ยนแปลงไม่มีข้อมูลรอการล็อกอย่างไม่มีกำหนดจนกระทั่ง ...

  • คุณเปลี่ยนใจเกี่ยวกับการรีสตาร์ทและปลดล็อคด้วยตนเอง ( UNLOCK TABLES;)
  • คุณรีสตาร์ทเซิร์ฟเวอร์หรือ
  • คุณตั้งใจหรือตั้งใจจะยกเลิกการเชื่อมต่อไคลเอนต์บรรทัดคำสั่งจากชุดข้อความนี้ (ดังนั้นอย่าทำเช่นนั้น) เชื่อมต่อหน้าต่างนี้แล้วนั่งที่พรอมต์ mysql:

ต้านทานสิ่งล่อใจเพื่อปิดสิ่งนี้

mysql>

พรอมต์คอนโซลที่ไม่ทำงานนี้คือสิ่งที่ถือการล็อคระดับโลกสำหรับคุณ สูญเสียสิ่งนี้ล็อคการสูญเสีย

จากหน้าต่างคอนโซลอื่นให้รีสตาร์ท MySQL ตามปกติด้วย initscripts (เช่นตัวแปรท้องถิ่นของคุณservice mysql.server restart) หรือmysqladmin shutdownตามด้วยการรีสตาร์ทด้วยตนเอง


การใช้innodb_fast_shutdown = 1ทำให้แน่ใจว่า MySQL เริ่มทำงานได้เร็วขึ้นจริงหรือ เมื่อมองดูเอกสารดูเหมือนว่าจะช่วยเพิ่มความเร็วในการปิดเครื่อง
คริส

@Chris ความคิดก็คือมันช่วยให้มั่นใจว่าการปิดระบบทั้งหมด + การเริ่มต้นทำงานนั้นรวดเร็วเหมือนจริง แต่ก็ค่อนข้างสำคัญเนื่องจากปริมาณงานที่ทำเสร็จแล้วในทางทฤษฎีเดียวกัน - เพิ่งย้ายไปอีกด้านหนึ่งของลำดับ - แต่ ด้วยเหตุผลบางอย่างดูเหมือนว่าโดยรวมมักจะเร็วกว่าเสมอเช่นบางทีอาจจะไม่มีประสิทธิภาพในการปิดเครื่องที่ไม่ได้อยู่ในช่วงเริ่มต้น ยากที่จะพูด.
Michael - sqlbot

2

โดยสรุปแนวทางปฏิบัติที่ดีที่สุดบางข้อที่ควรพิจารณาก่อนปิด MySQL คือ:

  1. ยืนยันอินสแตนซ์ที่คุณกำลังจะปิดเพื่อหลีกเลี่ยงการหยุดอินสแตนซ์อื่นโดยไม่ได้ตั้งใจ
  2. mysql> STOP SLAVE;หยุดการจำลองแบบถ้าคุณกำลังจะปิดเป็นทาส
  3. mysql> SET GLOBAL innodb_max_dirty_pages_pct = 0;ล้างหน้าสกปรกล่วงหน้าเพื่อลดเวลาในการปิดเครื่อง
  4. ตรวจสอบแบบสอบถามที่ใช้เวลานานmysql> SHOW PROCESSLIST;ๆ ฆ่าmysql> kill thread_id;หรือรอจนกว่าจะเสร็จสิ้น
  5. ดัมพ์พูลบัฟเฟอร์เมื่อปิดเครื่องmysql> SET GLOBAL innodb_buffer_pool_dump_at_shutdown = ON;และโหลดซ้ำเมื่อเริ่มต้น # vi /etc/my.cnf innodb_buffer_pool_load_at_startup = ON เพื่ออุ่นเครื่องบัฟเฟอร์พูล

จากนั้นหลังจากยืนยันจุดก่อนหน้านี้คุณสามารถรีสตาร์ท MySQL ได้อย่างปลอดภัย shell$ service mysql restart

สำหรับรายละเอียดเพิ่มเติมดูโพสต์ของฉันตรวจสอบสิ่งเหล่านี้ก่อนที่จะปิด MySQL!


ทำไม downvote นี้ ฉันไม่รู้พอที่จะรับรู้ว่าคำสั่งใดบ้างที่ไม่ดี แต่ฉันต้องการรู้ว่าฉันสามารถหลีกเลี่ยงได้
Jon

ฉันไม่ทราบใด ๆ ข้างต้นเป็นคำสั่งที่ไม่ดี ฉันกำลังทำตามขั้นตอนข้างต้นและผู้คนมากมายทำเช่นนั้น เฉพาะขั้นตอนที่ 4 ควรใช้ความระมัดระวังคุณไม่ควรฆ่าแบบสอบถามใด ๆ จนกว่าคุณจะแน่ใจในสิ่งที่คุณกำลังทำมิฉะนั้นรอจนกว่าแบบสอบถามที่ใช้เวลานานจะเสร็จสิ้น ลองดูและถ้ามันช่วยคุณยกมันขึ้นมาถ้าอย่างนั้นลงคะแนนมัน!
Moll
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.