Hướng dẫn xử lý database innodb MySQL bị crash trên DirectAdmin
Vì một vài lý do nào đó, hệ thống của bạn bị quá tải, hết tài nguyên v.v dẫn tới MySQL bị crash, cụ thể trong bài viết này là MySQL sử dụng Engine InnoDB mặc định bị crash, dẫn tới các file lưu tablespace của hệ thống InnoDB cùng với một số dữ liệu đang pending trong database bị corrupt, bạn không thể start lại được MySQL vì các cấu trúc của InnoDB lưu trong các file corrupt đã bị mất hoàn toàn.
Trường hợp database sử dụng innodb bị crash bạn có thể xử lý bằng cách sau:
– Bước 1: Bạn cho start mysql với mode readonly bằng cách:
Mở file: /etc/my.cnf > thêm dòng
innodb_force_recovery = 1
Có thể thay 1 bằng 4 hoặc 6 để start mysql
– Bước 2: Backup toàn bộ database trên server với lệnh:
mysqldump -u root -p --all-databases > alldb.sql
Trường hợp dump bị lỗi có thể dùng cmd dưới đây
mysqldump -u root -p --complete-insert --routines --triggers --single-transaction --all-databases > alldb.sql
Trường hơp việc dump all database bị lỗi, bạn xem xét dump từng database 1
với script
mysql -N -e 'show databases' | while read dbname; do mysqldump --complete-insert --routines --triggers --single-transaction "$dbname" > /root/backup_db_full/"$dbname".sql; done
– Bước 3: Backup lại folder /var/lib/mysql bằng lệnh: cp -r /var/lib/mysql /var/lib/mysql.bk
– Bước 4: Cho rename các file trong /var/lib/mysql: ibdata1, ib_logfile0, ib_logfile1
– Bước 5: Mở lại file /etc/my.cnf > bỏ dòng innodb_force_recovery trước đó đã thêm > restart lại mysql ở chế độ bình thường.
– Bước 6: Chạy lệnh bên dưới để đảm bảo mv hết các table sử dụng inodb
cd /var/lib/mysql/
find . -type f -name "*.ibd" -exec mv {} {}.bak \;
– Bước 7: Xong chạy import lại file alldb.sql
mysql -u root -p < /root/alldb.sql