[참고 사이트]
1. 일반적인 오류를 해결하는 유용한 정보들
(1) mysql.sock 관련 에러
mysql.sock 관련 에러가 뜨는 원인은 굉장히 다양하므로 명확한 해결책을 제시하기 어렵습니다.
ERROR 2002 (HY000) : Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2)
[원인]
- MySQL 데몬이 기동이 되어 있지 않은 경우 (MySQL 서버가 실행되지 않은 것)
- my.cnf 파일 자체가 깨졌을 경우 해당 메시지를 만난다.
- mysql.sock를 시스템이 못 찾거나 경로가 정확하지 않아서 발생하는 오류
[해결 방안]
① mysql.sock 위치 찾기
find / -name mysql.sock |
② 다음 명령어로 해결
mysql -u root -p mysql -S /var/lib/mysql/mysql.sock |
[원인]
- MySQL 유저로 접근했을 경우 mysql.sock 파일이 있는 디렉토리에 접근을 할 수 없어서 나오는 오류
[해결 방안]
① MySQL 서버 종료
systemctl stop mysqld |
② /var/lib/mysql/ 디렉토리에 하위 파일과 디렉토리 모든 권한을 변경
chmod -R 755 /var/lib/mysql/ |
③ /var/lib/mysql/ 디렉토리에 하위 파일과 디렉토리 모든 소유권을 변경
chown -R mysql:mysql /var/lib/mysql/ |
④ MySQL 서비스 시작
systemctl start mysqld |
ERROR 2002 (HY000) : can't connect to local mysql server through socket '/var/lib/mysql/mysql.sock' (13)
[원인]
- /usr/local/mysql 디렉터리 권한 문제
[해결 방안]
① /usr/local/mysql 디렉토리에 권한을 변경
chmod 777 /usr/local/mysql |
ERROR 2002 (HY000) : can't connect to local mysql server through socket '/var/lib/mysql/mysql.sock' (111)
[원인]
- 심볼릭 링크가 잘못 됐을 경우
[해결 방안]
① 심볼릭 링크 디렉토리 생성
ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock |
그 외 mysql.sock 문제
[해결 방안]
① my.cnf 파일 수정
vi /etc/my.cnf |
[my.cnf]
[client] socket = /var/lib/mysql/mysql.sock [mysqld] socket = /var/lib/mysql/mysql.sock |
(2) MySQL 서버에 연결할 수 없을 때
ERROR 2003 (HY000) : Can’t connect to MySQL server on ‘server’ (10061)
[해결 방안]
① 시스템에서 실행 중인 MySQL 서버가 있는지 확인함.
ps xa | grep mysqld | grep -v mysqld |
② 서버에 네트워크 연결이 설정되어 있고 연결에 사용 중인 네트워크 포트가 구성된 네트워트 포트인지 확인함.
MySQL 서버에 연결할려고 할 때 발생할 수 있는 다른 일반적인 오류는 아래와 같음.
이 오류는 서버가 실행 중일 수 있음을 나타내지만 서버가 수신 중인 다른 TCP/IP 포트나 소켓 파일을 사용하여 연결할 때 나타남.
(3) MySQL 서버에서 액세스 거부 오류
MySQL 사용자 계정 관점에서 사용자가 서버에 연결할 수 있는 클라이언트 호스트 또는 계정에는 암호와 같은 인증 자격 증명이 필요할 수 있음.
액세스 거부 오류의 원인은 다양하지만 일반적인 원인 중 하나는 서버가 클라이언트 프로그램에서 연결할 때 사용할 수 있는 MySQL 계정과 관련됨.
연결에 지정된 사용자 이름에 데이터베이스 액세스 권한이 없음을 나타냄.
[해결 방안]
① 사용 중인 클라이언트 프로그램을 통해 서버에 연결할 수 있는지 그리고 연결이 시작되는 호스트를 사용자 계정에서 허용할 수 있는지 확인해야 함.
- SHOW GRANTS 명령어을 이용하여 주어진 계정에 어떤 권한이 있는지 확인함.
SHOW GRANTS FOR 'webteam'@'localhost'; |
② 다음 명령어를 사용하여 데이터베이스의 특정 사용자에게 원격 IP 주소에 대한 권한을 부여할 수 있음.
GRANT ALL PRIVILEGES ON *.test_db TO 'webteam'@'192.168.0.100';
FLUSH PRIVILEGES; |
이거 외에도 액세스 거부 오류는 MySQL 에 연결하는데 다른 문제로 인해 발생할 수 있으므로 앞에서 설명한 오류를 참조함.
(4) MySQL 서버와의 연결이 끊어짐
네트워크 연결 불량, 연결 시간 초과 또는 max_allowed_packet 보다 큰 BlOB 값의 문제점으로 인해 오류가 발생할 수 있음.
[해결 방안]
① 네트워트 연결 문제가 있는 경우 특히 원격 데이터베이스 서버에 액세스하는 경우 네트워크 연결 상태가 양호한지 확인함.
② 연결 시간 초과 문제인 경우, MySQL 서버에 대한 초기 연결을 사용하려고 할 때 connect_timeout 매개 변수의 값을 늘려야 함. 그리고 BlOB 값이 max_allowed_packet 보다 큰 경우에는 다음과 같이 [mysqld] 또는 [client] 섹션의 /etc/my.cnf 구성 파일에서 mysql_allowed_packet 에 대한 더 높은 값을 설정해야 함.
vi /etc/my.cnf |
[my.cnf]
[mysqld] connect_timeout=100 max_allowed_packet=500M |
MySQL 구성 파일에 액세스할 수 없는 경우 MySQL 쉘에서 다음 명령어를 사용하여 값을 설정할 수 있음. 단 MySQL 서버가 재시작시에 예전 설정값으로 복귀함. 따라서 재시작시에 설정값을 유지하려면 my.cnf 파일을 수정해야 함.
SET GLOBAL connect_timeout=100;
SET GLOBAL max_allowed_packet=524288000; |
(5) 너무 많은 MySQL 연결할 경우
MySQL 클라이언트에서 "너무 많은 연결(too many connections)" 오류가 발생할 경우 사용 가능한 모든 연결이 다른 클라이언트에 의해 사용 중임을 의미함.
연결 수에 대한 설정은 max_connections 시스템 변수에 의해 제어됨.(연결 수 기본 값은 151 임)
[해결 방안]
① /etc/my.cof 구성 파일에 더 많은 연결을 허용하기 위해 값을 증가시켜 문제를 해결할 수 있음.
vi /etc/my.cnf |
[my.cnf]
[mysqld] max_connections=1000 |
(6) 메모리 부족
MySQL 클라이언트 프로그램을 사용하여 쿼리를 실행하고 메모리 부족 오류가 발생하면 MySQL 에서 전체 쿼리 결과를 저장할 메모리가 충분하지 않다는 의미임.
[해결 방안]
① 첫 번째 단계는 쿼리가 올바른지 확인하며 그렇지 않을 경우 다음과 같이 수행함.
- MySQL 클라이언트가 직접 --quick switch 사용하는 경우 캐시된 결과를 사용하지 않도록 설정함.
- MyODBC 드라이버를 사용하는 경우 사용자 인터페이스(UI) 에서 플래그에 대한 고급 탭으로 이동한 후 "결과를 캐시하지 마십시오(Do not cache result)" 옵션을 선택함.
② MySQL 서버에 더 높은 성능을 지원하는 MySQL Tuner 프로그램을 사용함.
yum install mysqltuner
mysqltuner |
(7) MySQL 서버가 계속 충돌함
[해결 방안]
systemctl status mysqld |
mysqladmin version -p |
또 다른 방법으로는 MySQL 서버를 중지하고 디버깅을 활성화한 다음 서비스를 다시 시작하는 방법이 있음.
테스트로 반복시켜 원인 파악을 확인하고자 함.
다른 터미널 창을 열고 다음과 같은 명령어를 실행하여 다른 쿼리를 실행하는 동안 MySQL 프로세스 통계를 표시함.
mysqladmin -i 5 status |
또는
mysqladmin -i 5 -r status |
(8) 하드디스크 파티션 용량이 꽉 참
[해결 방안]
① MySQL 서버 종료
systemctl stop mysqld |
cd /tmp
rm -rf * |
③ MySQL 서비스 시작
systemctl start mysqld |
(9) UPDATE시 KEY 칼럼을 이용하지 않을 경우 업데이트할 수 없을 때
[해결 방안]
① Safe Update 모드 해제 명령어 실행
SET SQL_SAFE_UPDATES = 0; |
(10) MySQL 8 경고 메시지
[my.cnf]
[mysqld] default-character-set=utf8mb4 default-collation=utf8mb4_unicode_ci |
# DB 문자셋과 정렬 방식 변경 ALTER DATABASE [DB 명] DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# 특정 테이블 문자셋과 정렬 방식 변경 ALTER TABLE [테이블 명] CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# 특정 컬럼 문자셋과 정렬 방식 변경 ALTER TABLE [테이블 명] MODIFY COLUMN [컬럼 명] VARCHAR(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; |
Warning : 1681 Integer display width is deprecated and will be removed in a future release.
Warning : 1287 'YEAR(4)' is deprecated and will be removed in a future release. Please use YEAR instead.
ALTER TABLE [테이블 명] MODIFY COLUMN [컬럼 명] INT; |
Warning : 3135 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
SHOW VARIABLES LIKE 'sql_mode'; SHOW GLOBAL VARIABLES LIKE 'sql_mode'; |
[my.cnf]
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES |
- 쿼리로 변경
SET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes'; |
Warning : 1265 Data truncated for column at row 366
Warning : 1300 Invalid utf8mb4 character string: 'A0A03C'
Warning : 1366 Incorrect string value: '\x92t get...' for column 'ques_content' at row
(11) 추가적으로 문제 또는 오류를 유발하는 원인 파악
vi /etc/log/mysqld.log |
또는
vi /var/log/mysqld.log |