MySQL DataBase 서버 튜닝 - Connection, Memory

리눅스/MySQL|2015. 1. 16. 10:49
반응형

MySQL Database의 경우 Oracle 이나 MS SQL Server에 비해서 대용량의 자료를 처리하는 경우가 적기에 튜닝에 필요성이 적은 것 같습니다. 그러나 웹이라는 환경은 많은 사용자가 동시에 접속을 할 수 있기에 항상 모니터링과 최적화는 기본이라고 생각합니다.

본 강좌에서는 기본적인 모니터링 방법과 Connection과 Memory 부분에 대한 튜닝 방법을 소개하도록 하겠습니다.



가. 모니터링 및 초기화 명령어


show status - MySQL 데이타베이스의 현재 상황

  • show Processlist - MySQL 프로세스 목록
  • show variables - 설정 가능한 모든 변수 목록
  • flush logs - MySQL의 로그파일 초기화
  • flush status - MySQL 상태정보 초기화
  • flush thread - 쓰레드 캐시에 저장된 쓰레드 초기화
  • flush tables - MySQL에 캐싱된 테이블 초기화
  • flush privileges - 권한정보 재 설정

나. Connection 튜닝


1. status

  • Aborted_clients - 클라이언트 프로그램이 비 정상적으로 종료된 수
  • Aborted_connects - MySQL 서버에 접속이 실패된 수
  • Max_used_connections - 최대로 동시에 접속한 수
  • Threads_cached - Thread Cache의 Thread 수
  • Threads_connected - 현재 연결된 Thread 수
  • Threads_created - 접속을 위해 생성된 Thread 수
  • Threads_running - Sleeping 되어 있지 않은 Thread 수

2. system variables

  • wait_timeout - 종료전까지 요청이 없이 기다리는 시간 ( TCP/IP 연결, Shell 상의 접속이 아닌 경우 )
  • thread_cache_size - thread 재 사용을 위한 Thread Cache 수로써, Cache 에 있는 Thread 수보다 접속이 많으면 새롭게 Thread를 생성한다.
  • max_connections - 최대 동시 접속 가능 수

그외에 status 또는 system variables 값은 참고의 Mysql 메뉴얼을 참조해 주십시요.

mysql> show variables like '%max_connection%';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 100   |
+-----------------+-------+
1 row in set (0.00 sec)

mysql> show status like '%connect%';
+----------------------+---------+
| Variable_name      | Value   |
+----------------------+---------+
| Aborted_connects  | 3782    |
| Connections          | 2961108 |
| Max_used_connections | 90      |
| Threads_connected    | 1       |
+----------------------+---------+
4 rows in set (0.01 sec)

mysql> show status like '%clients%';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| Aborted_clients | 2160  |
+-----------------+-------+
1 row in set (0.00 sec)

mysql> show status like '%thread%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| Delayed_insert_threads | 0     |
| Slow_launch_threads    | 0     |
| Threads_cached         | 7     |
| Threads_connected      | 1     |
| Threads_created        | 1364  |
| Threads_running        | 1     |
+------------------------+-------+
6 rows in set (0.00 sec)

Cache Miss Rate(%) =  Threads_created / Connections * 100
Connection Miss Rate(%) = Aborted_connects / Connections * 100
Connection Usage(%) = Threads_connected / max_connections * 100

위의 경우는 Cache Miss Rate(%) = 0.05%, Connection Miss Rate(%) = 0.12%, Connection Usage(%) = 1%


3. 튜닝

  • Connection Usage(%)가 100% 라면 max_connections 수를 증가시켜 주십시요. Connection 수가 부족할 경우 Too Many Connection Error 가 발생합니다.
  • DB 서버의 접속이 많은 경우는 wait_timeout 을 최대한 적게 (10~20 정도를 추천) 설정하여 불필요한 연결을 빨리 정리하는 것이 좋습니다. 그러나 Connection Miss Rate(%) 가 1% 이상이 된다면 wait_timeout 을 좀 더 길게 잡는 것이 좋습니다.
  • Cache Miss Rate(%) 가 높다면 thread_cache_size를 기본값인 8 보다 높게 설정하는 것이 좋습니다. 일반적으로 threads_connected 가 Peak-time 시 보다 약간 낮은 수치로 설정하는 것이 좋습니다.
  • MySQL 서버는 외부로 부터 접속 요청을 받을 경우 인증을 위해 IP 주소를 호스트네임으로 바꾸는 과정을 수행하여 접속시에 불필요한 부하가 발생하게 됩니다. skip-name-resolve를 설정하시고 접속시에 IP 기반으로 접속을 하게 되면 hostname lookup 과정을 생략하게 되어 좀 더 빠르게 접속을 하실 수 있습니다.

