MySQL의 일반적인 오류를 해결하는 유용한 팁


MySQL 오라클 에서 소유하고있는 널리 사용되는 오픈 소스 관계형 데이터베이스 관리 시스템입니다 ( RDMS ). 수년에 걸쳐 웹 기반 응용 프로그램의 기본 선택이었으며 다른 데이터베이스 엔진과 비교하여 여전히 인기가 있습니다.

MySQL 은 웹 응용 프로그램 용으로 설계되고 최적화되었으며, Facebook , Twitter , Wikipedia , YouTube 및 기타 여러 기능을 제공합니다.

귀하의 사이트 또는 웹 응용 프로그램에서 MySQL 을 사용할 수 있습니까? 이 문서에서는 MySQL 데이터베이스 서버의 문제 및 일반적인 오류를 해결하는 방법을 설명합니다. 우리는 문제의 원인을 파악하는 방법과 문제를 해결하기 위해 무엇을해야하는지 설명합니다.

1. 로컬 MySQL 서버에 연결할 수 없습니다.

MySQL의 일반적인 클라이언트 - 서버 연결 오류 중 하나는 " ERROR 2002 (HY000) : 소켓 '/var/run/mysqld/mysqld.sock (2) 을 통해 로컬 MySQL 서버에 연결할 수 없습니다. > ".

이 오류는 호스트 시스템에서 실행중인 MySQL 서버 (mysqld) 가 없거나 잘못된 UNIX 소켓 파일 이름 또는 TCP/IP 을 포트에 연결하려고합니다.

표시된 것처럼 ps 명령과 grep 명령을 함께 사용하여 데이터베이스 서버 호스트에서 mysqld 프로세스를 검사하여 서버가 실행 중인지 확인하십시오.

$ ps xa | grep mysqld | grep -v mysqld

위의 명령에 출력이 표시되지 않으면 데이터베이스 서버가 실행되고 있지 않습니다. 따라서 클라이언트는 연결할 수 없습니다. 서버를 시작하려면 다음의 systemctl 명령을 실행하십시오.

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

MySQL 서비스 상태를 확인하려면 다음 명령을 사용하십시오.

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

위 명령의 결과에서 MySQL 서비스가 실패했습니다. 이 경우 다시 시작하고 상태를 다시 한 번 확인할 수 있습니다.

$ sudo systemctl restart mysql
$ sudo systemctl status mysql

또한 서버가 다음 명령과 같이 실행 중이지만 위의 오류가 계속 표시되는 경우 방화벽이나 포트 차단 서비스에 의해 TCP/IP 포트가 차단되었는지도 확인해야합니다 .

$ ps xa | grep mysqld | grep -v mysqld

서버가 수신 대기중인 포트를 찾으려면 다음과 같이 netstat 명령을 사용하십시오.

$ sudo netstat -tlpn | grep "mysql"

2. MySQL 서버에 연결할 수 없다.

일반적으로 발생하는 또 다른 연결 오류는 " (2003) '서버의 MySQL 서버에 연결할 수 없습니다 (10061) "입니다. 이는 네트워크 연결이 거부되었음을 의미합니다.

여기에 위에서 설명한 것처럼 시스템에서 실행중인 MySQL 서버가 있는지 확인하십시오. 또한 서버에 네트워크 연결이 설정되어 있고 연결에 사용중인 네트워크 포트가 서버에 구성된 네트워크 포트인지 확인하십시오.

MySQL 서버에 연결하려고 할 때 발생할 수있는 다른 일반적인 오류는 다음과 같습니다.

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)

이 오류는 서버가 실행 중일 수 있음을 나타내지 만 TCP/IP 포트, 명명 된 파이프 또는 서버가 수신중인 소켓 파일과 다른 유닉스 소켓 파일을 사용하여 연결하려고합니다.

3. MySQL에서 액세스 거부 오류

MySQL 에서 사용자 계정은 사용자 이름 및 사용자가 서버에 연결할 수있는 클라이언트 호스트 또는 호스트로 정의됩니다. 또한 계정에는 암호와 같은 인증 자격 증명이있을 수 있습니다.

" 액세스가 거부 됨 "오류의 원인은 다양하지만 가장 일반적인 원인 중 하나는 서버가 클라이언트 프로그램에서 연결할 때 허용하는 MySQL 계정과 관련됩니다. 연결에 지정된 사용자 이름 에 데이터베이스에 대한 액세스 권한이 없음을 나타냅니다.

MySQL을 사용하면 클라이언트 사용자가 서버에 연결하여 서버에서 관리하는 데이터에 액세스 할 수있는 계정을 만들 수 있습니다. 이와 관련하여 액세스 거부 오류 가 발생하면 사용중인 클라이언트 프로그램을 통해 서버에 연결할 수 있는지 그리고 연결이 시작되는 호스트를 통해 사용자 계정이 허용되는지 확인하십시오 .

표시된 것처럼 SHOW GRANTS 명령을 실행하면 주어진 계정에 어떤 권한이 있는지 알 수 있습니다.

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

MySQL 쉘에서 다음 명령을 사용하여 특정 데이터베이스의 특정 사용자에게 원격 IP 주소에 대한 권한을 부여 할 수 있습니다.

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

또한 액세스 거부 오류 는 MySQL에 연결하는 데 따른 문제로 인해 발생할 수 있습니다. 앞에서 설명한 오류를 참조하십시오.

4. MySQL 서버와의 연결이 끊어졌습니다.

