ฉันต้องการเริ่ม mysql ใหม่อย่างสง่างามเช่นเดียวกับ httpd ที่มีการเสิร์ฟเธรดก่อนที่จะรีสตาร์ท ฉันจะไม่ชอบข้อความค้นหาที่ละเมิด
ฉันต้องการเริ่ม mysql ใหม่อย่างสง่างามเช่นเดียวกับ httpd ที่มีการเสิร์ฟเธรดก่อนที่จะรีสตาร์ท ฉันจะไม่ชอบข้อความค้นหาที่ละเมิด
คำตอบ:
ลำดับการปิด "ขอ" ใด ๆ ใน 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 ตามปกติด้วย initscripts (เช่นตัวแปรท้องถิ่นของคุณservice mysql.server restart
) หรือmysqladmin shutdown
ตามด้วยการรีสตาร์ทด้วยตนเอง
โดยสรุปแนวทางปฏิบัติที่ดีที่สุดบางข้อที่ควรพิจารณาก่อนปิด MySQL คือ:
mysql> STOP SLAVE;
หยุดการจำลองแบบถ้าคุณกำลังจะปิดเป็นทาสmysql> SET GLOBAL innodb_max_dirty_pages_pct = 0;
ล้างหน้าสกปรกล่วงหน้าเพื่อลดเวลาในการปิดเครื่องmysql> SHOW PROCESSLIST;
ๆ ฆ่าmysql> kill thread_id;
หรือรอจนกว่าจะเสร็จสิ้น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!
innodb_fast_shutdown = 1
ทำให้แน่ใจว่า MySQL เริ่มทำงานได้เร็วขึ้นจริงหรือ เมื่อมองดูเอกสารดูเหมือนว่าจะช่วยเพิ่มความเร็วในการปิดเครื่อง