Media Log

MySQL 4.0 -> 4.1 (or 5.0) 업데이트 문서

글쓴이: 티니 (2007년 01월 08일 오전 11:17) 읽은수: 644

--------------------------------------------------------------------------------------
- 작성자 : 김혁중(티니) [sky(golbangi or at)tini4u.net]
- 작성일 : 2007-01-08
- 사이트 : http://linux.tini4u.net/
- 원제목 : MySQL 4.0 -> 4.1 (or 5.0) 업데이트 문서
- 환 경 : Linux
- 키워드 : mysql, update, 4.0, 4.1, 5.0
--------------------------------------------------------------------------------------
이번 강좌는 MySQL 4.0에서 MySQL 4.1(혹은 5.0)으로 업데이트 하는 방법에 대해 다루겠습니다.
물론 인터넷이 이미 수많은 문서가 있기 때문에 다들 한번씩은 그 문서를 접해보셨을거라 생각합니다.
그러나 그 문서의 내용을 실제로 적용하려고 할 때 제대로 되지 않아 낭패를 보신 분들이 많을것입니다.
또한 현재 인터넷에 있는 문서들은 euckr이나 utf8등의 어느 한쪽 방향으로만 컨버팅 해서
사용을 하게 만들고 있는데 여기서 우리가 주의해야 될 사항이 있습니다.
바로 각 웹어플리케이션의 특징들 입니다.

그 일례로 가장 많이 쓰이는 웹 프로그램들 몇개의 속성을 알려드리도록 하겠습니다.
제로보드4 - euckr, 그누보드 - euckr, 테터툴즈 - utf8, 갤러리 - utf8, phpbb - euckr ....
이처럼 각 프로그램의 데이터 저장 방식의 포맷이 서로 다르기 때문에 어느 한쪽으로만
컨버팅해서 운영하게 되면 기존 데이터는 유지될지 몰라도 차후 데이터를 기록할 때 문제가 됩니다.
물론 하나의 DB에 하나의 프로그램만을 설치해서 사용한다면 크게 문제될 사항은 없습니다.

다만 여러개의 프로그램을 병합해서 사용하는 사용자들이 문제가 되는것이죠.
왜냐하면 예를 들어 제로보드4의 기존 데이터를 모두 utf8로 컨버팅 해서 업데이트를 마쳤다 하더라도
프로그램에서는 계속해서 euckr로 기록하려고 하기 때문에 결국 데이터를 제대로 기록할 수 없게
되는 것이며, 이를 해결하려면 결국 프로그램의 소스를 일일히 뜯어 고쳐야 되기 때문입니다.

따라서 필자는 가장 기본적인 부분부터 순서대로 강좌를 써보도록 하겠습니다.

※ 아래 사항은 업데이트 작업을 하기전에 반드시 확인을 하시기 바랍니다.
MySQL 4.0에서 업데이트를 하기전에 MySQL DataBase의 포맷이 ISAM(3.x에서 만든것)인지
확인을 하시고, 만약 ISAM의 포맷을 가지고 있다면 MyISAM 포맷으로 변경을 해야 됩니다.
이를 확인하는 방법은 DataBase 디렉토리(/var/lib/mysql/mysql)에서 ls *.ISM을 실행했을 때
ISM의 확장자를 가진 파일이 나온다면 현재 DataBase의 포맷이 ISAM 인 것입니다.
만약 ISM 파일이 존재한다면 4.1로 업데이트를 하기전에 아래 명령어를 사용해서 DataBase의
포맷을 MyISAM으로 반드시 변경해주시기 바랍니다.
[root@localhost]# mysql_fix_privilege_tables --password=MySQL_ROOT_PASSWORD


