MySQL ngừng hoạt động đơn giản có nghĩa là dịch vụ MySQL của bạn không thể truy cập hoặc không phản hồi theo quan điểm của người khác. Sự cố mất điện có thể bắt nguồn từ nhiều nguyên nhân có thể xảy ra ..
- Sự cố mạng - Sự cố kết nối, chuyển đổi, định tuyến, trình phân giải, cấp cân bằng tải.
- Vấn đề về tài nguyên - Bạn đã đạt đến giới hạn tài nguyên hay nút thắt cổ chai.
- Định cấu hình sai - Quyền hoặc quyền sở hữu sai, biến không xác định, mật khẩu sai, đặc quyền đã thay đổi.
- Khóa - Toàn cục hoặc khóa bảng ngăn người khác truy cập vào dữ liệu.
Trong bài đăng trên blog này, chúng ta sẽ xem xét một số bước cần thực hiện nếu bạn gặp sự cố MySQL (môi trường Linux).
Bước Một:Lấy Mã Lỗi
Khi bạn gặp sự cố, ứng dụng của bạn sẽ xuất hiện một số lỗi và ngoại lệ. Những lỗi này thường đi kèm với mã lỗi, mã này sẽ cung cấp cho bạn ý tưởng sơ bộ về những gì bạn đang gặp phải và những việc cần làm tiếp theo để khắc phục sự cố và khôi phục sự cố.
Để biết thêm chi tiết về lỗi, hãy kiểm tra các trang Mã lỗi MySQL hoặc Mã lỗi MariaDB tương ứng để tìm ra lỗi có nghĩa là gì.
Bước Hai:Máy chủ MySQL có đang chạy không?
Đăng nhập vào máy chủ qua thiết bị đầu cuối và xem MySQL daemon có đang chạy hay không và nghe đúng cổng. Trong Linux, người ta sẽ làm như sau:
Trước tiên, hãy kiểm tra quy trình MySQL:
$ ps -ef | grep -i mysql
Đổi lại bạn sẽ nhận được thứ gì đó. Nếu không, MySQL không chạy. Nếu MySQL không chạy, hãy thử khởi động nó:
$ systemctl start mysql # systemd
$ service mysql start # sysvinit/upstart
$ mysqld_safe # manual
Nếu bạn thấy lỗi ở bước trên, bạn nên xem nhật ký lỗi MySQL, nhật ký lỗi này thay đổi tùy thuộc vào hệ điều hành và cấu hình biến MySQL cho log_error trong tệp cấu hình MySQL. Đối với máy chủ dựa trên RedHat, tệp thường được đặt tại:
$ cat /var/log/mysqld.log
Chú ý đến các dòng gần đây nhất có mức nhật ký "[Lỗi]". Một số dòng được gắn nhãn "[Cảnh báo]" có thể chỉ ra một số vấn đề, nhưng những vấn đề đó khá hiếm gặp. Hầu hết thời gian, các vấn đề về cấu hình sai và tài nguyên có thể được phát hiện từ đây.
Nếu MySQL đang chạy, hãy kiểm tra xem nó có đang nghe đúng cổng hay không:
$ netstat -tulpn | grep -i mysql
tcp6 0 0 :::3306 :::* LISTEN 1089/mysqld
Bạn sẽ nhận được tên tiến trình "mysqld", lắng nghe trên tất cả các giao diện (:::3306 hoặc 0.0.0.0:3306) trên cổng 3306 với PID 1089 và trạng thái là "LISTEN". Nếu bạn thấy dòng trên hiển thị 127.0.0.1:3306, MySQL chỉ đang lắng nghe cục bộ. Bạn có thể cần thay đổi giá trị bind_address trong tệp cấu hình MySQL để lắng nghe tất cả các địa chỉ IP hoặc chỉ cần nhận xét về dòng.
Bước 3:Kiểm tra các vấn đề về kết nối
Nếu máy chủ MySQL đang chạy tốt mà không có lỗi bên trong nhật ký lỗi MySQL, khả năng sự cố kết nối đang xảy ra là khá cao. Bắt đầu bằng cách kiểm tra kết nối với máy chủ thông qua ping (nếu ICMP được bật) và telnet tới máy chủ MySQL từ máy chủ ứng dụng:
(application-server)$ ping db1.mydomain.com
(application-server)$ telnet db1.mydomain.com 3306
Trying db1.mydomain.com...
Connected to 192.168.0.16.
Escape character is '^]'.
O
5.6.46-86.2sN&nz9NZ�32?&>H,EV`_;mysql_native_password
Bạn sẽ thấy một số dòng trong đầu ra telnet nếu bạn có thể kết nối với cổng MySQL. Bây giờ, hãy thử lại một lần nữa bằng cách sử dụng máy khách MySQL từ máy chủ ứng dụng:
(application-server)$ mysql -u db_user -p -h db1.mydomain.com -P3306
ERROR 1045 (28000): Access denied for user 'db_user'@'db1.mydomain.com' (using password: YES)
Trong ví dụ trên, lỗi cung cấp cho chúng ta một chút thông tin về việc cần làm tiếp theo. Ở trên có thể do ai đó đã thay đổi mật khẩu cho "db_user" hoặc mật khẩu cho người dùng này đã hết hạn. Đây là một hành vi khá bình thường từ MySQL 5.7. 4 trở lên, trong đó chính sách hết hạn mật khẩu tự động được bật theo mặc định với ngưỡng 360 ngày - nghĩa là tất cả mật khẩu sẽ hết hạn mỗi năm một lần.
Bước 4:Kiểm tra danh sách xử lý MySQL
Nếu MySQL đang chạy tốt mà không có sự cố kết nối, hãy kiểm tra danh sách quy trình MySQL để xem những quy trình nào hiện đang chạy:
mysql> SHOW FULL PROCESSLIST;
+-----+------+-----------+------+---------+------+-------+-----------------------+-----------+---------------+
| Id | User | Host | db | Command | Time | State | Info | Rows_sent | Rows_examined |
+-----+------+-----------+------+---------+------+-------+-----------------------+-----------+---------------+
| 117 | root | localhost | NULL | Query | 0 | init | SHOW FULL PROCESSLIST | 0 | 0 |
+-----+------+-----------+------+---------+------+-------+-----------------------+-----------+---------------+
1 row in set (0.01 sec)
Chú ý đến cột Thông tin và Thời gian. Một số hoạt động MySQL có thể đủ phá hoại để làm cho cơ sở dữ liệu ngừng hoạt động và không phản hồi. Các câu lệnh SQL sau, nếu đang chạy, có thể chặn người khác truy cập vào cơ sở dữ liệu hoặc bảng (điều này có thể khiến dịch vụ MySQL ngừng hoạt động trong thời gian ngắn từ góc độ ứng dụng):
- BẢNG FLUSH CÓ KHÓA ĐỌC
- BẢNG KHÓA ...
- BẢNG THAY THẾ ...
Một số giao dịch đang chạy lâu cũng có thể làm ngưng trệ những giao dịch khác, điều này cuối cùng sẽ gây ra thời gian chờ cho các giao dịch khác đang chờ truy cập vào cùng một tài nguyên. Bạn có thể kết thúc giao dịch tấn công để cho phép những người khác truy cập vào cùng các hàng hoặc thử lại các giao dịch xếp hàng sau khi giao dịch dài kết thúc.
Kết luận
Giám sát chủ động thực sự quan trọng để giảm thiểu nguy cơ ngừng hoạt động của MySQL. Nếu cơ sở dữ liệu của bạn được quản lý bởi ClusterControl, tất cả các khía cạnh được đề cập sẽ được theo dõi tự động mà không cần bất kỳ cấu hình bổ sung nào từ người dùng. Bạn sẽ nhận được cảnh báo trong hộp thư đến của mình về các phát hiện bất thường như truy vấn chạy lâu, máy chủ định cấu hình sai, tài nguyên vượt ngưỡng và nhiều hơn nữa. Ngoài ra, ClusterControl sẽ tự động tìm cách khôi phục dịch vụ cơ sở dữ liệu của bạn nếu có sự cố xảy ra với máy chủ hoặc mạng.
Bạn cũng có thể tìm hiểu thêm về MySQL &MariaDB Disaster Recovery bằng cách đọc whitepaper của chúng tôi.