Tìm kiếm trang web

Lời khuyên hữu ích để khắc phục các lỗi thường gặp trong MySQL


MySQL là hệ thống quản lý cơ sở dữ liệu quan hệ nguồn mở được sử dụng rộng rãi (RDMS) do Oracle sở hữu. Trong nhiều năm qua, nó đã là lựa chọn mặc định cho các ứng dụng dựa trên web và vẫn phổ biến so với các công cụ cơ sở dữ liệu khác.

Đọc thêm: Cách cài đặt MySQL mới nhất trên RHEL/CentOS và Fedora

MySQL được thiết kế và tối ưu hóa cho các ứng dụng web – nó là một phần không thể thiếu của các ứng dụng dựa trên web chính như Facebook, Twitter, Wikipedia, YouTube và nhiều trang khác.

Trang web hoặc ứng dụng web của bạn có được hỗ trợ bởi MySQL không? Trong bài viết chi tiết này, chúng tôi sẽ giải thích cách khắc phục sự cố và các lỗi phổ biến trong máy chủ cơ sở dữ liệu MySQL. Chúng tôi sẽ mô tả cách xác định nguyên nhân của vấn đề và những việc cần làm để giải quyết chúng.

1. Không thể kết nối với máy chủ MySQL cục bộ

Một trong những lỗi kết nối máy khách với máy chủ phổ biến trong MySQL là “ERROR 2002 (HY000): Không thể kết nối với máy chủ MySQL cục bộ thông qua socket '/var/run/mysqld/mysqld.sock' (2) ”.

Lỗi này cho biết rằng không có máy chủ MySQL (mysqld) nào đang chạy trên hệ thống máy chủ hoặc bạn đã chỉ định sai tên tệp ổ cắm Unix hoặc TCP/IP< khi cố gắng kết nối với máy chủ.

Đảm bảo rằng máy chủ đang chạy bằng cách kiểm tra quy trình có tên mysqld trên máy chủ lưu trữ máy chủ cơ sở dữ liệu của bạn bằng cách sử dụng lệnh ps và lệnh grep cùng nhau như minh họa.

ps xa | grep mysqld | grep -v mysqld

Nếu các lệnh trên không hiển thị kết quả thì máy chủ cơ sở dữ liệu không chạy. Do đó, khách hàng không thể kết nối với nó. Để khởi động máy chủ, hãy chạy lệnh systemctl sau.

sudo systemctl start mysql        #Debian/Ubuntu
sudo systemctl start mysqld       #RHEL/CentOS/Fedora

Để xác minh trạng thái dịch vụ MySQL, hãy sử dụng lệnh sau.

sudo systemctl status mysql       #Debian/Ubuntu
sudo systemctl status mysqld      #RHEL/CentOS/Fedora

Từ đầu ra của lệnh trên, dịch vụ MySQL đã bị lỗi. Trong trường hợp như vậy, bạn có thể thử khởi động lại và kiểm tra trạng thái của nó một lần nữa.

sudo systemctl restart mysql
sudo systemctl status mysql

Ngoài ra, nếu máy chủ đang chạy như hiển thị bằng lệnh sau nhưng bạn vẫn thấy lỗi trên thì bạn cũng nên xác minh xem cổng TCP/IP có bị chặn bởi tường lửa hoặc bất kỳ dịch vụ chặn cổng nào không .

ps xa | grep mysqld | grep -v mysqld

Để tìm cổng mà máy chủ đang nghe, hãy sử dụng lệnh netstat như được hiển thị.

sudo netstat -tlpn | grep "mysql"

2. Không thể kết nối với máy chủ MySQL

Một lỗi kết nối thường gặp khác là “(2003) Can’t connect to MySQL server on ‘server’ (10061) ”, có nghĩa là kết nối mạng đã bị từ chối.

Tại đây, hãy bắt đầu bằng cách kiểm tra xem có máy chủ MySQL đang chạy trên hệ thống như minh họa ở trên hay không. Đồng thời đảm bảo rằng máy chủ đã bật kết nối mạng và cổng mạng bạn đang sử dụng để kết nối là cổng được định cấu hình trên máy chủ.

Các lỗi phổ biến khác mà bạn có thể gặp phải khi cố gắng kết nối với máy chủ MySQL là:

ERROR 2003: Can't connect to MySQL server on 'host_name' (111)
ERROR 2002: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111)

Những lỗi này cho thấy rằng máy chủ có thể đang chạy, tuy nhiên, bạn đang cố gắng kết nối bằng cổng TCP/IP, ống dẫn có tên hoặc tệp ổ cắm Unix khác với tệp mà máy chủ đang lắng nghe.

3. Lỗi từ chối truy cập trong MySQL

Trong MySQL, tài khoản người dùng được xác định theo tên người dùng và máy chủ hoặc các máy chủ khách mà từ đó người dùng có thể kết nối với máy chủ. Ngoài ra, một tài khoản cũng có thể có thông tin xác thực như mật khẩu.

