วิธีที่ลื่นที่สุดในการปิด mysql เมื่อทำเช่นนั้นคือการเรียกใช้
mysqladmin -uroot -p -h127.0.0.1 --protocol=tcp shutdown
นี่คือเหตุผล:
ไฟล์บริการ mysql ( /etc/init.d/mysql
) ขึ้นอยู่กับการมีอยู่ของไฟล์ซ็อกเก็ต เมื่อพูดไปแล้วกลับไปสู่ MySQL 4.0 ไฟล์ซ็อกเก็ตบางครั้งก็หายไปอย่างลึกลับ นี่เป็นมาตรฐานในservice mysql stop
การทำงาน
มันไม่เพียงพอที่จะพูด
mysqladmin -uroot -p -h127.0.0.1 shutdown
เพราะ mysqld ประสงค์เส้นทางที่ผู้ใช้เข้ามาในฐานะroot@127.0.0.1
ที่จะroot@localhost
ถ้า TCP / IP ไม่ได้เปิดใช้อย่างชัดเจน โดยค่าเริ่มต้น mysqld จะเลือกเส้นทางที่น้อยที่สุดของความต้านทานและเชื่อมต่อroot@127.0.0.1
ไปroot@localhost
ผ่านทางไฟล์ซ็อกเก็ต แต่ถ้าไม่มีไฟล์ซ็อกเก็ตroot@localhost
จะไม่เชื่อมต่อ
แม้แต่เอกสาร MySQL บน mysqladmin ก็บอกว่า:
หากคุณเรียกใช้ mysqladmin เมื่อปิดการเชื่อมต่อกับเซิร์ฟเวอร์ภายในโดยใช้ไฟล์ซ็อกเก็ต Unix mysqladmin จะรอจนกว่าไฟล์ ID กระบวนการของเซิร์ฟเวอร์จะถูกลบออกเพื่อให้แน่ใจว่าเซิร์ฟเวอร์หยุดทำงานอย่างถูกต้อง
นี่คือสาเหตุที่จำเป็นต้องเปิดใช้งาน TCP / IP:
mysqladmin -uroot -p -h127.0.0.1 --protocol=tcp shutdown
ย้อนกลับไปเมื่อวันที่ 30 กันยายน 2011 ฉันเขียนสคริปต์เวอร์ชันที่ฉันmysqld_multi
เรียกmysqlservice
(ดูโพสต์ของฉัน: เรียกใช้อินสแตนซ์หลายรายการบนโฮสต์เดียวกัน ) มันทำหน้าที่เป็นเสมือนเครื่องมือสำหรับเชื่อมต่อกับ mysqld จากพอร์ตที่แตกต่างกัน คุณเพียงแค่ต้องนำmy.cnf
พารามิเตอร์ของคุณเองมาเอง ในสคริปต์นั้นฉันออกการปิดระบบเช่นนี้:
stop() {
${ECHO} -n $"Stopping ${PROGNAME}"
${MYSQLD_STOP}
ATTEMPTS=0
STOPPING_MYSQLD=1
MINUTES_TO_TRY=10
(( TICKS_TO_TRY = MINUTES_TO_TRY*240 ))
while [ ${STOPPING_MYSQLD} -eq 1 ]
do
${ECHO} -n "."
${SLEEP} 0.25
MYSQLD_HAS_BEEN_SHUTDOWN=`${TAIL} ${MYSQL_ERROR_LOG} | ${GREP} -c "Shutdown complete$"`
(( ATTEMPTS++ ))
if [ ${ATTEMPTS} -eq ${TICKS_TO_TRY} ] ; then STOPPING_MYSQLD=0 ; fi
if [ ${MYSQLD_HAS_BEEN_SHUTDOWN} -eq 1 ] ; then STOPPING_MYSQLD=2 ; fi
done
${ECHO}
if [ ${STOPPING_MYSQLD} -eq 2 ]
then
${ECHO} "Stopped ${PROGNAME}"
else
${TAIL} -30 ${MYSQL_ERROR_LOG}
fi
}
แต่สิ่งที่เป็น${MYSQLD_STOP}
?
MYSQL_CONN="-uroot -p<rootpassword> -P${MYSQLD_PORT} -h127.0.0.1 --protocol=tcp"
MYSQLD_STOP="${MYSQLADMIN} ${MYSQL_CONN} shutdown"
โปรดสังเกตว่าฉันใช้127.0.0.1
และพอร์ตที่ชัดเจน ด้วยวิธีนี้ฉันไม่ได้ใช้ไฟล์ซ็อกเก็ต
ฉันมักจะใช้mysqladmin --protocol=tcp shtudown
เป็นทางเลือกที่เหมาะสมในการปิด mysql ถ้าservice mysql stop
แฮงค์ ทำkill -9
บนmysqld
และmysqld_safe
ควรสุดท้ายของสุดท้ายของรีสอร์ทที่ผ่านมา (ใช่ฉันพูดไปสามครั้งแล้ว)
หลายครั้ง mysqld ได้ลบ mysql.sock โดยไม่มีการเตือนล่วงหน้า คนอื่นมีปัญหานี้เช่นกันในช่วงหลายปีที่ผ่านมา:
บทส่งท้าย
ความลับอยู่เช่นเดียวกับผมระบุ: เชื่อมต่อกับ MySQL ใช้mysqladminผ่าน TCP / IP ( --protocol=tcp
) shutdown
และปัญหา สิ่งนี้ต้องใช้งานได้เนื่องจากสิทธิ์การปิดเครื่องนั้นมีไว้mysql.user
เพื่อวัตถุประสงค์เฉพาะของการปิดระบบที่ผ่านการตรวจสอบความถูกต้องแล้ว สิ่งนี้ได้บันทึกวันทำงานของฉันสองสามครั้งเมื่อฉันสามารถออกการปิดระยะไกลจากเครื่อง Windows ของฉันเมื่อปิด mysqld บนเซิร์ฟเวอร์ Linux
อัพเดท 2013-03-06 22:48 EST
หากคุณกังวลเกี่ยวกับสิ่งที่เกิดขึ้นในระหว่างการปิดระบบจะมีวิธีจัดการเวลาปิดเครื่องและวิธีการล้างข้อมูลในดิสก์โดยเฉพาะอย่างยิ่งหากคุณมีข้อมูล InnoDB จำนวนมากในบัฟเฟอร์บัฟเฟอร์
คำแนะนำ # 1
หากคุณมีหน้าสกปรกจำนวนมากคุณสามารถลดinnodb_max_dirty_pages_pctเป็น 0:
SET GLOBAL innodb_max_dirty_pages_pct = 0;
ตั้งค่านี้ประมาณ 15-30 นาทีก่อนปิดเครื่อง นี้จะให้ mysqld จำนวนหน้าสกปรกน้อยที่สุดที่เป็นไปได้ในการเขียนไปยังดิสก์
คำแนะนำ # 2
โดยค่าเริ่มต้นinnodb_fast_shutdownคือ 1 มีสามค่าสำหรับตัวเลือกนี้
- 0: InnoDB ทำการปิดระบบช้าการล้างข้อมูลแบบเต็มและการแทรกบัฟเฟอร์แบบผสานก่อนที่จะปิดเครื่อง
- 1: InnoDB ข้ามการดำเนินการเหล่านี้เมื่อปิดระบบซึ่งเป็นกระบวนการที่เรียกว่าการปิดระบบอย่างรวดเร็ว
- 2: InnoDB จะล้างบันทึกและปิดการทำงานของความเย็นราวกับว่า MySQL ขัดข้อง ไม่มีการทำธุรกรรมที่มุ่งมั่นจะหายไป แต่การดำเนินการกู้คืนความผิดพลาดทำให้การเริ่มต้นครั้งต่อไปใช้เวลานานขึ้น
เอกสารอธิบายเพิ่มเติมว่า:
การปิดระบบช้าอาจใช้เวลาหลายนาทีหรือหลายชั่วโมงในกรณีร้ายแรงซึ่งข้อมูลจำนวนมากยังคงถูกบัฟเฟอร์ ใช้เทคนิคการปิดเครื่องช้าก่อนที่จะอัพเกรดหรือลดระดับระหว่างรุ่นใหญ่ ๆ ของ MySQL เพื่อให้ไฟล์ข้อมูลทั้งหมดพร้อมอย่างเต็มที่ในกรณีที่กระบวนการอัพเกรดอัปเดตรูปแบบไฟล์
ใช้ innodb_fast_shutdown = 2 ในสถานการณ์ฉุกเฉินหรือการแก้ไขปัญหาเพื่อให้ได้การปิดระบบที่รวดเร็วที่สุดหากข้อมูลมีความเสี่ยงต่อความเสียหาย
ค่าเริ่มต้นสำหรับ innodb_max_dirty_pages_pct และ innodb_fast_shutdown น่าจะใช้ได้ในกรณีส่วนใหญ่
tmpwatch
ลบมันรวมถึงทุกอย่างใน/tmp
ที่มีเวลาเก่ากว่าเกณฑ์ที่กำหนดไว้