MySQL là một 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 ) thuộc sở hữu của Oracle . Trong nhiều năm, nó đã là lựa chọn mặc định cho các ứng dụng dựa trên web và vẫn còn phổ biến so với các công cụ cơ sở dữ liệu khác.
MySQL được thiết kế và tối ưu hóa cho các ứng dụng web - nó tạo thành 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 người khác.
Trang web hoặc ứng dụng web của bạn có được cung cấp bởi MySQL ? 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 MySQL máy chủ cơ sở dữ liệu. Chúng tôi sẽ mô tả cách xác định nguyên nhân của các vấn đề và phải làm gì để 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ó MySQL máy chủ (mysqld)
đ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 quá trình có tên mysqld
trên máy chủ 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 như được hiển thị.
$ ps xa | grep mysqld | grep -v mysqld
Nếu các lệnh trên không hiển thị đầu ra, 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 MySQL trạng thái dịch vụ, 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, MySQL dịch vụ đã không thành công. 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ư được hiển thị bằng lệnh sau mà bạn vẫn thấy lỗi trên, bạn cũng nên xác minh rằng TCP / IP cổng bị chặn bởi tường lửa hoặc bất kỳ dịch vụ chặn cổng nào.
$ 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) Không thể kết nối với máy chủ MySQL trên‘ máy chủ ’(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ó MySQL máy chủ đang chạy trên hệ thống như hình trên. Đồ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 máy chủ có thể đang chạy, tuy nhiên, bạn đang cố gắng kết nối bằng TCP / IP cổng, đường ống được đặt tên hoặc tệp ổ cắm Unix khác với tệp mà máy chủ đang lắng nghe.
3. Truy cập các lỗi bị từ chối trong MySQL
Trong MySQL , tài khoản người dùng được xác định theo nghĩa của tên người dùng và máy khách hoặc các máy chủ mà từ đó người dùng có thể kết nối với máy chủ. Ngoài ra, 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 dẫn đến “ Quyền truy cập bị từ chối ”, Một trong những nguyên nhân phổ biến là liên quan đến tài khoản MySQL mà máy chủ cho phép các chương trình 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 các 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 vào 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 khách bạn đang sử dụng hay không và có thể là máy chủ mà 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 SHOW GRANTS
lệnh 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ể đối với địa chỉ ip từ xa bằng cách sử dụng các lệnh sau trong MySQL shell.
> 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ể do sự cố 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 , thời gian chờ kết nối hoặc sự cố với BLOB giá trị 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à thời gian chờ kết nối vấn đề, đặc biệt là khi MySQL đang cố gắng sử dụng kết nối ban đầu với máy chủ, hãy tăng giá trị của connect_timeout tham số. 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/my.cnf của bạn tệp cấu hình trong [mysqld]
hoặc [client]
phần như hình.
[mysqld] connect_timeout=100 max_allowed_packet=500M
Nếu MySQL Bạn không thể truy cập tệp cấu hình, khi đó bạn có thể đặt giá trị này bằng cách sử dụng lệnh sau trong MySQL shell.
> 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 MySQL khách hàng gặp phải “ quá nhiều kết nối ”, Nó có nghĩa là tất cả các kết nối có sẵn đang được sử dụng bởi các máy khách khác. Số lượng kết nối (mặc định là 151 ) được điều khiển bởi max_connections
biến hệ thống; 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 /etc/my.cnf của bạn tệp cấu hình.
[mysqld] max_connections=1000
6. MySQL hết bộ nhớ
Trong trường hợp bạn chạy truy vấn bằng MySQL chương trình khách và gặp phải lỗi được đề cập, điều đó có nghĩa là MySQL không có đủ bộ nhớ để lưu 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 sử dụng trực tiếp ứng dụng khách MySQL, hãy bắt đầu với
--quick switch
, để tắt kết quả được lưu trong bộ nhớ cache hoặc - nếu bạn đang sử dụng MyODBC trình điều khiển, giao diện người dùng cấu hình (UI) có một tab nâng cao cho cờ. Chọn “ Không lưu kết quả vào bộ nhớ cache “.
Một công cụ tuyệt vời khác là MySQL Tuner - 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 gợi ý về cách cấu hình nó để 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 Điều chỉnh và Tối ưu hóa Hiệu suất MySQL / MariaDB hữu ích.
7. MySQL tiếp tục gặp sự cố
Nếu bạn gặp sự cố này, bạn nên cố gắng tìm hiểu xem sự cố có phải là MySQL máy chủ chết hoặc máy khách của nó có 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ủ để thiết lập xem nó đã hoạt động và 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 MySQL máy chủ và cho phép 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ổ đầu cuối bổ sung và chạy lệnh sau để hiển thị 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 Điều gì đang gây ra vấn đề hoặc lỗi
Mặc dù chúng tôi đã xem xét một số MySQL phổ biến các vấn đề và lỗi 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 nó (về nguyên nhân gây ra lỗi).
Vì vậy, làm thế nào bạn có thể xác định đ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ố:
- 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ư đuôi để đọc qua các tệp nhật ký. - Nếu dịch vụ MySQL không khởi động được, hãy kiểm tra trạng thái của dịch vụ đó bằng systemctl hoặc sử dụng journetctl (với
-xe
cờ) lệnh trong systemd để kiểm tra vấn đề. - Bạn cũng có thể kiểm tra tệp nhật ký hệ thống, chẳng hạn như
/var/log/messages
hoặc tương tự để biết lý do cho sự cố của bạn. - Thử sử dụng các công cụ như Mytop, glances, top, ps hoặc htop để kiểm tra chương trình nào đang chiếm toàn bộ 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 hay một số tài nguyên quan trọng khác.
- Giả sử vấn đề đó là một số quá trình đang chạy, bạn luôn có thể cố gắng loại bỏ nó (bằng cách sử dụng tiện ích pkill hoặc kill) để MySQL hoạt động bình thường.
- Giả sử rằng mysqld máy chủ đang gây ra sự cố, bạn có thể chạy lệnh:
mysqladmin -u root ping
hoặcmysqladmin -u root processlist
để nhận bất kỳ phản hồi nào từ nó. - Nếu sự cố xảy ra với chương trình 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 xem tại sao nó không hoạt động tốt, cố gắng 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:
- Học MySQL / MariaDB cho người mới bắt đầu - Phần 1
- Cách giám sát Cơ sở dữ liệu MySQL / MariaDB bằng Netdata trên CentOS 7
- Cách chuyển tất cả cơ sở dữ liệu MySQL từ máy chủ cũ sang máy chủ mới
- Mytop - Một Công cụ Hữu ích để Giám sát Hiệu suất MySQL / MariaDB trong Linux
- 12 Phương pháp Tốt nhất về Bảo mật MySQL / MariaDB cho Linux
Để biết thêm thông tin, hãy tham khảo hướng dẫn sử dụng MySQL Reference liên quan đến các vấn đề và lỗi thường gặp, nó liệt kê toàn diện các vấn đề và thông báo lỗi phổ biến mà bạn có thể gặp phải khi sử dụng MySQL, bao gồm cả những vấn đề chúng ta đã thảo luận ở trên và hơn thế nữa.