Khắc phục lỗi "Table is crashed and last repair failed" (Error 144) trong MySQL/MariaDB
Bạn đã từng gặp phải lỗi "Table is crashed and last repair failed" (lỗi 144) khiến MySQL hoặc MariaDB không thể khởi động? Lỗi này thường xuất hiện khi một bảng cơ sở dữ liệu bị hỏng nặng và các nỗ lực sửa chữa trước đó không thành công. Nếu bảng bị hỏng là một bảng hệ thống quan trọng (ví dụ: trong cơ sở dữ liệu mysql
), nó có thể ngăn toàn bộ hệ thống cơ sở dữ liệu của bạn hoạt động.
Bài viết này sẽ hướng dẫn bạn các bước chi tiết để khắc phục lỗi này bằng phương pháp sửa chữa ngoại tuyến.
Triệu chứng điển hình
Bạn có thể thấy các thông báo lỗi tương tự như sau trong nhật ký lỗi của MySQL/MariaDB:
2023-09-12 12:00:27 0 [ERROR] mariadbd: Got error '144 "Table is crashed and last repair failed"' for './mysql/db'
2023-09-12 12:00:27 0 [ERROR] Fatal error: Can't open and lock privilege tables: Got error '144 "Table is crashed and last repair failed"' for './mysql/db'
2023-09-12 12:00:27 0 [ERROR] Aborting
Nếu MySQL/MariaDB không thể khởi động, bạn sẽ không thể sử dụng các lệnh như mysqlcheck
hoặc REPAIR TABLE
trực tiếp. Chúng ta sẽ cần đến các công cụ sửa chữa ngoại tuyến.
Các bước khắc phục sự cố (Sửa offline)
Bước 1: Xác định Engine của bảng bị hỏng
Trước tiên, bạn cần biết bảng bị hỏng sử dụng engine nào (ví dụ: InnoDB, MyISAM, Aria).
- Nếu là InnoDB: Quy trình khôi phục sẽ khác và thường liên quan đến cấu hình
innodb_force_recovery
. - Nếu là MyISAM hoặc Aria: Chúng ta sẽ sử dụng các công cụ
myisamchk
hoặcaria_chk
tương ứng.
Cách xác định engine khi MySQL đang tắt: Kiểm tra phần mở rộng tệp của bảng trong thư mục cơ sở dữ liệu (thường là /var/lib/mysql/database_name/
).
- MyISAM: Các tệp có phần mở rộng
.MYI
,.MYD
, và.frm
. - Aria: Các tệp có phần mở rộng
.MAI
,.MAD
, và.frm
.
Ví dụ: Nếu lỗi của bạn liên quan đến ./mysql/db
, hãy kiểm tra các tệp của nó:
ls -lh /var/lib/mysql/mysql/db.*
Nếu bạn thấy các tệp như db.MAD
và db.MAI
, điều đó cho thấy đây là một bảng Aria.
Bước 2: Dừng hoàn toàn dịch vụ MySQL/MariaDB
Đây là bước cực kỳ quan trọng! Các công cụ sửa chữa ngoại tuyến không được chạy trên một cơ sở dữ liệu đang hoạt động.
sudo systemctl stop mariadb # Hoặc mysql nếu bạn đang dùng MySQL
sudo systemctl disable mariadb # Để ngăn chặn khởi động lại ngẫu nhiên
sudo systemctl mask mariadb # Để ngăn chặn khởi động lại thêm nữa
Sau khi chạy các lệnh trên, hãy xác minh rằng không có tiến trình mysqld
hoặc mariadbd
nào đang chạy:
pgrep -a -f 'mysqld|mariadbd'
Nếu có bất kỳ kết quả nào, hãy đảm bảo rằng bạn đã dừng dịch vụ thành công.
Bước 3: Chạy công cụ sửa chữa thích hợp
Điều hướng đến thư mục chứa các tệp bảng bị hỏng và chạy công cụ sửa chữa.
-
Đối với bảng Aria (như
mysql.db
trong ví dụ):cd /var/lib/mysql/mysql sudo aria_chk -r db # Lệnh '-r' có nghĩa là "recover" (khôi phục)
Bạn có thể thấy thông báo "aria_chk: Got error 'Can't find file' when trying to use aria control file './aria_log_control'". Điều này thường là bình thường trong quá trình khôi phục nếu tệp nhật ký cũng bị ảnh hưởng; công cụ sẽ vẫn tiếp tục.
-
Đối với bảng MyISAM:
sudo myisamchk -r /path/to/datadir/database_name/table_name.MYI # Hoặc, nếu bạn đã cd vào thư mục chứa bảng: # sudo myisamchk -r table_name
Bước 4: Cố gắng khởi động lại MySQL/MariaDB
Sau khi sửa chữa, hãy thử khởi động lại dịch vụ:
sudo systemctl unmask mariadb # Hoặc mysql
sudo systemctl start mariadb # Hoặc mysql
Bước 5: Xử lý nếu có bảng bị hỏng khác
Nếu MySQL/MariaDB vẫn không khởi động được và nhật ký lỗi chỉ ra một bảng bị hỏng khác (ví dụ: mysql.global_priv
), bạn cần lặp lại quy trình:
- Dừng dịch vụ MySQL/MariaDB.
- Xác định engine của bảng mới bị hỏng.
- Chạy công cụ sửa chữa tương ứng.
- Thử khởi động lại.
Bước 6: Kiểm tra sau sửa chữa
Khi MySQL/MariaDB đã khởi động thành công, bạn nên thực hiện kiểm tra đầy đủ tất cả các cơ sở dữ liệu và bảng để đảm bảo không còn lỗi ẩn:
mysqlcheck -Asc # Kiểm tra tất cả cơ sở dữ liệu, tìm lỗi, kiểm tra bảng
Nếu lệnh này báo cáo thêm lỗi, bạn có thể thử sửa chữa trực tuyến cho các cơ sở dữ liệu hoặc bảng cụ thể:
mysqlcheck -r database_name # Sửa chữa một cơ sở dữ liệu cụ thể
mysqlcheck -r database_name table_name # Sửa chữa một bảng cụ thể
Hy vọng hướng dẫn này sẽ giúp bạn khắc phục lỗi "Table is crashed and last repair failed" một cách hiệu quả. Đừng quên luôn sao lưu dữ liệu thường xuyên để tránh những rủi ro không đáng có!
Ủng hộ Chung Nguyễn Blog
Chung Nguyễn Blog sử dụng FlashVPS - Dịch vụ quản trị máy chủ chuyên nghiệp để quản lý VPS
#FlashVPS là dịch vụ cloud panel trên nền tảng web hỗ trợ khách hàng:
- * Quản lý máy chủ số lượng nhiều
- * Không có kinh nghiệm quản lý máy chủ
- * Thích sử dụng giao diện web đơn giản, trực quan hơn terminal
- * Quá nhàm chán với việc ghi nhớ và lặp lại việc gõ các câu lệnh
- * Muốn tự động hóa mọi thao tác
- * Muốn tiết kiệm thời gian quản trị máy chủ
- * Muốn tiết kiệm tiền bạc, nhân lực quản trị máy chủ 👉 https://flashvps.dev
Các bài viết trên website thường xuyên được đăng tải và cập nhật trên trang Facebook Chung Nguyễn Blog hãy tặng cho Chung một LIKE nhé! Mãi yêu các bạn!
813 👍Đánh giá bài viết

Bình luận