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=<개수> 옵션을 주도록 한다.
'프로그래밍 > mysql' 카테고리의 다른 글
mysql - 2개의 테이블 간 (교, 합, 차집합) 구하기 (0) | 2012.07.19 |
---|---|
mysql - 자동증가(auto_increment) (0) | 2012.07.19 |
mysql - 실행계획 보기 (0) | 2012.07.19 |
mysql - 슬로우쿼리 시간에 따른 검색 (0) | 2012.07.19 |
mySQL v4.1 리눅스에 설치하기 (0) | 2012.07.19 |