메뉴 건너뛰기

조회 수 3854 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부

[참고 사이트] 

 

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 포트나 소켓 파일을 사용하여 연결할 때 나타남.

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)
 

(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 서버가 계속 충돌함

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

[해결 방안]

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

systemctl status mysqld

 

또는 다음 mysqladmin 명령어를 실행하여 MySQL 서버의 가동 시간을 찾을 수 있음.

mysqladmin version -p

 

 

또 다른 방법으로는 MySQL 서버를 중지하고 디버깅을 활성화한 다음 서비스를 다시 시작하는 방법이 있음.

테스트로 반복시켜 원인 파악을 확인하고자 함.

 

다른 터미널 창을 열고 다음과 같은 명령어를 실행하여 다른 쿼리를 실행하는 동안 MySQL 프로세스 통계를 표시함.

mysqladmin -i 5 status

 

또는

mysqladmin -i 5 -r status

 

(8) 하드디스크 파티션 용량이 꽉 참

ERROR 1006 (HY000) : Can't create database 'abcdb'. (errno: 28) 
 

[해결 방안]

① MySQL 서버 종료

systemctl stop mysqld

 

② 우선 순위인 /tmp 디렉토리 안에 데이터 먼저 제거 한다.

cd /tmp

 

rm -rf *

 

 MySQL 서비스 시작

systemctl start mysqld

 

(9) UPDATE시 KEY 칼럼을 이용하지 않을 경우 업데이트할 수 없을 때

ERROR 1175 (HY000) : You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences
 

[해결 방안]

① Safe Update 모드 해제 명령어 실행

SET SQL_SAFE_UPDATES = 0;

 

(10) MySQL 8 경고 메시지

Warning 3719 'utf8' is currently an alias for the character set UTF8MB3, but will be an alias for UTF8MB4 in a future release. Please consider using UTF8MB4 in order to be unambiguous. 
Warning : 3778 'utf8_general_ci' is a collation of the deprecated character set UTF8MB3. Please consider using UTF8MB4 with an appropriate collation instead.
 
[해결 방안]
① 문자셋과 정렬 방식을 utf8mb4로 변경한다.
my.cnf 파일 변경으로 전체 설정 변경
 

[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.

 

[해결 방안]
① sql_mode 설정값 확인

SHOW VARIABLES LIKE 'sql_mode';

SHOW GLOBAL VARIABLES LIKE 'sql_mode';

 

② STRICT_TRANS_TABLES 이나 STRICT_ALL_TABLES이 있다면 제거
또는 sql_mode에 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' 을 추가한다.
my.cnf 파일 변경으로 전체 설정 변경
 

[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 

 
[원인]
문자열 깨짐
 
[해결 방안]
① 문자셋과 정렬 방식을 utf8mb4로 맞춘다.

 

(11) 추가적으로 문제 또는 오류를 유발하는 원인 파악

몇 가지 일반적인 MySQL 문제와 오류를 살펴본 결과 문제를 해결하는 방법들을 제공했지만 오류를 진단할 때 가장 중요한 점은 그것이 무엇을 의미하는 지 이해하는 것임.
 
어떻게 하면 그런 의미들을 이해할 수 있을 지는 다음과 같이 확인하는 방법들이 있음.
- 가장 중요한 첫 번째 단계는 특정 디렉토리에 저장된 MySQL 로그를 조사하는 것임.
vi 또는 tail 명령어를 사용하여 로그 파일을 읽을 수 있음.

vi /etc/log/mysqld.log

 

또는

vi /var/log/mysqld.log

 

- MySQL 서비스가 시작되지 않으면 systemctl 명령어를 사용하여 상태를 확인하거나 journetctl -xe 명령어를 사용하여 문제를 검사함.
 
- 시스템 로그 파일(/var/log/messages)을 검사함.
 
- mytop, glances, top, ps, htop 와 같은 프로그램을 사용하여 CPU, 메모리, 디스크 공간 등 중요한 자원의 부족 여부를 검사함.
 
- 확실한 MySQL 서버의 재기동을 할 경우 pkill, kill 명령어를 사용함.
 
- mysqld 서버가 문제를 발생한다고 가정할 경우 mysqladmin -u root ping 또는 mysqladmin -u root processlist 명령어를 사용하여 응답 반응을 확인함.

List of Articles
번호 제목 날짜 조회 수
106 LIMIT 속도 저하 2021.03.26 246
105 fulltext 관련 글 2021.03.26 125
104 order by field 와 union, 원하는 대로 정렬 하기 2021.03.26 768
103 테이블, 컬럼 charset 변경 2021.03.26 186
102 no exists, not in 을 이용한 조건에 만족하지 않는 것들 구하기, 둘의 차이점 2021.03.26 125
101 group by로 뽑아온 값중에 가장큰 값(max)의 상태값을 가져오기 2021.03.26 594
100 group by, distinct, count 를 이용한 겹치지 않는것의 개수 2021.03.26 262
99 mysqlbinlog (mysql 백업, 로그남기기) 2021.03.26 200
98 mysql 포트 바꾸기, 외부에서 접속하기 2021.03.26 5075
97 테이블, 레코드 복사 2021.03.26 162
96 BEGIN, COMMIT, ROLLBACK 2021.03.26 315
95 column의 정보 중에서 column 설명(column_comment) 2021.03.26 129
94 [mysql,mariaDB] 컬럼 암호화, 복호화 2020.11.25 773
93 MySQL 암호화 방법 2020.11.25 360
» 일반적인 오류를 해결하는 유용한 정보들 file 2020.11.23 3854
91 서로 다른 결과를 한줄로 합쳐서 보여줘야 할 때(GROUP_CONCAT) file 2020.07.28 743
90 엑셀로 되어있는 부분 db로 import하는 방법 2020.07.28 144
89 하나의 쿼리로 여러 테이블의 데이터 삭제 file 2020.07.28 888
88 UPDATE ~ CASE 문을 사용한 조건별 업데이트 file 2020.07.28 1394
87 이벤트 스케줄러 등록하기 file 2020.06.29 303
Board Pagination Prev 1 2 3 4 5 6 7 Next
/ 7

하단 정보를 입력할 수 있습니다

© k2s0o1d4e0s2i1g5n. All Rights Reserved