Thứ năm, 07/03/2019 | 00:00 GMT+7

Cách sửa chữa bảng bị hỏng trong MySQL

Hướng dẫn này nhằm phục vụ như một tài nguyên khắc phục sự cố và điểm bắt đầu khi bạn chẩn đoán cài đặt MySQL của bạn

Ta sẽ xem xét một số vấn đề mà nhiều user MySQL gặp phải và cung cấp hướng dẫn để khắc phục sự cố cụ thể. Ta cũng sẽ bao gồm các liên kết đến các hướng dẫn DigitalOcean và tài liệu MySQL chính thức có thể hữu ích trong một số trường hợp nhất định.

Đôi khi, các bảng MySQL có thể bị hỏng, nghĩa là đã xảy ra lỗi và không thể đọc được dữ liệu được lưu giữ bên trong chúng. Nỗ lực đọc từ một bảng bị hỏng thường sẽ dẫn đến sự cố server .

Một số nguyên nhân phổ biến của bảng bị hỏng là:

  • Server MySQL dừng giữa chừng khi ghi.
  • Một chương trình bên ngoài sửa đổi một bảng được server sửa đổi đồng thời.
  • Máy bị tắt đột ngột.
  • Phần cứng máy tính bị lỗi.
  • Có một lỗi phần mềm ở đâu đó trong mã MySQL.

Nếu bạn nghi ngờ rằng một trong các bảng của bạn đã bị hỏng, bạn nên backup folder dữ liệu trước khi khắc phục sự cố hoặc cố gắng sửa bảng. Điều này sẽ giúp giảm thiểu nguy cơ mất dữ liệu.

Đầu tiên, dừng dịch vụ MySQL:

  • sudo systemctl stop mysql

Sau đó, sao chép tất cả dữ liệu vào một folder backup mới. Trên hệ thống Ubuntu, folder dữ liệu mặc định là /var/lib/mysql/ :

  • cp -r /var/lib/mysql /var/lib/mysql_bkp

Sau khi tạo bản backup , bạn đã sẵn sàng để bắt đầu điều tra xem bảng có thực sự bị hỏng hay không. Nếu bảng sử dụng công cụ lưu trữ MyISAM , bạn có thể kiểm tra xem nó có bị hỏng hay không bằng cách chạy câu lệnh CHECK TABLE từ dấu nhắc MySQL:

  • CHECK TABLE table_name;

Một thông báo sẽ xuất hiện trong kết quả của câu lệnh này cho bạn biết liệu nó có bị hỏng hay không. Nếu bảng MyISAM thực sự bị hỏng, nó thường có thể được sửa chữa bằng cách đưa ra câu lệnh REPAIR TABLE :

  • REPAIR TABLE table_name;

Giả sử sửa chữa thành công, bạn sẽ thấy một thông báo như sau trong kết quả của bạn :

Output
+--------------------------+--------+----------+----------+
| Table                    | Op     | Msg_type | Msg_text |
+--------------------------+--------+----------+----------+
| database_name.table_name | repair | status   | OK       |
+--------------------------+--------+----------+----------+

Tuy nhiên, nếu bảng vẫn bị hỏng, tài liệu MySQL đề xuất một số phương pháp thay thế để sửa chữa các bảng bị hỏng .

Mặt khác, nếu bảng bị hỏng sử dụng công cụ lưu trữ InnoDB , thì quá trình sửa chữa nó sẽ khác. InnoDB là công cụ lưu trữ mặc định trong MySQL kể từ version 5.5 và nó có các hoạt động kiểm tra và sửa chữa lỗi tự động. InnoDB kiểm tra các trang bị hỏng bằng cách thực hiện tổng kiểm tra trên mọi trang mà nó đọc và nếu phát hiện thấy sự khác biệt về tổng kiểm, nó sẽ tự động dừng server MySQL.

Hiếm khi cần phải sửa chữa bảng InnoDB, vì InnoDB có cơ chế khôi phục sự cố có thể giải quyết hầu hết các sự cố khi server được khởi động lại. Tuy nhiên, nếu bạn gặp phải tình huống cần tạo lại bảng InnoDB bị hỏng, tài liệu MySQL khuyên bạn nên sử dụng phương pháp “Dump và Reload ” . Điều này liên quan đến việc lấy lại quyền truy cập vào bảng bị hỏng, sử dụng trình mysqldump để tạo một bản backup hợp lý của bảng, bản backup hợp lý này sẽ giữ lại cấu trúc bảng và dữ liệu bên trong, sau đó reload bảng vào database .

Với ý nghĩ đó, hãy thử khởi động lại dịch vụ MySQL để xem liệu làm như vậy có cho phép bạn truy cập vào server hay không:

  • sudo systemctl restart mysql

Nếu server vẫn bị lỗi hoặc không thể truy cập được, thì có thể hữu ích khi bật tùy chọn force_recovery của InnoDB. Bạn có thể thực hiện việc này bằng cách chỉnh sửa file mysqld.cnf :

  • sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Trong phần [mysqld] , hãy thêm dòng sau:

/etc/mysql/mysql.conf.d/mysqld.cnf
. . .
[mysqld]
. . .
innodb_force_recovery=1

Lưu file , sau đó thử khởi động lại dịch vụ MySQL. Nếu bạn có thể truy cập thành công bảng bị hỏng, hãy sử dụng trình mysqldump để kết xuất dữ liệu bảng của bạn sang một file mới. Bạn có thể đặt tên file này bất cứ thứ gì bạn thích, nhưng ở đây ta sẽ đặt tên nó ra out.sql :

  • mysqldump database_name table_name > out.sql

Sau đó thả bảng khỏi database . Để tránh phải mở lại dấu nhắc MySQL, bạn có thể sử dụng cú pháp sau:

  • mysql -u user -p --execute="DROP TABLE database_name.table_name"

Sau đó, khôi phục bảng với file kết xuất bạn vừa tạo:

  • mysql -u user -p < out.sql

Lưu ý công cụ lưu trữ InnoDB thường có khả năng chịu lỗi cao hơn công cụ MyISAM cũ hơn. Bàn sử dụng InnoDB vẫn có thể bị hỏng, nhưng vì nó tự động phục hồi tính năng rủi ro của bảng tham nhũng và bị treo là decidedly giảm.


Tags:

Các tin liên quan

Cách cho phép truy cập từ xa vào MySQL
2019-03-07
Cách khắc phục sự cố lỗi socket trong MySQL
2019-03-07
Cách giải quyết sự cố trong MySQL
2019-03-07
Cách khắc phục sự cố truy vấn MySQL
2019-03-07
Giới thiệu về Truy vấn trong MySQL
2018-10-17
Cách cài đặt MySQL mới nhất trên Debian 9
2018-09-05
Cách đặt lại mật khẩu gốc MySQL hoặc MariaDB của bạn trên Ubuntu 18.04
2018-09-04
Cách tạo một cụm MySQL nhiều node trên Ubuntu 18.04
2018-07-26
Cách cài đặt MySQL mới nhất trên Ubuntu 18.04
2018-07-12
Cách di chuyển thư mục dữ liệu MySQL đến vị trí mới trên Ubuntu 18.04
2018-07-06