다. Memory 튜닝


1. status

  • key_block_unused - Key Cache에서 사용되고 있지 않은 Block 수
  • key_reads - Key Block 읽기 요청시 Disk을 읽은 수
  • key_read_requests - Key Block 읽기 요청수

2. system variables

  • key_buffer_size - 인덱스를 메모리에 저장하는 버퍼의 크기
  • table_cache - 전체 쓰레드가 사용할 오픈 가능한 테이블 수
  • myisam_sort_buffer_size - 테이블 repair,Alter table,load data에 사용되는 버퍼 메모리 크기
  • join_buffer_size - 조인을 위한 메모리 버퍼 크기
  • record_buffer - 순차적인 검색을 위해 사용되는 메모리 버퍼 크기
  • record_rnd_buffer - order by 절을 사용할 경우 디스크 사용을 피하기 위하여 사용하는 메모리 버퍼 크기
  • sort_buffer - order by 와 group by에 사용되는 메모리 버퍼 크기
  • tmp_table_size - group by 시 디스크를 사용하지 않고 임시 테이블을 만들기 위해 사용되는 메모리 크기
  • key_cache_block_size - block 의 크기(bytes, 기본값 1024)

mysql> show status like '%key%';
+------------------------+-----------+
| Variable_name          | Value     |
+------------------------+-----------+
| Com_preload_keys       | 0         |
| Com_show_keys          | 2945      |
| Handler_read_key       | 365020739 |
| Key_blocks_not_flushed | 0         |
| Key_blocks_unused      | 222601    |
| Key_blocks_used        | 231960    |
| Key_read_requests      | 847204435 |
| Key_reads              | 4195954   |
| Key_write_requests     | 25034738  |
| Key_writes             | 16452136  |
+------------------------+-----------+
10 rows in set (0.00 sec)

Key Buffer Usage = 1 - ((Key_blocks_unused × key_cache_block_size) / key_buffer_size)
Key_reads/Key_read_requests Rate(%) =  Key_reads/Key_read_requests * 100 
Key_reads/Key_read_requests Relative Rate(%) = (1- ^Key_reads/^Key_read_requests) * 100

* ^Key_Reads = Current Key_Rreads - Previous Key_Reads


3. 튜닝

  • key_buffer_size는 총 메모리 크기의 25% 정도의 크기로 설정하는 것이 좋습니다.
  • Key_reads/Key_read_requests Rate(%)은 일반적으로 1%보다 적습니다. 1% 보다 높다면 Key Cache가 아닌 디스크를 읽은 경우가 많다고 판단할 수 있습니다. 또한 Key_reads/Key_reads_requests Relative Rate(%) 값이 지속적으로 90% 이상일 경우는 key_buffer_size가 효율적으로 설정되어 있다고 생각하시면 됩니다. 하지만 데이터베이스가 엄청나게 크거나 여러 데이터를 골고루 많이 읽는 데이터베이스라면 아무리 많은 양의 키 캐시를 설정해도 90% 이상의 적중률을 얻을 수는 없습니다.

라. 적용


system variables은 my.cnf 또는 my.ini 파일을 수정 후 MySQL Server 를 재시작 해 주십시요.

[www@smson www]$ vi /etc/my.cnf  

# The MySQL server
[mysqld]
port            = 3306
socket          = /tmp/mysql.sock
skip-locking
skip-name-resolve
key_buffer = 256M
max_allowed_packet = 1M
table_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache = 8
query_cache_size= 16M
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 8
wait_timeout = 120

~~~

[root@smson mysql]# /usr/local/mysql/share/mysql/mysql.server restart


