본문 바로가기

프로그래밍/mysql

MySQL - 에러와 문제해결

반응형

MySQL 에러와 문제해결 - 일반적인 에러 MySQL  
 
- Access denied 에러

- MySQL 서버에 접속시, 사용자명, 호스트명, 비밀번호가 MySQL 의 권한 테이블의 그것과 일치

- 하지 않을때 발생하는 에러이다. 이 에러가 발생하면 MySQL 서버의 user 테이블과 db 테이블을

- 보고 사용자명, 호스트명, 비밀번호가 일치하는지 확인해보도록 한다.

 

- MySQL server has gone away 에러

- MySQL server has gone away Error 는 Lost connection to MySQL server during query 와도

- 상통한다. 이 에러는 mysql> 프롬프트 상에서 SQL 등을 실행시에 발생할 수 있다. 이 에러는

- MySQL 서버에 접속하는 동안 타임 아웃이 발생하여 MySQL 서버로의 접속이 끊기거나 MySQL

- 서버 관리자 등이 kill threadid 명령을 실행하여 연결을 죽인 경우에 발생한다.

 

- 이와 같은 에러가 발생하였을 때 다시 SQL 쿼리를 실행하면 MySQL 서버에 다시 한번 재접속을

- 시도하게 되고 그래도 접속이 안되면 같은 에러를 리턴한다.

 

- Can't connect to [local] MySQL server 에러

- 유닉스 시스템에서 MySQL 클라이언트로부터 MySQL 서버로 접속하는 방법이 두 가지가 있다.

- 하나는 유닉스 소켓을 이용하는 방법이고 다른 하나는 TCP/IP 를 이용하는 방법이다.

- 유닉스 소켓을 이용하는 방법은 유닉스 시스템에 있는 파일 (기본적으로 /tmp/mysqld.sock) 을

- 이용하여 접속하는 방법이다. 이 방법은 TCP/IP 를 이용하는 방법보다 속도가 빠르지만, MySQL

- 클라이언트와 MySQL 서버가 같은 컴퓨터 안에 있어야 사용 할 수 있는 방법이다. 유닉스 소켓은

- 별도의 호스트명을 지정하지 않고 접속하고자 할 때 사용한다.

 

- Can't connect to [local] MySQL server 에러는 다음과 같은 이유로 발생할 수 있다.

 

- mysqld 데몬이 떠있지 않다.

- 시스템에 native 쓰레드가 동작하지 않는 상태에서 시스템이 MIT-pthreads 패키지를 지원한다면

- MySQL 은 MIT-pthreads 를 사용하게 된다. 그런데 모든 MIT-pthreads 버전이 유닉스 소켓을

- 지원하는 것은 아니다. 그런 경우에는 유닉스 소켓을 이용하여 접속하면 에러가 나므로 별도의

- 호스트명으로 접속하여야 한다. 호스트명으로 접속이 가능한지 확인하는 명령은 다음과 같다.

 

$ /usr/local/mysql/bin/mysqladmin -h <호스트명> version

 

- 누군가가 유닉스 소켓 (기본적으로 /tmp/mysqld.sock) 을 삭제하였다. 예를 들어 cron 을 사용한

- 다면 /tmp 디렉토리의 모든 파일이 삭제되는 일이 발생할 수 있다. 유닉스 소켓을 이용하여 접속

- 이 가능한지 확인하려면 다음과 같은 명령을 실행해본다.

 

$ /usr/local/mysql/bin/mysqladmin version

 

- mysqld 를 실행하면 3 개의 쓰레드가 생기는데 리눅스의 경우 그 중 하나의 쓰레드가 kill 명령에

- 의해 죽을 수 있다. 그런 경우에는 접속이 되지 않으며 다시 기동하려면 나머지 쓰레드들도 모두

- 죽이고 mysqld 데몬을 띄워야 한다.

- 유닉스 소켓 파일에 대해 읽기/쓰기 권한이 없다.

 

- 만약 Can't connect by MySQL server on <호스트명> 이라는 에러가 난다면 다음과 같은 방법

- 으로 에러를 확인할 수 있다.

 

- 쉘 상에서 telnet <호스트명> <포트번호(3306)> 로 접속해본다. 접속이 되지 않는다면 MySQL

- 서버가 기동되어 있지 않은 것이다.

- 로컬 컴퓨터로 접속하려고 할 때 에러가 발생했다면 포트 번호를 확인해본다. MySQL 서버가

- 사용중인 포트번호를 확인하려면 다음과 같은 명령을 사용한다.

 

$ /usr/local/mysql/bin/mysqladmin variables

 

- Host '..' is blocked 와 같은 에러가 발생하면 사용중인 TCP/IP 가 잘못되어있는지 확인해보도