1. 기존 MySQL 데이터의 덤프백업
셔츠의 단추를 끼울때 첫 단추를 제대로 끼워야 모든 단추 구멍이 맞는 것처럼 업데이트 또한
첫 시작이 매우 중요합니다.
기존 3.23 -> 4.0으로 업데이트 할 때처럼 MySQL만 업데이트를 하는것이 아니고,
굳이 기존 데이터를 백업하려고 하느냐 라고 궁금증을 유발하시는 분이 계실수 있습니다.
바로 그 이유는 DataBase의 필드값 때문 입니다.
DB 안에는 수많은 테이블이 생성되어 있고, 테이블마다 필드의 값이 기록되어 있습니다.
필드값이란 하나의 필드에 기록될 수 있는 최대량을 정해두는 값을 의미하는데,
만약 Name 이라는 필드에 255의 필드값을 지정해줬다면 최대 255자까지 기록할 수 있다는것 입니다.
그런데 MySQL 4.1 버전부터는 MultiByte를 사용하는 DB의 경우 필드값이 반으로 줄어버립니다.
그렇기 때문에 마지막 복원절차에서 사용할 백업데이터를 만들어 두는 것입니다.

기존의 많은 문서를 보면 현재의 MySQL이 운영되는 케릭터셋을 확인하라고 하기도 하고,
또 덤프받은 파일을 열어서 TYPE=MyISAM;을 ENGINE=MyISAM DEFAULT CHARSET=euckr;
이런식으로 변경하라는 내용이 많이 있습니다만, 이것은 크게 도움이 되지 않습니다.
왜냐하면 보통 저 부분은 CREATE문 아래에만 있기 마련인데, 이런 경우 Table은 지정된
케릭터셋으로 생성이 되지만, 실제 데이터를 입력하는 Insert문은 해당되지 않습니다.
그렇기 때문에만약 저런 작업을 한다고 가정한다면 CREATE문 뿐만 아니라 모든 Insert문에도
기본 케릭터셋을 맞춰서 지정해줘야 됩니다.
왜냐하면 백업된 데이터를 복원할 때는 MySQL의 character set을 따라가기 때문입니다.

백업을 할때 구분해서 백업할 종류가 2개가 있습니다.
첫째. 단일 케릭터셋 데이터가 기록되어 있는 경우
☞ 특정 프로그램 하나만 사용하는 경우 (euckr이면 euckr, utf8이면 utf8)
둘째. 여러개의 케릭터셋 데이터가 기록되어 있는 경우
☞ 다수의 프로그램이 사용하는 경우 (제로보드+그노보드+테터툴즈... euckr+utf8)

개인서버를 운영하시는 분들이라면 여러개의 DB를 사용할 수 있기 때문에 보통은
첫번째의 경우처럼 하나의 DB에 동일한 케릭터셋을 사용하는 프로그램이 많을 것입니다.
그러나 다수의 사용자가 이용하는 서버를 운영하는 분들이라면 보통은 DB를 1개만 발급하므로,
사용자는 그 DB안에 여러개의 프로그램을 같이 병합해서 사용하고 있을 것입니다.

첫번째처럼 하나의 케릭터셋(only euckr, only utf8)을 이용하는 경우에는 백업이 매우 간단합니다.
[root@localhost]# mysqldump -F -n --add-drop-table -u root -p db_name > db_name.sql

그러나 두번째처럼 여러개의 케릭터셋을 이용하는 경우에는 백업이 매우 복잡해집니다.
이런 경우에는 케릭터셋을 유지하면서 복원해야 되기 때문에 각 테이블별로 백업을 해야 됩니다.
※ 이런 경우 스크립트를 만들어서 백업하시면 매우 편리하겠죠?
[root@localhost]# mkdir db_name
[root@localhost]# cd db_name
[root@localhost]# mysqldump -u root -p db_name table_name > table_name.sql


2. 기존 MySQL 데이터의 데이터백업
위에서 각 MySQL 데이터를 덤프형태로 한번씩 백업을 해주었지만, 혹시 모를 만약의 사태를 대비해
기존의 데이터를 데이터파일 형태 자체로 백업을 해둡니다.
[root@localhost]# mkdir db-bak
[root@localhost]# cp -pR /var/lib/mysql/* ./db-bak/


3. MySQL 4.0의 정지
이제 덤프백업과 여유백업인 데이터 백업까지 모두 끝났으므로 서비스를 중지 합니다.
[root@localhost]# /etc/init.d/mysql stop


