kkamagi's story

IT, 정보보안, 포렌식, 일상 공유

OS

mysql error 정리(작성중)

까마기 2014. 9. 19. 18:11
728x90
반응형
mysql 5.5.14버전 설치 과정 및 설치 후 발생한 오류 정리


일단 mysql 5.5.14 버전을 설치하는 과정은 구글에서 mysql 5.5 로 만 검색해도 관련 내용이 수두룩 하게 나오지만..


정작 문제는 동일한 버전을 설치하는거임에도 불구하고 사람들마다 설치과정이 조금씩 틀린데다 


그분들의 설치과정을 기록한 내용을 보면 오류 없이 잘 사용하는거 같은데 난 오류가 발생한 것들이 있어서


기억차원및 혹 나같은 오류가 발생할지도 모르는 다른 분들을 위해서 작성 (설치 과정은  차동훈 (http://system.neulwon.com) 님의 게시글(http://system.neulwon.com/xe/2341)을 참조해서 진행했고 아래 설치과정의 일부 내용도 참조 했습니다)


1. mysql 5.5.x 버전은 기존 mysql 5.1 이하 버전과 설치방법이 다르고 cmake를 이용해서 설치를 해야 하기때문에.. 관련 cmake 라이브러리를 먼저 설치

yum -y install zlib curl
yum -y install gcc g++ cpp gcc-c++
yum -y install openssl openssl-devel
yum -y install libtermcap-devel ncurses-devel libc-client-devel bzip2-devel
yum -y install bison


2. cmake를 다운받고 압축풀고 설치 진행

wget http://www.cmake.org/files/v2.8/cmake-2.8.4.tar.gz

tar xvfz cmake-2.8.4.tar.gz

cd cmake-2.8.4

mkdir cmake-build

cd cmake-build

../bootstrap

make all

make install

여기까지 별문제 없이 진행되면 cmake 설치는 완료...


3. mysql 을 위한 계정생성 (이건 솔직히 왜 하는지는 아직 잘 모르겠음.. 하지만 대부분 mysql 5.5.x 버전 설치관련 문서들 보면 다 생성을 해주고 있어서 일단 내용에 작성)

groupadd -g 400 mysql

useradd -u400 -g400 -d /usr/local/mysql -s /bin/false mysql

-> 추가적으로 저는 기존 mysql 버전을 /var/lib/mysql 이 경로로 사용했었기 때문에 위에 /usr/local/mysql 부분을 /var/lib/mysql 로 변경해서 처리했음


4. 이제 mysql 설치를 진행

wget ftp://ftp.sqyclub.com/pub/mysql/Downloads/MySQL-5.5/mysql-5.5.14.tar.gz

(이건 참고했던 문서에 있던 mysql 다운 가능 주소인데 2011/09/14 일까지는 다운 가능했음... 다운이 불가능할 경우 mysql 홈페이지에서 직접 받아서 사용하시길)

tar xvfz mysql-5.5.14.tar.gz

cd mysql-5.5.14

cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DENABLED_LOCAL_INFILE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DSYSCONFDIR=/etc -DMYSQL_TCP_PORT=3306

make

make install

위와 같이 해서 mysql 설치까지 끝남

(euckr 로 설치를 원할경우에는 위에 cmake 옵션중에 utf8 관련 부분을 다음과 같이 -DDEFAULT_CHARSET=euckr -DDEFAULT_COLLATION=euckr_korean_ci  변경해줍시다)


5. 기본 DB생성 및 보안세팅 과정 (아래 /usr/local/mysql  부분은 저같은 경우 경로가 틀려서 경로를 바꿔서 처리했네요.. 각자 상황에 맞게 하시면 될듯)

cp -arp scripts/mysql_install_db /usr/local/mysql

cd /usr/local/mysql

rm -rf data 

sh ./mysql_install_db (혹 data 폴더 생성이 안될경우 옆에 명령어로 해보세요 sh ./mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data )

chown -R mysql:mysql /usr/local/mysql

chown -R mysql.mysql /usr/local/mysql/data

cp support-files/my-huge.cnf /etc/my.cnf

cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

chmod 700 /etc/init.d/mysqld

chown root.root /etc/init.d/mysqld

chkconfig --add mysqld

chmod 711 /usr/local/mysql

chmod 700 /usr/local/mysql/data

chmod 751 /usr/local/mysql/bin

chmod 750 /usr/local/mysql/bin/*

chmod 755 /usr/local/mysql/bin/mysql

chmod 755 /usr/local/mysql/bin/mysqldump

vi /etc/init.d/mysql 해서 datadir 부분에 /usr/loca/mysql/data 추가

위와 같이 해서 기본 DB생성 및 보안세팅 과정도 전부 완료 했습니다..


이제는 mysql 을 실행시켜서 시작을 하면 되겠죠..^^;;

일단 여기 까지는 구글에서 mysql 5.5.x 로 검색을 해서 나오는 무수히 많은 한글 문서들을 참조하시면 설치는 가능하실 거라 생각합니다..

전 설치하기 전에 기존에 사용하던 mysql 을 삭제하고 디렉토리및 cnf 파일까지 전부 삭제를 하고 새로 설치한다는 생각으로 설치를 진행했습니다..



mysql 5.5.14 설치 후 발생했던 오류 관련 해서 작성하겠습니다..


[오류1]

위와 같이 설치를 전부 마치고 service mysqld start 를 해서 mysql 을 시작하려고 했지만 아래와 같은 오류가 뜨면서 시작이 안되는 사태가 발생했습니다.

The server quit without updating PID file ([실패]ib/mysql/data/localhost.localdomain.pid).


그래서 mysql 을 종료를 다시 해보려고 service mysqld stop 을 하니 나오는건 아래와 같은 메시지 였습니다.

MySQL server PID file could not be found! 


위와 같은 상황이 발생을 할 경우에는 ps -auxf | grep mysql 로 떠 있는 mysql 프로세스가 있나 확인 먼저 해보시고 떠 있으면 kill -9 해서 죽여주시고 다시 실행 시도


[오류2]

사이트에 접속시 can't connect to local mysql server through socket /var/lib/mysql/mysql.sock 이런 오류가 발생을 함

my.cnf 파일을 열어서 socket 부분이 /tmp/mysql.sock 로 되어있는데 /var/lib/mysql/mysql.sock 로 변경해줌


[오류3]

설치시에 euckr 옵션을 줘서 설치를 했는데도 한글이 깨지는 문제 발생 my.cnf 파일을 열어서 아래 내용 추가

[mysql]

default-character-set = euckr


[client]

default-character-set = euckr


[mysqld]

character-set-client-handshake=FALSE

init_connect="SET collation_connection = euckr_korean_ci"

init_connect="SET NAMES euckr"

character-set-server = euckr

collation-server = euckr_korean_ci


[mysqldump]

default-character-set = euckr

 

error log 확인

log 파일 위치 -> # vi /etc/my.cnf

 

sort aboted -> 메모리 부족으로 인한

 

 

log 확인 -> 

mysql> check table 테이블명;

 

재부팅 후 계속 에러메세지 출려되면 해당 테이블 dump -> 해당 테이블 삭제하고 다시 인서트

 

 

 

 

========================================================

 

 

 

테이블 캐시 최적화하기

서버가 테이블 파일을 접근하여 오픈한 경우, 나중에 파일을 재사용하기 위해 오픈된 상태로 유지할 수 있다. 테이블 캐시는 오픈된 테이블에 대한 정보를 유지하는데 사용한다. table_cache 변수를 사용해서 테이블 캐시 크기를 설정할 수 있다.

 

서버가 많은 테이블에 접근한다면 테이블 캐시는 금방 가득차고, 새로운 테이블에 접근해야할 때마다 접근 빈도가 낮은 테이블을 닫아서 새로운 공간을 마련해야 한다. 현재 열려 있는 테이블 수는 아래와 같이 확인할 수 있다.

mysql> show status like '%Open_tables%';

+----------------------+-------+

| Variable_name            | Value |

+----------------------+-------+

| Open_tables                | 475   |

+----------------------+-------+

 

또는 어드민 명령어로 상태를 확인해도 결괄르 확인할 수 있다.

[root@db bin]# ./mysqladmin status

Uptime: 2667488  Threads: 253  Questions: 196584267  Slow queries: 2052  Opens: 19992  Flush tables: 1  Open tables: 475  Queries per second avg: 73.696

 

만약 Open_tables 값이 변하지 않거나 느리게 변한다면 table_cache 값이 적절하게 설정되었다고 볼 수 있다. 반면 값이 빠르게 증가한다면, table_cache 값에 비해 오픈해야할 테이블이 많아서 계속해서 테이블을 닫고 여는 작업을 처리한다는 뜻이다.



간혹가다가 잘 돌아가던 서버 페이지가 DB쪽의 문제로 다음과 같은 오류가 생기곤 합니다.

Got error 127 from table handler



※ 아래 참고

shell> perror 126 127 132 134 135 136 141 144 145
126 = Index file is crashed / Wrong file format
127 = Record-file is crashed
132 = Old database file
134 = Record was already deleted (or record file crashed)
135 = No more room in record file
136 = No more room in index file
141 = Duplicate unique key or constraint on write or update
144 = Table is crashed and last repair failed
145 = Table was marked as crashed and should be repaired


발췌 : http://dev.mysql.com/doc/mysql/en/repair.html





다음은 위와 같이 손상된 DB 테이블을 복구하는 mysql 명령어 입니다.

DB에서 
mysql> repair table product;                  //"product"는 오류가 생긴 테이블 입니다. 
하시기 전에 
mysql>analyze table product;를 실행하면 테이블에 대한 보고서가 작성됩니다. 
그리고 나서 
mysql>rapair table product;를 실행하면 복원이 됩니다.


예)

mysql> analyze table product;
+-------------+---------+----------+-----------------------------+
| Table       | Op      | Msg_type | Msg_text                    |
+-------------+---------+----------+-----------------------------+
| kms.product | analyze | status   | Table is already up to date |
+-------------+---------+----------+-----------------------------+
1 row in set (0.06 sec)

mysql> repair table product;
+-------------+--------+----------+----------+
| Table       | Op     | Msg_type | Msg_text |
+-------------+--------+----------+----------+
| kms.product | repair | status   | OK       |
+-------------+--------+----------+----------+
1 row in set (0.10 sec)


서버의 Index 모니터링이 죽어 확인 결과, mysqld 의 cpu사용량 및 메모리 사용량이 매우 높게 나왔다.

 

mysql의 datadir로 이동 후 localhost.err 파일 확인 결과..

 

다음과 같은 메세지 출력 됬음을 확인

 

 

[Warning] /usr/local/mysql/libexec/mysqld: Forcing close of thread 000 user 에러날떄

 

# vi /etc/my.cnf

 

skip-name-resolve

 

외부클라이언트가 mysql 서버로 connect 시에 dns-lookup , IP에 대한 resolve, 즉 역질의를 skip하는 옵션으로서 

Application 과 DB 서버가 따로 있을경우 mysql 부하에 의심이 되므로 적용할 수 있는 옵션이다. 같이 있는 경우에도 

적용시에 어느정도 부하가 줄어든 경우도 있었다..

 

#log-slow-queries = /var/log/slow_query.log

slow_query_log = /var/log/slow_query.log

 

 

--> 위에 옵션으로 했을때 데몬 시작 후 localhost.err 파일 확인하면 Warning 메세지가 출력될 수도 있다.

그럴 땐 아래의 syntax에 맞는 옵션을 사용하라는 메세지도 출력되므로 확인 후 다시 재시작.



출처: https://www.crowz.co.kr/357 [★까마기 www.crowz.co.kr]

출처: https://www.crowz.co.kr/357 [★까마기 www.crowz.co.kr]

출처: https://www.crowz.co.kr/357 [★까마기 www.crowz.co.kr]

출처: https://www.crowz.co.kr/357 [★까마기 www.crowz.co.kr]

반응형