- 록 한다.

 

- Too many connections 에러

- Too many connections 에러가 발생하면 설정되어있는 max_connections 값 (기본값은 100이다)

- 보다 많은 수의 접속이 일어나고 있는 것이다. max_connections 값을 늘리려면 MySQL 기동시

- max_connections 변수 값을 크게 세팅하여 기동하도록 한다.

 

- 참고로 mysqld 데몬은 (max_connections + 1) 개 만큼 연결을 열어놓는다. 최대 연결수가 초과

- 했을 경우 문제를 해결할 슈퍼 유저의 접속을 허용되도록 하기 위해서이다.

 

- Some non_transactional changed tables couldn't be rolled back 에러

- Some non_transactional changed tables couldn't be rolled back 에러는 트랜잭션을 지원하지

- 않는 테이블에 대해 ROLLBACK 명령을 실행하려고 할 때 발생하는 에러이다.

 

- 또한 mysqld 에서 설정되지 않은 타입의 테이블을 생성하려고 할 때에도 발생하는 에러이다. 현

- 재는 msyqld 에서 지원하는 테이블 타입을 확인하고자 한다면 다음과 같이 SHOW 명령을 실행

- 하도록 한다.

 

mysql> show variables like 'have_%';
+-------------------+-------+
| Variable_name       | Value |
+-------------------+-------+
| have_bdb              | NO    |
| have_crypt            | NO     |
| have_innodb         | YES   |
| have_isam            | YES   |
| have_openssl        | NO    |
| have_query_cache | YES   |
| have_raid              | NO     |
| have_symlink         | YES   |
+-------------------+-------+
8 rows in set (0.05 sec)

 

- Out of memory 에러

- Out of memory 에러는 다음과 같은 형태로 발생한다.

 

mysql: Out of memory at line 42, 'malloc.c'

mysql: needed 8136 byte (8k), memory in use: 12481367 bytes (12189k)

ERROR  2008: Mysql client ran out of memory

 

- Out of memory 에러가 발생하는 이유는 처리된 질의문의 결과 로우 셋이 MySQL 클라이언트에서

- 해결할 수 있는 메모리에 비해 너무 크기 때문이다. 이와 같은 에러가 발생하면 일단 실행한 SQL

- 문이 제대로 되어있는지 확인해야 한다.그러나 어쩔 수 없이 많은 로우 셋을 가져와야 하는 경우

- 라면 mysql 실행시 --quick 옵션을 주도록 한다. 이 옵션을 주면 MySQL 클라이언트쪽의 부하

- 를 어느정도 줄여준다. 하지만 MySQL 서버쪽으로 부하가 더 걸리게 된다.

 

- Packet too large 에러

- MySQL 클라이언트나 MySQL 서버가 max_allowed_packet 에 설정된 값보다 큰 패킷값을 받되

- 되면 Packet too lagre 에러가 발생하게 된다. 에러가 발생하면 Packet too lagre 라는 메시지를

- 출력하고 연결을 끊는다. 그런데 어떤 MySQL 클라이언트에서 너무 큰 패킷 때문에 에러가 발생

- 했음해도 불구하고 단지 Lost connection to MySQL server during query 라는 에러만 출력 될

- 수도 있다.

 

- max_allowed_packet 값은 MySQL 3.23 버전에서는 16M 로 제한되어 있으나, MySQL 4.0.1 버전

- 이후로는 시스템의 메모리가 지원하는 한 패킷 전송이 가능하도록 되어있다. 패킷 크기를 설정하

- 려면 MySQL 클라이언트와 MySQL 서버 양쪽에 설정해 주어야 한다. MySQL 클라이언트에서

- 설정할 때는 mysql 실행시 --set-variable=max_allowed_packet=8M 라고 옵션을 주면 된다.

- 그런데 --set-variable 은 MySQL 4.0 이후 지원하지 않을 옵션이므로그냥 max_allowed_packet

- =8M 라고 쓰면 된다.

 

- 그런 다음 MySQL 서버에서 설정할 때는 MySQL 클라이언트에서 설정했던 값보다 크게 하여

- mysqld 를 실행하면 된다. 예를 들어 set-variable=max_allowed_packet=16M 라는 옵션으 주어

- 기동하면 된다.

 

- 통신 에러 / Aborted Connection

- 다음과 같은 형태의 통신 에러가 발생할 수 있다.

 

010301  14:38:23  Aborted connection 854 to db: 'users' user: 'josh'

 

- 이 에러가 의미하는 것은 다음과 같다.

 

- 클라이언트 프로그램이 mysql_close() 를 호출하지 않고 종료되었다.