4. MySQL 4.0의 삭제
이제 MySQL 4.1로의 업데이트를 위해 기존의 4.0을 삭제하도록 하겠습니다.
아래는 RPM으로 설치해서 사용했던 경우를 예제로 들었습니다.
만약 RPM이 아니신 분들은 알아서 삭제하시길 바라며, 삭제하실때 DataBase 디렉토리는
절대로 삭제하시면 안됩니다.
[root@localhost]# rpm -e MySQL-Max MySQL-server MySQL-client MySQL-shared MySQL-devel


5. MySQL 4.0의 환경설정 파일 삭제
MySQL의 Global 환경설정 파일은 /etc/my.cnf 파일 입니다.
이 파일은 MySQL 4.0과 4.1은 호환되지 않으므로 반드시 삭제하고 다시 만들어야 됩니다.
[root@localhost]# rm -f /etc/my.cnf


6. MySQL 4.1의 설치
이제 본격적인 MySQL 4.1로의 업데이트 작업을 시작하도록 하겠습니다.
아래는 RPM으로 설치하는 경우이며, 그 외의 분들은 알아서 설치하시기 바랍니다.
[root@localhost]# mkdir mysql-4.1
[root@localhost]# cd mysql-4.1
[root@localhost]# wget http://dev.mysql.com/get/Downloads/MySQL-4.1/MySQL-server-standard-4.1.22-0.rhel3.i386.rpm/from/http://mysql.holywar.net/
[root@localhost]# wget http://dev.mysql.com/get/Downloads/MySQL-4.1/MySQL-client-standard-4.1.22-0.rhel3.i386.rpm/from/http://mysql.holywar.net/
[root@localhost]# wget http://dev.mysql.com/get/Downloads/MySQL-4.1/MySQL-shared-standard-4.1.22-0.rhel3.i386.rpm/from/http://mysql.holywar.net/
[root@localhost]# wget http://dev.mysql.com/get/Downloads/MySQL-4.1/MySQL-devel-standard-4.1.22-0.rhel3.i386.rpm/from/http://mysql.holywar.net/
[root@localhost]# rpm -Uvh MySQL-*.rpm
[root@localhost]# cp -p /usr/shared/mysql/my-huge.cnf /etc/my.cnf
[root@localhost]# chmod 600 /etc/my.cnf


7. MySQL 4.1 시작에러 대체
소스컴파일 해서 사용하는 분들은 상관이 없지만 RPM으로 설치하려는 분들은 설치 직후,
MySQL이 시작이 되지 않는분들이 있을 것입니다.
그런 경우 Ctrl + C 를 이용해서 시작을 강제중지 시키시기 바랍니다.
강제중지를 시킨뒤 MySQL의 에러로그를 보면 아래와 같은 메시지가 있을 것입니다.
[root@localhost]# cat /var/lib/mysql/hostname-err
[Warning] './mysql/host' had no or invalid character set, and default character set is multi-byte, so character column sizes may have changed
[Warning] './mysql/user' had no or invalid character set, and default character set is multi-byte, so character column sizes may have changed
[Warning] './mysql/db' had no or invalid character set, and default character set is multi-byte, so character column sizes may have changed
[ERROR] Fatal error: mysql.user table is damaged or in unsupported 3.20 format.
mysqld ended

이것은 mysql의 user를 관리하는 table이 3.20 포맷으로 만들어졌기 때문 입니다.
나는 mysql 4.0에서 업데이트 하는데 왜 3.20 포맷이냐고 궁금해 하실지 모르겠습니다.
그 이유는 기본적인 포맷방식이 4.0까지는 3.20 포맷을 따르기 때문 입니다.
이런 경우 아래의 방법을 통해서 mysql 데몬을 임시적으로 실행할 수 있습니다.
[root@localhost]# mysqld_safe --skip-grant-tables --user=mysql &