마. 참고


 


출처 : http://www.ihelpers.co.kr/programming/lec.php?CMD=view&TYPE=1&KEY=&SC=S&&CC=&PAGE=1&IDX=253

작성자 : 손상모

반응형

댓글()

MySQL 원격에서 접속하기

리눅스/MySQL|2015. 1. 16. 10:47
반응형

원격지에서

# mysql -h [아이피] -u [데이타베이스명] -p (엔터)
(암호입력)

예)
mysql -h 192.168.10.2 -u testdb -p (엔터)
(암호입력)


반응형

댓글()

error while loading shared libraries: libmysqlclient.so.xx 등의 오류

리눅스/MySQL|2015. 1. 16. 10:47
반응형

error while loading shared libraries: libmysqlclient.so.12: cannot open shared object file: No such file or directory 

이라는 에러가 떴을경우.. 
우선 저 libmysqlclient.so.xx (뒤에 xx는 버전..) 파일을 찾는다. 
find 를 사용해도 되지만, 보통 mysql이 설치된 디렉토리의 lib폴더 안에 있다. 
만약 /usr/local/mysql/lib 디렉토리에 libmysqlclient.so.xx 파일이 있다면 
/etc/ld.so.conf 파일에 저 경로 (/usr/local/mysql/lib) 를 추가해준후 
shell> ldconfig  를 실행시켜준다. 