- 클라이언트 프로그램에서 wait_timeout 혹은 interactive_timeout 시간동안 아무런 요청이 발생하

  지 않았다.

- 전송도중 클라이언트 프로그램이 비정상적으로 종료되었다.

 

- 이 에러가 발생하면 Aborted_clients 값이 증가된다. 이외에도 Aborted_clients 값이 증가되는

- 경우는 다음과 같다.

 

- 패킷이 비정상적인 데이터를 가지고 있다.

- 접속을 시도한 사용자가 데이터베이스에 접근할 권한이 없다.

- 사용자의 패스워드가 잘못되었다.

- 접속을 시도하는 동안 connect_timeout 시간을 초과하였다.

 

- 참고로 이와 같은 경우가 자주 발생하면 누군가가 MySQL 데이터베이스를 해킹하려 하거나 깨려

- 고 하는 경우일 수도 있으므로 주의하기 바란다.

 

- 이 외에도 네트워킹 문제 등으로 Aborted connection 에러가 발생할 수 있다.

 

- The table is full 에러

- 테이블의 데이터 파일 크기가 제한된 크기에 도달했을 때 이러한 에러가 발생한다. 예를 들어 리

- 눅스 시스템의 경우 파일의 최대 크기가 2G 인데 이 데이터 파일이 이 크기에 도달하면 이와 같은

- 에러가 발생할 수 있다. 테이블 크기를 늘리려한다면 다음과 같이 ALTER TABLE 문을 사용할

- 수 있다.

 

ALTER TABLE table_name MAX_ROWS=1000000000 AVG_ROWS_LENGTH=nnn;

 

- 그러나 테이블 크기를 늘리는 것은 BLOB 나 TEXT 칼럼을 사용할 때에만 사용하도록 한다.

- 그 외의 경우에는 퍼포먼스에 좋지 않은 영향을 미칠 수 있다.

 

- Can't create/write to file 에러

- SELECT  문을 실행중에 다음과 같은 에러가 발생할 수 있다.

 

Can't create/write to file '\\sqla3fe_0.ism'.

 

- 이 에러는 SELECT 문 실행시 로우 셋을 저장힐 임시 파일을 만들 디렉토리가 존재하지 않을 때

- 발생한다. 임시 디렉토리 경로를 임의로 설정하고자 한다면 mysqld 데몬을 실행 할 때

- --tmpdir=<디렉토리 경로> 옵션을 주어 설정하거나 my.cnf 와 같은 환경 설정파일에서 다음과

- 같이 설정한다.

 

[mysqld]

tmpdir=c:/temp

 

- 그래도 에러가 발생하면 시스템 디스크 공간에 꽉 찬 것은 아닌지 확인해도보록 한다.

 

- Commands out of sync 에러

- MySQL 관련 함수 실행시 순서대로 실행하지 않았을 때 발생하는 에러이다. 예를 들어

- mysql_use_result() 를 실행하기 전에 mysql_free_result() 를 실행하면 result 가 없는 상태에서

- mysql_free_result() 를 실행하기 때문에 에러가 발생한다.

 

- Ignoring user 에러

- 사용자의 user 테이블의 비밀번호가 잘못 저장되었을 때 발생한다. 새 버전의 MySQL 이 오래된

- 버전의 권한 테이블을 사용하는 경우 발생한다. 이런 경우에는 다시 user 테이블의 비밀번호를

- PASSWORD() 함수를 이용하여 변경하도록 한다.

 

- Table 'xxx' doesn't exist 에러

- Table 'xxx' doesn't exist 혹은 Can't find file: 'xxx' (error: 2) 에러는 현재 데이터베이스에 xxx

- 이름의 테이블이 존재하지 않음을 의미한다. 이런 경우 SHOW TABLES 라는 명령을 사용하면

- 현재 어떤 테이블이 있는지 리스트를 볼 수 있다. 리눅스와 같은 유닉스 시스템의 경우 대소문자

- 에 유의하여 해당 테이블이 존재하는지 확인해보도록 한다.

 

- Can't initialize character set xxx error

- 이 에러는 다음과 같은 형태로 발생한다.

 

MySQL Connection Failed: Can't initialize character set xxx

 

- 이 에러는 MySQL 에서 지원하지 않는 문자셋(Character set) 을 사용하거나 MySQL 컴파일시

- 문자셋을 지정하지 않았을 때 발생한다.

 

- File Not Found

- File Not Found 혹은 Can't open file 에러는 msyqld 데몬이 동시에 너무 많은 파일을 열려고 할

- 때 발생한다. 이 에러를 해결하려면 mysqld 데몬 기동시 -O table_cache=32 옵션을 주거나

- (기본값은 64 이다) --open-files-limit=<개수> 옵션을 주도록 한다.

 

반응형