8. MySQL 4.1 DataBase Migration
MySQL 4.1을 시작하고 난 뒤에 에러로그를 보면 아래와 같은 메시지가 있을 것입니다.
[root@localhost]# cat /var/lib/mysql/hostname-err
[Warning] './mysql/user' had no or invalid character set, and default character set is multi-byte, so character column sizes may have changed
[Warning] './mysql/host' had no or invalid character set, and default character set is multi-byte, so character column sizes may have changed
[Warning] './mysql/db' had no or invalid character set, and default character set is multi-byte, so character column sizes may have changed
[Warning] './mysql/tables_priv' had no or invalid character set, and default character set is multi-byte, so character column sizes may have changed
[Warning] './mysql/columns_priv' had no or invalid character set, and default character set is multi-byte, so character column sizes may have changed
[Warning] './mysql/func' had no or invalid character set, and default character set is multi-byte, so character column sizes may have changed

이것은 기존 MySQL이 Multi-Byte 케릭터셋을 지원하지 않기 때문 입니다.
이 문제를 fix 하기 위하여 아래의 명령어를 사용해서 픽스할 수 있습니다.
[root@localhost]# mysql_fix_privilege_tables --password=MySQL_ROOT_PASSWORD
This script updates all the mysql privilege tables to be usable by
MySQL 4.0 and above.

This is needed if you want to use the new GRANT functions,
CREATE AGGREGATE FUNCTION, or the more secure passwords in 4.1

done


9. MySQL 4.1 환경설정
MySQL 4.1을 설치하고 위에서처럼 기본적으로 제공해주는 환경설정 파일을 그대로 가져다 쓰면
기본적으로 MySQL은 utf8의 형식을 가지고 운영되어 집니다.
그러나, 아직까지 한국의 많은 프로그램들이 euckr로 데이터를 기록하기 때문에
필자는 MySQL의 기본 케릭터셋을 euckr로 사용하도록 하겠습니다.
☞ MySQL 4.1은 Multi-Language를 지원하기 때문에 기본 케릭터셋을 euckr로 하더라도,
utf8 사용이 가능하기 때문에 걱정하지 않으셔도 됩니다.
※ 기본적인 사항은 그대로 유지하고, 아래 내용만 추가해주시면 됩니다.
[root@localhost]# /etc/init.d/mysql stop
[root@localhost]# vi /etc/my.cnf
[client]
default-character-set = euckr
[mysqld]
old_password = 1
default-character-set = euckr
init_connect = set names euckr
[mysqldump]
default-character-set = euckr
[mysql]
default-character-set = euckr
[root@localhost]# /etc/init.d/mysql start


10. MySQL 케릭터셋 확인
이제 MySQL이 내가 지정한 케릭터셋대로 운영되고 있는지 확인하도록 하겠습니다.
[root@localhost]# mysql -u root -p
Enter password: MySQL_ROOT_PASSWORD
mysql> status;
--------------
mysql Ver 14.7 Distrib 4.1.22, for pc-linux-gnu (i686) using readline 4.3

Connection id: 1
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 4.1.22-standard
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: euckr
Db characterset: euckr
Client characterset: euckr
Conn. characterset: euckr
UNIX socket: /var/lib/mysql/mysql.sock
Uptime: 8 sec

Threads: 1 Questions: 3 Slow queries: 0 Opens: 11 Flush tables: 1 Open tables: 5 Queries per second avg: 0.375
--------------
mysql> show variables like 'c%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | euckr |
| character_set_connection | euckr |
| character_set_database | euckr |
| character_set_results | euckr |
| character_set_server | euckr |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
| collation_connection | euckr_korean_ci |
| collation_database | euckr_korean_ci |
| collation_server | euckr_korean_ci |
| concurrent_insert | ON |
| connect_timeout | 5 |
+--------------------------+----------------------------+
12 rows in set (0.00 sec)


11. MySQL 데이터 복원
백업할때 언급했던것처럼 기존의 데이터를 그대로 사용하게 되면 필드값이 반으로 줄어버립니다.
따라서 그 문제를 처리하기 위해 MySQL 4.0에서 덤프해놨던 파일을 이용해서 복원합니다.

백업할때와 마찬가지로 복원할때도 2가지 종류가 있습니다.
첫째. 단일 케릭터셋 데이터가 기록되어 있는 경우
☞ 특정 프로그램 하나만 사용하는 경우 (euckr이면 euckr, utf8이면 utf8)
둘째. 여러개의 케릭터셋 데이터가 기록되어 있는 경우
☞ 다수의 프로그램이 사용하는 경우 (제로보드+그노보드+테터툴즈... euckr+utf8)