Mặc dù có nhiều nguyên nhân khác nhau gây ra lỗi “Truy cập bị từ chối ” nhưng một trong những nguyên nhân phổ biến liên quan đến tài khoản MySQL mà máy chủ cho phép các chương trình máy khách sử dụng khi kết nối. Nó chỉ ra rằng tên người dùng được chỉ định trong kết nối không có đặc quyền truy cập cơ sở dữ liệu.

MySQL cho phép tạo tài khoản cho phép người dùng máy khách kết nối với máy chủ và truy cập dữ liệu do máy chủ quản lý. Về vấn đề này, nếu bạn gặp phải lỗi truy cập bị từ chối, hãy kiểm tra xem tài khoản người dùng có được phép kết nối với máy chủ thông qua chương trình máy khách mà bạn đang sử dụng hay không và có thể cả máy chủ nơi kết nối đến từ đó .

Bạn có thể xem những đặc quyền mà một tài khoản nhất định có bằng cách chạy lệnh SHOW GRANTS như được hiển thị.

> SHOW GRANTS FOR 'tecmint'@'localhost';

Bạn có thể cấp đặc quyền cho một người dùng cụ thể trên cơ sở dữ liệu cụ thể cho địa chỉ IP từ xa bằng cách sử dụng các lệnh sau trong shell MySQL.

> grant all privileges on *.test_db to 'tecmint'@'192.168.0.100';
> flush privileges;

Hơn nữa, lỗi truy cập bị từ chối cũng có thể xuất phát từ sự cố khi kết nối với MySQL, hãy tham khảo các lỗi đã giải thích trước đó.

4. Mất kết nối với máy chủ MySQL

Bạn có thể gặp phải lỗi này do một trong những lý do sau: kết nối mạng kém, hết thời gian kết nối hoặc sự cố với giá trị BLOB lớn hơn max_allowed_packet. Trong trường hợp có sự cố kết nối mạng, hãy đảm bảo rằng bạn có kết nối mạng tốt, đặc biệt nếu bạn đang truy cập máy chủ cơ sở dữ liệu từ xa.

Nếu đó là sự cố hết thời gian kết nối, đặc biệt khi MySQL đang cố gắng sử dụng kết nối ban đầu đến máy chủ, hãy tăng giá trị của tham số connect_timeout . Nhưng trong trường hợp giá trị BLOB lớn hơn max_allowed_packet, bạn cần đặt giá trị cao hơn cho max_allowed_packet trong /etc của mình /my.cnf tệp cấu hình trong phần [mysqld] hoặc [client] như được hiển thị.

[mysqld]
connect_timeout=100
max_allowed_packet=500M

Nếu bạn không thể truy cập được tệp cấu hình MySQL thì bạn có thể đặt giá trị này bằng lệnh sau trong shell MySQL.

> SET GLOBAL connect_timeout=100;
> SET GLOBAL max_allowed_packet=524288000;

5. Quá nhiều kết nối MySQL

Trong trường hợp máy khách MySQL gặp phải lỗi “quá nhiều kết nối ”, điều đó có nghĩa là tất cả các kết nối có sẵn đều đang được các máy khách khác sử dụng. Số lượng kết nối (mặc định là 151) được kiểm soát bởi biến hệ thống max_connections; bạn có thể khắc phục sự cố bằng cách tăng giá trị của nó để cho phép nhiều kết nối hơn trong tệp cấu hình /etc/my.cnf của bạn.

[mysqld]
max_connections=1000

6. MySQL hết bộ nhớ

Trong trường hợp bạn chạy truy vấn bằng chương trình máy khách MySQL và gặp lỗi được đề cập, điều đó có nghĩa là MySQL không có đủ bộ nhớ để lưu trữ toàn bộ kết quả truy vấn.

Bước đầu tiên là đảm bảo rằng truy vấn là chính xác, nếu đúng thì hãy làm như sau:

  • nếu bạn đang trực tiếp sử dụng máy khách MySQL, hãy khởi động nó bằng --quick switch, để tắt các kết quả được lưu trong bộ nhớ đệm hoặc
  • nếu bạn đang sử dụng trình điều khiển MyODBC, giao diện người dùng cấu hình (UI) có tab nâng cao dành cho cờ. Chọn “Không lưu kết quả vào bộ nhớ đệm“.

Một công cụ tuyệt vời khác là Bộ điều chỉnh MySQL – một tập lệnh hữu ích sẽ kết nối với máy chủ MySQL đang chạy và đưa ra đề xuất về cách cấu hình máy chủ để có hiệu suất cao hơn.

sudo apt-get install mysqltuner     #Debian/Ubuntu
sudo yum install mysqltuner         #RHEL/CentOS/Fedora
mysqltuner

Để biết các mẹo điều chỉnh hiệu suất và tối ưu hóa MySQL, hãy đọc bài viết của chúng tôi: 15 mẹo tối ưu hóa và điều chỉnh hiệu suất MySQL/MariaDB hữu ích.