네트워크 연결 불량 , 연결 시간 초과 또는 BLOB 문제 값 중 하나가 원인 인 경우이 오류가 발생할 수 있습니다. max_allowed_packet . 네트워크 연결 문제가있는 경우 특히 원격 데이터베이스 서버에 액세스하는 경우 네트워크 연결 상태가 양호한 지 확인하십시오.

특히 MySQL 이 서버에 대한 초기 연결을 사용하려고 할 때 연결 시간 초과 문제인 경우 connect_timeout 매개 변수의 값을 늘리십시오 . 그러나 BLOB 값 max_allowed_packet 보다 큰 경우 /etc의 max_allowed_packet 값을 더 높게 설정해야합니다 [mysqld] 또는 [client] 섹션 아래에 /my.cnf 설정 파일을 추가하십시오.

[mysqld]
connect_timeout=100
max_allowed_packet=500M

MySQL 구성 파일에 액세스 할 수없는 경우 MySQL 쉘에서 다음 명령을 사용하여이 값을 설정할 수 있습니다.

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

5. 너무 많은 MySQL 연결

MySQL 클라이언트에서 " 연결이 너무 많습니다 "오류가 발생하면 사용 가능한 모든 연결이 다른 클라이언트에 의해 사용 중임을 의미합니다. 연결 수 (기본값은 151 )는 max_connections 시스템 변수에 의해 제어됩니다. /etc/my.cnf 구성 파일에서 더 많은 연결을 허용하도록 값을 증가시켜 문제를 해결할 수 있습니다.

[mysqld]
max_connections=1000

6. 메모리 부족

MySQL 클라이언트 프로그램을 사용하여 쿼리를 실행하고 문제의 오류가 발생하면 MySQL에 전체 쿼리 결과를 저장할 수있는 메모리가 부족하다는 의미입니다.

첫 번째 단계는 쿼리가 올바른지 확인하는 것입니다. 그렇다면 다음을 수행하십시오.

  • if you are using MySQL client directly, start it with --quick switch, to disable cached results or
  • if you are using the MyODBC driver, the configuration user interface (UI) has an advanced tab for flags. Check “Do not cache result“.

또 다른 훌륭한 도구는 MySQL 튜너 (MySQL Tuner) 입니다.이 스크립트는 실행중인 MySQL 서버에 연결하고 고성능을 위해 구성하는 방법에 대한 제안을 제공합니다.

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

MySQL 최적화 및 성능 튜닝 팁은 다음 기사를 참조하십시오. 유용한 MySQL/MariaDB 성능 튜닝 및 최적화 팁.

7. MySQL은 계속 충돌합니다.

이 문제가 발생하면 MySQL 서버가 사망했는지 또는 문제가있는 클라이언트인지 여부를 확인해야합니다. 많은 서버 충돌은 손상된 데이터 파일이나 인덱스 파일 때문에 발생합니다.

서버 상태를 확인하여 실행 및 실행 기간을 설정할 수 있습니다.

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

또는 다음 mysqladmin 명령을 실행하여 MySQL 서버의 가동 시간을 찾으십시오.

$ sudo mysqladmin version -p 

다른 솔루션으로는 MySQL 서버를 중지하고 디버깅을 활성화 한 다음 서비스를 다시 시작하는 방법이 있습니다. 문제를 반복하는 데 사용할 수있는 테스트 사례를 만들려고 할 수 있습니다. 또한 다른 터미널 창을 열고 다음 명령을 실행하여 다른 쿼리를 실행하는 동안 MySQL 프로세스 통계를 표시합니다.

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

우리는 몇 가지 일반적인 MySQL 문제 및 오류를 살펴 보았지만 문제를 해결하고 해결할 수있는 방법을 제공했지만 오류를 진단 할 때 가장 중요한 점은 그것이 무엇을 의미하는지 이해하는 것입니다. .

어떻게 이것을 결정할 수 있습니까? 다음 사항은 정확히 무엇이 문제를 일으키는 지 확인하는 방법을 안내합니다.

  1. The first and most important step is to look into the MySQL logs which are stored in the directory /var/log/mysql/. You can use command line utilities such as tail to read through the log files.
  2. If MySQL service fails to start, check its status using systemctl or use the journetctl (with the -xe flag) command under systemd to examine the problem.
  3. You can also examine system log file such as /var/log/messages or similar for reasons for your problem.
  4. Try using tools such as Mytop, glances, top, ps, or htop to check which program is taking all CPU or is locking the machine or to inspect whether you are running out of memory, disk space, file descriptors, or some other important resource.
  5. Assuming that problem is some runaway process, you can always try to kill it (using the pkill or kill utility) so that MySQL works normally.
  6. Supposing that the mysqld server is causing problems, you can run the command: mysqladmin -u root ping or mysqladmin -u root processlist to get any response from it.
  7. If the problem is with your client program while trying to connect to the MySQL server, check why it is not working fine, try to get any output from it for troubleshooting purposes.

다음 MySQL 관련 기사를 읽고 싶을 수도 있습니다.

  1. Learn MySQL / MariaDB for Beginners – Part 1
  2. How to Monitor MySQL/MariaDB Databases using Netdata on CentOS 7
  3. How to Transfer All MySQL Databases From Old to New Server
  4. Mytop – A Useful Tool for Monitoring MySQL/MariaDB Performance in Linux
  5. 12 MySQL/MariaDB Security Best Practices for Linux

자세한 정보는 Problems and Common Errors에 대한 MySQL Reference 매뉴얼을 참조하십시오. 여기에는 앞서 논의한 것들을 포함하여 MySQL을 사용하는 동안 발생할 수있는 일반적인 문제와 오류 메시지가 포괄적으로 나와 있습니다.