첫번째처럼 하나의 케릭터셋을 이용하는 경우에는 백업할때와 마찬가지로 복원도 매우 간단합니다.
기존의 데이터가 이용하던 케릭터셋을 그대로 지정해서 복원해주면 되기 때문 입니다.
※ euckr 데이터를 복원할때 (제로보드,그누보드,phpBB 등등..)
[root@localhost]# mysql --default-character-set=euckr -u root -p db_name < db_name.sql
※ utf8 데이터를 복원할때 (테터툴즈, 갤러리 등등..)
[root@localhost]# mysql --default-character-set=utf8 -u root -p db_name < db_name.sql


그러나 두번째처럼 여러개의 케릭터셋을 이용하는 경우에는 복원도 매우 복잡해집니다.
이런 경우를 위해서 백업할때 각 테이블별로 백업을 한 것입니다.
※ 백업할때와 마찬가지로 스크립트를 만들어서 복원하시면 매우 편리할 것입니다.
※ euckr 데이터를 복원할때 (제로보드,그누보드,phpBB 등등..)
[root@localhost]# mysql --default-character-set=euckr -u root -p db_name < table_name.sql
※ utf8 데이터를 복원할때 (테터툴즈, 갤러리 등등..)
[root@localhost]# mysql --default-character-set=utf8 -u root -p db_name < table_name.sql


이제 MySQL 4.0에서 MySQL 4.1로의 업데이트 작업은 모두 끝났습니다.
혹시 누락되거나 미스한 부분이 없는지 확인하시면 됩니다.

12. MySQL 4.1 -> MySQL 5.0 업데이트
자 이제 MySQL 4.0에서 MySQL 4.1로의 업데이트 작업이 성공적으로 끝났습니다.
그럼 마지막으로 최신 버전인 MySQL 5.0으로 업데이트를 하도록 하겠습니다.
사실 이부분은 정말 허무할 정도로 매우 간단하기 때문에 크게 긴장하지 않으셔도 됩니다.
※ 매우 간단한 작업이기 때문에 따로 섹션을 나누지는 않겠습니다.
[root@localhost]# /etc/init.d/mysql stop
[root@localhost]# mkdir mysql-5.0
[root@localhost]# cd mysql-5.0
[root@localhost]# wget http://dev.mysql.com/get/Downloads/MySQL-5.0/MySQL-server-standard-5.0.27-0.rhel4.i386.rpm/from/http://mysql.holywar.net/
[root@localhost]# wget http://dev.mysql.com/get/Downloads/MySQL-5.0/MySQL-client-standard-5.0.27-0.rhel4.i386.rpm/from/http://mysql.holywar.net/
[root@localhost]# wget http://dev.mysql.com/get/Downloads/MySQL-5.0/MySQL-shared-standard-5.0.27-0.rhel4.i386.rpm/from/http://mysql.holywar.net/
[root@localhost]# wget http://dev.mysql.com/get/Downloads/MySQL-5.0/MySQL-devel-standard-5.0.27-0.rhel4.i386.rpm/from/http://mysql.holywar.net/
[root@localhost]# rpm -Uvh MySQL-*.rpm
[root@localhost]# mysql_fix_privilege_tables --password=MySQL_ROOT_PASSWORD


이제 MySQL 4.0->MySQL 4.1->MySQL 5.0으로의 업데이트가 완벽하게 끝이 났습니다.
마지막 MySQL 4.1에서 MySQL 5.0으로의 업데이트는 앞서 말했듯이 정말 허무할정도로
간단하기 때문에 가장 시간이 많이 걸리고, 긴장해야 될 부분은 MySQL 4.0에서 MySQL 4.1로
업데이트 하는 부분 입니다.
이 부분에서만 특별한 문제가 생기지 않는다면 이 강좌를 읽는 모든 분들은 업데이트를
성공리에 끝마칠 수 있을 것이라 생각합니다.

출처 : Tong - nasima님의 Linux통