7. MySQL liên tục gặp sự cố

Nếu gặp phải sự cố này, bạn nên cố gắng tìm hiểu xem sự cố là do máy chủ MySQL chết hay do máy khách gặp sự cố. Lưu ý rằng nhiều sự cố máy chủ là do tệp dữ liệu hoặc tệp chỉ mục bị hỏng.

Bạn có thể kiểm tra trạng thái máy chủ để xác định xem nó đã hoạt động được bao lâu.

sudo systemctl status mysql       #Debian/Ubuntu
sudo systemctl status mysqld      #RHEL/CentOS/Fedora

Ngoài ra, hãy chạy lệnh mysqladmin sau để tìm thời gian hoạt động của máy chủ MySQL.

sudo mysqladmin version -p 

Các giải pháp khác bao gồm nhưng không giới hạn ở việc dừng máy chủ MySQL và bật gỡ lỗi, sau đó khởi động lại dịch vụ. Bạn có thể thử tạo một trường hợp thử nghiệm có thể được sử dụng để lặp lại vấn đề. Ngoài ra, hãy mở một cửa sổ terminal bổ sung và chạy lệnh sau để hiển thị số liệu thống kê quy trình MySQL trong khi bạn chạy các truy vấn khác của mình:

sudo mysqladmin -i 5 status
OR
sudo mysqladmin -i 5 -r status 

Điểm mấu chốt: Xác định nguyên nhân gây ra sự cố hoặc lỗi

Mặc dù chúng tôi đã xem xét một số sự cố và lỗi phổ biến về MySQL cũng như cung cấp các cách khắc phục và giải quyết chúng, điều quan trọng nhất khi chẩn đoán lỗi là hiểu ý nghĩa của lỗi đó (về nguyên nhân gây ra lỗi) .

Vậy làm thế nào bạn có thể xác định được điều này? Những điểm sau đây sẽ hướng dẫn bạn cách xác định chính xác nguyên nhân gây ra sự cố:

  1. Bước đầu tiên và quan trọng nhất là xem xét nhật ký MySQL được lưu trữ trong thư mục /var/log/mysql/. Bạn có thể sử dụng các tiện ích dòng lệnh như tail để đọc qua các tệp nhật ký.
  2. Nếu dịch vụ MySQL không khởi động được, hãy kiểm tra trạng thái của nó bằng systemctl hoặc sử dụng lệnh journetctl (với cờ -xe) trong systemd để kiểm tra sự cố.
  3. Bạn cũng có thể kiểm tra tệp nhật ký hệ thống như /var/log/messages hoặc tệp tương tự để tìm nguyên nhân gây ra sự cố của mình.
  4. Hãy thử sử dụng các công cụ như Mytop, liếc nhìn, top, ps hoặc htop để kiểm tra xem chương trình nào đang chiếm hết CPU hoặc đang khóa máy hoặc để kiểm tra xem bạn có sắp hết bộ nhớ, dung lượng ổ đĩa, bộ mô tả tệp hoặc một số tài nguyên quan trọng khác không .
  5. Giả sử vấn đề đó là một quá trình chạy trốn nào đó, bạn luôn có thể cố gắng tiêu diệt nó (sử dụng tiện ích pkill hoặc kill) để MySQL hoạt động bình thường.
  6. Giả sử máy chủ mysqld đang gây ra sự cố, bạn có thể chạy lệnh: mysqladmin -u root ping hoặc mysqladmin -u root processlist để nhận bất kỳ vấn đề nào phản hồi từ nó.
  7. Nếu sự cố xảy ra với chương trình máy khách của bạn khi cố gắng kết nối với máy chủ MySQL, hãy kiểm tra lý do tại sao nó không hoạt động tốt, thử lấy bất kỳ đầu ra nào từ nó cho mục đích khắc phục sự cố.

Bạn cũng có thể muốn đọc các bài viết liên quan đến MySQL sau đây:

  1. Tìm hiểu MySQL/MariaDB cho người mới bắt đầu – Phần 1
  2. Cách giám sát cơ sở dữ liệu MySQL/MariaDB bằng Netdata trên CentOS 7
  3. Cách chuyển tất cả cơ sở dữ liệu MySQL từ máy chủ cũ sang máy chủ mới
  4. Mytop – Một công cụ hữu ích để theo dõi hiệu suất MySQL/MariaDB trong Linux
  5. 12 phương pháp thực hành tốt nhất về bảo mật MySQL/MariaDB dành cho Linux

Để biết thêm thông tin, hãy tham khảo Cẩm nang tham khảo MySQL liên quan đến Sự cố và Lỗi thường gặp, nó liệt kê toàn diện các sự cố phổ biến và thông báo lỗi mà bạn có thể gặp phải khi sử dụng MySQL, bao gồm cả những vấn đề chúng tôi đã thảo luận ở trên và hơn thế nữa.