มันค่อนข้างง่ายสำหรับตาราง MyISAM ที่จะพัง
ในส่วนหัวของทุกตาราง MyISAM เป็นตัวนับที่ติดตามจำนวนไฟล์ที่เปิดที่จับได้ที่มีต่อตาราง
หากคุณเริ่มต้น mysql และหมายเลขในส่วนหัวไม่ตรงกับจำนวนไฟล์ที่ถูกจัดการจริง ๆ mysqld จะรักษาตารางนั้นไม่ทำงาน
ถ้าง่ายทำให้มันทำงานอีกครั้งทุกครั้งโดยไม่สูญเสียของข้อมูลนี้อาจบ่งบอกว่าคุณมีเว็บไซต์ค้ามากอย่างที่เขียนไปREPAIR TABLE mdl_user
mdl_user
หากต้องการหลายสิบตารางREPAIR TABLE
ฉันจะแปลงตารางทั้งหมดเป็น InnoDB อย่างไรก็ตามหากmdl_user
ตารางเป็นตารางเดียวที่มีปัญหานี้มีบางสิ่งที่คุณสามารถทำได้ (สำหรับตัวอย่างนี้สมมติว่าฐานข้อมูลเป็นmoodle
)
หากคุณต้องการให้ตารางทั้งหมดเป็น MyISAM
ขั้นตอนที่ 01: สร้างสคริปต์ซ่อมแซมตาราง
echo "REPAIR TABLE moodle.mdl_user;" > /var/lib/mysql/MoodleStartUp.sql
ขั้นตอนที่ 02: ประกาศสคริปต์ซ่อมแซมเป็นไฟล์เริ่มต้น
เพิ่มไปยัง /etc/my.cnf
[mysqld]
init-file=/var/lib/mysql/MoodleStartUp.sql
ขั้นตอนที่ 03: เริ่ม mysql ใหม่
การรีสตาร์ท mysql ทุกครั้งจะเรียกสคริปต์ซ่อมแซมตาราง
หากคุณต้องการให้ตารางทั้งหมดกลายเป็น InnoDB
เรียกใช้รหัสนี้เพื่อสร้างสคริปต์การแปลงข้อมูลจำนวนมากของตาราง MyISAM เป็น InnoDB และดู
MYSQL_USER=root
MYSQL_PASS=password
MYSQL_CONN="-u${MYSQL_USER} -p ${MYSQL_PASS}"
echo "SET SQL_LOG_BIN = 0;" > /root/ConvertMyISAMToInnoDB.sql
mysql ${MYSQL_CONN} -A --skip-column-names -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;') InnoDBConversionSQL FROM information_schema.tables WHERE engine='MyISAM' AND table_schema NOT IN ('information_schema','mysql','performance_schema') ORDER BY (data_length+index_length)" > /root/ConvertMyISAMToInnoDB.sql
less /root/ConvertMyISAMToInnoDB.sql
เมื่อคุณพอใจกับเนื้อหาของสคริปต์การแปลงแล้วเรียกใช้
mysql ${MYSQL_CONN} < /root/ConvertMyISAMToInnoDB.sql
อัพเดท 2012-03-15 14:00 EDT
@Kevinในขณะที่ใช้ MyISAM จะเกิดอะไรขึ้นถ้า Disk Out isuue ของคุณหมด?
นี่คือสิ่งที่ต้องพิจารณา: ตามคู่มือการศึกษาการรับรอง MySQL 5.0 ,
bulletpoint # 11กล่าวว่าสิ่งต่อไปนี้ในหน้า 408,409 มาตรา 29.2:
หากคุณใช้พื้นที่ดิสก์ไม่เพียงพอในขณะที่เพิ่มแถวลงในตาราง MyISAM จะไม่มีข้อผิดพลาดเกิดขึ้น เซิร์ฟเวอร์หยุดการทำงานชั่วคราวจนกว่าพื้นที่ว่างจะพร้อมใช้งานจากนั้นดำเนินการให้เสร็จสิ้น
เมื่อคุณใช้พื้นที่ดิสก์หมดอย่าเพิ่งปิดหรือฆ่า mysql จำนวนของการจัดการไฟล์ที่เปิดใน MyISAM ใด ๆ ที่ใช้ในปัจจุบันจะไม่ถูกล้างออก ดังนั้นตาราง MyISAM ถูกทำเครื่องหมายว่าขัดข้อง หากคุณสามารถเพิ่มเนื้อที่ว่างในดิสก์ในโวลุ่มข้อมูลโดยที่ mysqld ยังคงทำงานอยู่ mysqld จะเป็นทหารเมื่อมีพื้นที่ว่างในดิสก์