[출처] 조인시위키 (http://joinc.co.kr/modules/moniwiki/wiki.php/Site/Mysql/Used_Mysql?action=diff)

반응형

'리눅스 > MySQL' 카테고리의 다른 글

MySQL DataBase 서버 튜닝 - Connection, Memory  (0) 2015.01.16
MySQL 원격에서 접속하기  (0) 2015.01.16
mysql table 복구 예  (0) 2015.01.16
mysql table 복구 방법  (0) 2015.01.16
mysql 쿼리 실시간 확인하기  (0) 2015.01.16

댓글()

mysql table 복구 예

리눅스/MySQL|2015. 1. 16. 10:47
반응형

mysql> check table myboard;

+---------------------+-------+----------+--------------------------------------
| Table               | Op    | Msg_type | Msg_text
+---------------------+-------+----------+--------------------------------------
| sysdocu.myboard | check | warning  | Table is marked as crashed
sysdocu.myboard | check | warning  | 1 client is using or hasn't closed th
| sysdocu.myboard | check | error    | Size of datafile is: 8323072
| sysdocu.myboard | check | error    | Corrupt

+---------------------+-------+----------+--------------------------------------
4 rows in set (0.02 sec)



mysql> repair table myboard;
+---------------------+--------+----------+-------------------------------------------------------+
| Table               | Op     | Msg_type | Msg_text                                              |
+---------------------+--------+----------+-------------------------------------------------------+
sysdocu.myboard | repair | info     | Found block that points outside data file at 8322744  |
sysdocu.myboard | repair | info     | Found block with too small length at 8322772; Skipped |
sysdocu.myboard | repair | status   | OK                                                    |
+---------------------+--------+----------+-------------------------------------------------------+
3 rows in set (0.50 sec)



mysql> check table myboard;
+---------------------+-------+----------+----------+
| Table               | Op    | Msg_type | Msg_text |
+---------------------+-------+----------+----------+
sysdocu.myboard | check | status   | OK       |
+---------------------+-------+----------+----------+
1 row in set (0.10 sec)


반응형

댓글()

mysql table 복구 방법

리눅스/MySQL|2015. 1. 16. 10:46
반응형

혹, mysql 도 정상 구동 되어 있고 특정 데이터베이스 사용시 문제가 생긴다면 ..

mysql/data 에 가보면 hostname.err 파일이 있습니다.

그 파일을 열어 혹시 데이터베이스나, 테이블 등이 깨진 것은 아닌지도 확인해보시면 좋을 것으로 보입니다.

오류마다 메세지는 다르겠지만, 보통 데이터베이스나 테이블 깨졌을 때는

해당 테이블을 찾을 수 없다 (?) 는 식의 메세지가 주기적으로 계속해서 발생할 수 있습니다.

백업 파일이 있다면 해당 파일로 복원하거나, 복구 명령으로 복구 하시면 됩니다.

 

복구 방법

# service mysqld stop    -> 데몬 중지
# mkdir /home/imsi    -> 해당 테이블을 백업 시킬 임시 디렉토리 생성
# cp -arp /usr/local/mysql/data/* /home/imsi    -> 해당 테이블 백업
# /usr/local/mysql/bin/myisamchk -o /usr/local/mysql/data/*/*.MYI
# service mysqld start

[주의] 다른 데이타베이스에도 영향을 미칩니다. (유저 계정이 변경되는 예도 있었음. 백업 필수!!)
            상위 명령어 네번째 항목 /*/*.MYI 에 폴더경로, 테이블 명까지 넣어서 복구범위를 줄일수 있음.

myisamchk 로 복구 되지 않는 경우 아래의 방법을 쓰면 복구 되기도 합니다.

아래 명령어는 mysql 을 실행중인 상태에서 사용하셔야 합니다.
# mysqlcheck -u root --auto-repair -B 데이터베이스명 -p


[출처] 지식인 (http://kin.naver.com/detail/detail.php?d1id=1&dir_id=10202&eid=noJFypEggRUquWZxlo/FaauFPRsHVCUq&qb=bXlzcWwgcmVwYWlyILq5sbgguO23yQ==&pid=fLtIMdoi5Tlssbtq7RRsss--227692&sid=SNB0jCp00EgAAFZIE1g)

반응형

댓글()

mysql 쿼리 실시간 확인하기

리눅스/MySQL|2015. 1. 16. 10:46
반응형

# /usr/local/mysql/bin/mysqladmin -i3 processlist -p

[참고] i3 은 3초마다 보여주기

또는 mysql 로그인 후, 

mysql> show processlist;

반응형

댓글()

mysql 로그 안쌓이게 하는 방법

리눅스/MySQL|2015. 1. 16. 10:45
반응형

/etc/my.cnf 파일을 열어서

log-bin=mysql-bin
server-id   = 1

위의 두줄을 주석처리 해주고 mysql을 재시작 하면 됩니다.

반응형

댓글()

PHPMyAdmin 2.11.5.1 설치 (2.11.7 포함)

리눅스/MySQL|2015. 1. 16. 10:45
반응형

이프로그램은 웹상에서 해당서버에 위치한 자신의 계정 DB를 관리할 수 있는 강력 데이타베이스 관리할 수 있는 원격 툴(Tool)이다. 이것은 PHP로 작성된 웹프로그램이므로 PHP가 설치된 서버에서만이 작동된다. 국내에서 인기가 좋은 제로보드라는 PHP용 게시판은 MySQL데이타베이스를 이용하는데, 이를 관리하기 위해서는 PHPMyAdmin을 이용하는 것이 매우 유용하다.

그밖에도 MySQL과 연동해서 작동되는 PHP프로그램들을 설치하고 운영할시에는 최소한 이러한 툴정도는 어느정도 다룰줄 알아야만 웹사이트를 관리하고 운영하기가 수월하다. 데이베이스에 대한 백업, 복구, 최적화, 테이블검사와 같이 기능을 포함하고 있으므로 매우용이하기 때문에 초보자들도 이용하기가 쉽다.

이와 같은 데이타베이스를 다루려면 SQL명령어도 사용할줄 알아야 하지만 SQL명령어를 몰라도 DB를 제어할 수 있다.
XPZ에서 MySQL사용하기라는 기초적인 설치방법과 사용방법이 계속적으로 추가될 예정이지만, 이툴만 가지고 충분히 DB를 제어할 수 있으며, 일일이 쉘(Shell)상태에서 명령어를 사용하지 않아도 된다.


아래사이트에서 최신버젼을 다운로드 받을 수 있는데 현재 2.5.7이 정식버젼이지만 상위버젼도 다운로드가 가능하다. 만약 UTF-8을 원한다면 phpMyAdmin 2.6.0-alpha2 is released!-2.6.0을 다운받아서 설치하는게 좋다. 확인한바에 의하면 2.6.0부터 ko-utf-8을 지원한다. (현재 XPZ에서 사용중...)


다운로드
사이트 : http://www.phpmyadmin.net/
신규 버전 다운로드 페이지 : http://www.phpmyadmin.net/home_page/downloads.php
PHPMyAdmin 2.11.5.1 직접 다운로드 : http://prdownloads.sourceforge.net/phpmyadmin/phpMyAdmin-2.11.5.1-all-languages.tar.bz2
PHPMyAdmin 2.11.7 직접 다운로드 : http://prdownloads.sourceforge.net/phpmyadmin/phpMyAdmin-2.11.7-all-languages.tar.bz2


설치

설치는 그저 적당한 폴더를 만들고, 압축을 풀어 업로드하면 되는데, 주의할 점은 보안에 신경을 써야 한다는 것이다. 아무나 작동시키지 못하도록 해야한다.


설치폴더

대부분은 도메인명/phpmyadmin으로 작동을 시킨다. 예) http://system.neulwon.com/phpmyadmin
이경우는 웹사이트 홈폴더 바로 하위에 phpmyadmin이라는 폴더를 만들어 phpmyadmin파일을 업로드시켜서 작동하는 경우이다.


작동환경 설정

압축을 풀어 업로드시켰다면, 그중에 config.inc.php라는 파일을 자신의 실행환경에 맞게끔 편집을 해주어야 한다.

# cp config.sample.inc.php config.inc.php

※ 2.11.7 버젼에서는 config.inc.php 파일대신 /libraries/config.default.php 파일을 아래 내용에따라 편집해준다.


config.inc.php파일 편집

1. phpadmin설치 경로(URL)

$cfg['PmaAbsoluteUri'] = 'http://system.neulwon.com/phpmyadmin/';
예) $cfg['PmaAbsoluteUri'] = 'http://웹주소URL/phpmyadmin폴더명/';


2. MySQL이설치된 서버경로(URL)

$cfg['Servers'][$i]['host'] = 'localhost';                                        // PHPMyAdmin 2.11.5.1 에는 이 항목이 이미 존재한다.
예) $cfg['Servers'][$i]['host'] = 'localhost';                                  // PHPMyAdmin이 작동되는 서버상에 DB가 존재할때
예) $cfg['Servers'][$i]['host'] = 'http://www.freesql.net';            // 원격서버상에 DB가 존재할때


3. MySQL이 접속포트

$cfg['Servers'][$i]['port'] = '';                        // 기본포트는 3306이고, 비어두면 기본포트 3306으로 작동.
예) $cfg['Servers'][$i]['port'] = '3333';          //포트번호 3333으로 작동하는 경우 


4. MySQL로 발급받은 사용자명과 패스워드 설정

사용자 system, 패스워드 12345678경우 아래와 같이 설정.
$cfg['Servers'][$i]['user'] = 'system'; 
$cfg['Servers'][$i]['password'] = '12345678'; 


5. MySQL로 사용을 허가받은 데이타베이스명 설정

대부분은 MySQL사용을 허가 받으면 관리자로 부터 사용자아이디, 패스워드, 데이타베이스명을 할당받게 되고, 이를 잘 모를시에는 데이타베이스 관리자에게 문의를 하면 된다.

$cfg['Servers'][$i]['only_db'] = 'system';               // 대부분 사용자명과 데이타베이스명이 동일할때


6. 

$cfg['blowfish_secret'] = 'hahaha';                         // 이부분에 아무 내용이나 넣어준다.
※ 2.11.7 버전에서는 이 항목만 config.inc.php 파일에서 수정을 해준다.

[잠깐] 다음과 같은 오류메세지가 뜰 경우 : The configuration file now needs a secret passphrase (blowfish_secret). 
            본 값을 지정해놓지 않아서 이다. 설정 변경 후, 웹브라우져의 쿠키, 임시페이지 삭제 후 재접속 해본다.

자 위의 6개 설정이 정확하게 이루어 졌다면 PHPMyAdmin가 정상 작동 할것이다.
http://system.neulwon.com/phpmyadmin
서버가 국내에 한글 웹사이트라면 서버환경을 읽어들여 자동으로 한글텍스트로 뜨게 된다.

중요한 것은 PHPMyAdmin은 직접 자신의 데이타베이스를 관리하는 것이므로 아무나 건들이지 못하게 보안 설정을 해주어야 하는데 PHPMyAdmin자체적으로 가지고 있는 인증설정을 통해 1차적인 보안설정을 하게 된다.


7. PHPMyAdmin의 기본 보안 설정

위의 5번까지 편집사항에 추가적으로 다음과 같은 라인을 찾아 cookie로 바꾼다.
$cfg['Servers'][$i]['auth_type'] = 'config';                 //기본 설정된 값
$cfg['Servers'][$i]['auth_type'] = 'cookie';                //cookie로 바꾼다.

위 그림에서는 korean(ko-ks_c_5601)로 되어있지만, ko-euc-kr로도 인식하기 때문에 자신의 웹환경에 맞는 인코딩을 선택해야 한다. system처럼 UTF-8을 사용시에는 ko-utf-8로 사용을 해야 하는데 위에서 말한데로 2.6.x버전 이상을 사용해야 한다. 한글 인코딩은 대단히 중요하기 때문에 주의를 해야한다. 잘못 설정하면 죽도 밥도 아닌 인코딩이 될 수 있다. 이러한 경우 데이타베이스 자체를 손상시킬 수 있기 때문에 매우 중요하다. 


[출처] Tong - BlueSky_08님의 APM통
[수정] 차동훈

----------------------------------------------------------

팁!!

config.inc.php 파일안에

$cfg['Servers'][$i]['user'] = '';
$cfg['Servers'][$i]['password'] = '';
$cfg['Servers'][$i]['only_db'] = '';

내용을 채우면 root로 로그인 하더라도 해당 DB로밖에 접근할 수 없지만,
위처럼 공란으로 두게 되면 root로그인시, 모든 DB를 제어할 수 있습니다.



반응형

댓글()

데이타 임포트시 한글 깨짐문제 - 캐릭터셋 설정

리눅스/MySQL|2015. 1. 16. 10:44
반응형

[문제]
1. 엑셀로 모든 데이타를 준비해두었다.
2. mysql dataktma폴더에 csv파일로 저장을 했다.
3. csv파일과 동일한 구조의 member테이블도 만들어 두었다.
4. load data infile 'member.csv' into table member fields terminated by ',';
5. 임포트는 잘되었는데 select로 긁어보면 한글이 깨져보인다...


[해결]
1. 벨 짓 다 해본다.
2. 엑셀에서 내보낼때 dbf 형식으로 내보낸다. -> 그래도 안된다.
3. MyDB 툴을 써서 임포트 해본다. -> 이래도 안된다.
4. SQLGate에서 임포트 해본다(엑셀 그대로,csv형태로,ddbf형태로) -> 이래도 안된다
5. 혹시나 싶어 울트라에디트에서 끝줄 공백 없애본다. -> 소용없이 안된다.
6. character set 변수를 확인해본다(my.ini파일) -> 이상없이 "euckr"로 설정돼 있다.
7. 데이타베이스 사랑넷(database.sarang.net)에서 한글깨짐 검색을 해본다.
8. 마침내 의미 있는 정보를 얻는다. 
( show variables명령어를 통해서 보니까 character set 관련 변수가 굉장히 많은게 아닌가?
- character_set_client : euckr
- character_set_connection : latin1
- character_set_database : latin1
- character_set_results : euckr
- character_set_server : latin1


하여간 보니깐 위 처럼 중간중간 "latin1"이라는 캐릭터셋이 설정돼 있는게 아닌가?
바로 저거다 싶어서 어떻게 저것들을 바꿀 수 있는지 검색한다.

9. alter database명령어로 바꿀 수 있음을 알게 된다.
10. alter database ktma default character set euckr;
이상하게 위 명령어는 안먹힌다. 따라서 변수별로 아래 명령어를 날려준다.

mysql> SET character_set_client = euckr;
mysql> SET character_set_results = euckr;
mysql> SET character_set_connection = euckr;
명령어를 때린다.
11. 엑셀에서 csv파일로 저장한다.
12. load data infile 'member.csv' into table member fields terminated by ',';
명령어를 때린다.
13. 결과를 확인한다....빠샤빠샤~ 됐다...됐어...그럼 그렇지 짜식~ 지가 안되고 배겨??ㅋㅋㅋ

[ 06-08-23 추가 ]
처음 xp에 mysql을 설치할때 캐릭터셋에 관해서는 환경설정 시에 "euckr"을 기본으로 설정해서 설치했다.
그런데 도스창에서 실행해보면 이상하게도 디폴트로 "latin1"이 설정이 되는게 아닌가?

C:>mysql -u chang -p kimchpekr 하고 로긴한 후에
mysql>show variables like 'character%'; 명령어로 환경변수를 보면....
여러가지 캐릭터 셋이 "latin1"으로 설정이 되는게 아닌가?

이 상태에서
mysql>set character_set_connection=euckr;  명령어를 통해 캐릭터셋을 변경하면 세션 중에만 반영이 되고, 로그아웃 후에 다시 들어와보면 처음과 같이 된다.

결국 캐릭터셋을 바꾸는 set명령은 세션 생성할때마다 해주어야 하는 번거로운 절차가 아닐 수 없다.
다만, 클라이언트로 접속하기 전 명령줄에 아래와 같이 하면 로긴 후에 5개 정도의 set명령을 한 번으로 줄일 수는 있다.

C:>mysql -u chang -p kimchpekr --default-character-set=euckr --skip-character-set-client-handshake

그렇다면 sql데이타를 임포트하는 경우 한글이 깨진다면 아래와 같이 생각해야 한다...
생성된 sql 파일의 캐릭터셋과 집어 넣고자 하는 mysql서버 캐릭터셋이 다르기때문에 그런 문제가 생기는 것이다.

이 문제는 이렇게 해결할 수 있다.

C:>mysql -u chang -p kimchpekr < backup.sql 로 명령해서 한글이 깨진다면....

C:>mysql -u chang -p kimchpekr --default-character-set=euckr < backup.sql 이 명령으로 해결할 수 있다.

즉, 임포트시에 euckr로 캐릭터셋을 맞추고 집어 넣으면 된다.

[ 06-11-24 추가 ]
위와 같은 방법으로 해도 에러가 난다. 그래서 다른 방법으로 해봤다.

1. 덤프할때의 절차가 중요하다.
기존에는 호스팅 회사에서 제공해주는 phpmyadmin을 통해서 sql파일을 만들어 저장하고, 옮길 서버로 업로드 시키고, ssh쉘을 통해서 임포트 명령을 주는 절차를 따랐는데

2. 이번에는 모든 작업을 ssh쉘에서 진행해봐싸.
ssh쉘에서 덤프 명령을 통해 sql파일을 만든다. 그 파일을 임포트 할 디비가 있는 서버로 옮긴 뒤 역시 ssh쉘을 통해 임포트할 서버로 로그인 한 뒤에 그 안에서 임포트 명령을 했다.

이랬더니 한글 깨짐 현상이 없더군...ㅠ.ㅠ


출처 : http://www.localhost.co.kr/v4/bbs/board.php?bo_table=DB_3_MYSQL&wr_id=8

반응형

댓글()

캐릭터셋(CharSet) 변경

리눅스/MySQL|2015. 1. 16. 10:43
반응형

캐릭터 셋 utf-8 에서 euckr 로 바꾸는 예제

1) 확인
mysql> show variables like 'c%';

+--------------------------+----------------------------------------+
| Variable_name            | Value                                  |
+--------------------------+----------------------------------------+
| character_set_client     | utf8                                   |  <- 변경
| character_set_connection | utf8                                   |  <- 변경
| character_set_database   | utf8                                   |  <- 변경
| character_set_filesystem | binary                                 |
| character_set_results    | utf8                                   |  <- 변경
| character_set_server     | utf8                                   |  <- 변경
| character_set_system     | utf8                                   |
| character_sets_dir       | /usr/local/mysql/share/mysql/charsets/ |
| collation_connection     | utf8_general_ci                        |  <- 변경
| collation_database       | utf8_general_ci                        |  <- 변경
| collation_server         | utf8_general_ci                        |  <- 변경
| completion_type          | 0                                      |
| concurrent_insert        | 1                                      |
| connect_timeout          | 5                                      |
+--------------------------+----------------------------------------+


2) 변경 (일시적인 방법. MySQL을 재시작 하면 원래 값으로 돌아간다.)
msyql> set character_set_client = euckr;
msyql> set character_set_connection = euckr;
msyql> set character_set_database = euckr;
msyql> set character_set_results = euckr;
msyql> set character_set_server = euckr;
mysql> set collation_connection = euckr_korean_ci;
mysql> set collation_database = euckr_korean_ci;
mysql> set collation_server = euckr_korean_ci;

3) 확인
mysql> show variables like 'c%';
+--------------------------+----------------------------------------+
| Variable_name            | Value                                  |
+--------------------------+----------------------------------------+
| character_set_client     | euckr                                  |
| character_set_connection | euckr                                  |
| character_set_database   | euckr                                  |
| character_set_filesystem | binary                                 |
| character_set_results    | euckr                                  |
| character_set_server     | euckr                                  |
| character_set_system     | utf8                                   |
| character_sets_dir       | /usr/local/mysql/share/mysql/charsets/ |
| collation_connection     | euckr_korean_ci                        |
| collation_database       | euckr_korean_ci                        |
| collation_server         | euckr_korean_ci                        |
| completion_type          | 0                                      |
| concurrent_insert        | 1                                      |
| connect_timeout          | 5                                      |
+--------------------------+----------------------------------------+


4) 변경2 (온전한 변경 방법)

/etc/my.cnf 파일을 변경 해줍니다.

[client] 
default-character-set=euckr 

[mysqld] 
default-character-set=euckr        // 이 옵션은 5.5 버전에서 적용되지 않으므로 빼시기 바랍니다.
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 

[mysql] 
default-character-set=euckr 

추가 및 변경 후, MySQL 을 재시작 해주어야 적용된다.


5) 아파치 캐릭터셋 확인

/usr/local/apache/conf/httpd.conf 파일을 변경(내용 추가)해줍니다.

AddDefaultCharset euckr


※ 참고1 : UTF-8사용 : AddDefaultCharset UTF-8
    참고2 : Apache 버젼 2.2.6 이상의 경우, /usr/local/apache/conf/extra/httpd-languages.conf 를 수정.

추가 및 변경 후, Apache 를 재시작 해주어야 적용된다.

 

 

[참고]

5.0 버전에서 확인한 결과 my.cnf에서 아래 세군데만 바꿔도 변경(또는 등록) 가능했습니다.

[client]
default-character-set=euckr

[mysqld]
default-character-set=euckr

[mysql]
default-character-set=euckr



반응형

댓글()

mysql 에서 트랜젝션 걸기 (이노디비 사용)

리눅스/MySQL|2015. 1. 16. 10:43
반응형

(기본 예제)
SET AUTOCOMMIT=0;
BEGIN;

...... query;

COMMIT;
ROLLBACK;

위의 예제를 사용하시려면 table 이 innodb 타입으로 되어 있어야 합니다.

참고1) innodb 타입으로 생성하려면...
create table table_name
(
......
)type=innode;

참고2)  innodb는 기본족으로 MySQL 4.0 이후 버전부터 지원하며,
              지원여부를 알고 싶으시면...

mysql> show variables like 'have_%' 라고 치신 후

have_innode=YES 라고 나오면 innodb가 사용 가능한 MySQL 입니다.

참고3) 4.0 이후 버전인데도 innodb를 사용못하게 설정 되어 있다면
            my.ini 파일에서...

[mysqld]
innodb_data_file_path = ibdata1:10M:autoextend
set-variable = innodb_buffer_pool_size=70M
set-variable = innodb_additional_mem_pool_size=10M
set-variable = innodb_log_file_size=20M
set-variable = innodb_log_buffer_size=8M
innodb_flush_log_at_trx_commit=1


저장할 파일명과 크기, 버퍼 크기, 로그 파일 크기 등이 나와 있습니다.
원하는 크기로 설정, 저장을 하고 mysql을 재시작 하면 됩니다.

반응형

댓글()