database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Columns 24242 게시물 읽기
 News | Q&A | Columns | Tutorials | Devel | Files | Links
No. 24242
mysql upgrade -- 세번째(4.1버전)
작성자
이경환(babocom)
작성일
2005-03-04 01:00ⓒ
2005-08-15 10:45ⓜ
조회수
29,359

## 모든 명령어는 mysql 이 설치된 디렉토리를 기준으로 합니다.

## 4.1 버전에선 /usr/local/mysql-4.1 이 되겠죠..

 

두번째까지 아무 문제없이 업그레이드가 됐다면 이제 mysql 사용자로 실행되는 mysql 4.0 버전이 기본소켓인 /tmp/mysql.sock 과 기본포트 3306 으로 실행되고 있을겁니다.

물론 정상적으로 업그레이드 했으면 이전 3.23 버전은 삭제해도 되겠죠...

이제 4.0 -> 4.1 버전으로 업그레이드한 얘기를 해야겠네요..

4.1 에서는 많은부분이 바꼈습니다... 고대하던 서브쿼리 기능이 드뎌 추가됐군요..

 

[4.1 버전의 특징]

1. 서브쿼리 가능

2. INSERT ... ON DUPLICATE KEY UPDATE ... syntax

( insert 시 이미 존재하면 update 함, replace 와 달리 원하는 필드만 update 가능 )

3. unicode 지원 (내부적으로 unicode 사용..)

4. 문자셋 지원 확장 (DB, Table , Column 별로 지정가능)

5. HEAP table 에서의 BTREE index

(range scan 가능.. 그전까진 HASH index 라서 = 연산밖에 못했음..)

6. create table1 like table2 syntax 지원

7. help 명령어 확장

8. user 테이블 password 64비트로 확장

(이전 DB를 복사,이동하는 경우 mysql_fix_privilege_tables 를 실행해야 한다.)

 

가장 주목되는 부분이 서브쿼리 지원이 아닌가 싶습니다.. 기다리고 기다리던 기능이죠.. ^^;;

웹의 특성상(물론 웹이 아니라 다른 모든 프로그램에서도 마찬가지겠지만...) 여러번의 쿼리로 질의하던것을 한번의 쿼리로 해결할 수 있다면 엄청난 속도향상이 있겠죠..

또한 mysql 시스템 내부적으로 unicode 를 사용합니다. 즉 DB 명, 테이블명 등을 모두 유니코드로 저장한다는 것이죠.. 그래서 유니코드에서 사용할 수 있는 대부분의 문자들로 DB 이름이나 테이블 이름을 정할 수 있습니다...

standard ascii 가 아닌 캐릭터로 DB 나 테이블을 생성,사용할때는 이름을 (`) 로 감싸주시는게 좋습니다. (탭키 위에있는 ` 입니다.)

 

일단 설치는 앞서 4.0 을 설치할 때와 마찬가지로 설치를 합니다.. mysql2 계정으로 포트와 소켓을 달리주고 설치, 실행하시면 됩니다.

 

이때 주의해야 할점은 default-character-set 을 꼭 설정해 주셔야 한다는 것입니다. 백업과 복원시에

별도 표기가 없을때는 서버의 기본 글자셋을 따라가게 됩니다. 그러므로 기본 글자셋을 지정해 주지 않으면 초기세팅인 latin1 을 기준으로 모든것이 설정됩니다.

/bin/mysqld_safe 실행시에 --default-character-set=euckr 을 지정해 주시거나

(4.1 부터 한글글자셋 명칭이 euc_kr 에서 euckr 로 변경되었습니다.)

mysql 4.1 의 datadir 에 my.cnf 파일을 생성하여 [mysqld] 섹션에서 default-character-set=euckr 을 지정하거나 mysql2 의 홈디렉토리에 .my.cnf 파일을 두고 그속에 [mysqld] 섹션에서 default-character-set=euckr 을 지정해주는 방법이 있습니다..

 

MyISAM 형식의 테이블을 그냥 복사해서 옮길수도 있고 Dump & Restore 하는 방법도 있는데..

제가 두가지를 모두 해본 결과 두가지의 결과가 다른것을 발견했습니다..

 

4.1 버전부터는 CHAR(4) 라고 하면 4 Byte 가 아니라 캐릭터셋에 따라 글자수 4자까지로 지정됩니다.

즉 2 byte 문자에서는 8 byte 가 되고 1 byte 문자에서는 4 byte 가 할당됩니다.

 

이전 버전의 MyISAM 테이블을 그냥 복사,이동하였을 때는 varchar(10) 이던것이 varchar(5) 로 모두 변경되어 있는것을 볼 수 있었습니다... (물론 데이터는 손실없었습니다. 저장공간 크기는 똑같은 10 byte 니까요..)

Dump & Restore 했을때는 varchar(10) 이던것이 그대로 varchar(10) 으로 되더군요.. (아마 덤프된 sql 구문에 create table 문을 그대로 쓰기 때문인것 같습니다.) 그런데 이때는 결과적으로 20 byte 가 할당되기 때문에 데이타파일의 크기가 커진 것을 볼 수 있었습니다.

char(10) 과 같은 고정크기인 경우는 두배로 커지겠지만 varchar(10) 처럼 가변크기를 사용한 경우는 두배까지 커지진 않고 대략 1.5배 정도 커진것 같습니다.

데이타의 손실은 없으나 추후 입력시 varchar(5) 가 되어버리면 영어건 한글이건 5글자까지만 입력되더군요.. 아마 글자셋에 따라 글자수를 계산하는것 같습니다.

그러니 4.1로 이전할땐 꼭 Dump & Restore 하시기 바랍니다.

 

데이타를 옮기기 전에 설치와 글자셋 설정이 제대로 되었는지 확인을 해야겠지요?

./bin/mysql --socket=/tmp/mysql2.sock -uroot -p

mysql>status

먼저 글자셋 설정이 제대로 되었는지 확인하시기 바랍니다.

---------------------------< 결과 >-----------------------------

Server version: 4.1.10-standard-log
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: latin1
Db characterset: euckr
Client characterset: euckr
Conn. characterset: latin1
UNIX socket: /tmp/mysql2.sock

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

 

여전히 server 와 conn 은 latin1 으로 설정되어 있습니다.

이 부분의 자동설정에 관해서는 인터넷에서 여러 방면으로 검색을 했지만 만족할만한 해결책이 없었습니다. 아래와 같이 해결하는 수밖에 없는것 같습니다.

mysql > set names euckr

이제 status 를 보시면 모든 캐릭터셋이 euckr 로 변경되어 있습니다.

 

이렇게 서버와 클라이언트의 글자셋을 맞춰줘야 정확한 데이타의 입력이 가능합니다..

서버와 클라이언트가 서로 다른 글자셋으로 되어 있다면 서로 다른 말로 대화하는 것과 같습니다.

 

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/local/mysql-4.1.10/share/mysql/charsets/ |
| collation_connection | euckr_korean_ci |
| collation_database | euckr_korean_ci |
| collation_server | euckr_korean_ci |
| concurrent_insert | ON |
| connect_timeout | 5 |
+--------------------------+-----------------------------------------------+

 

위 화면에서와 같이 글자셋을 맞추셨으면 설치는 완료입니다.. 이제 DB 를 이전하면 됩니다.

앞서 말씀드린바와 같이 복사해서 옮기는 것과 Dump 로 옮기는 것에 차이가 있습니다. Dump 방법은...

[4.0 - Dump] ./bin/mysqldump -uroot -p mydatabase > mydatabase.sql

/bin/mv ./mydatabase.sql /usr/local/mysql-4.1/

[4.1 - Restore] ./bin/mysql --socket=/tmp/mysql2.sock --default-character-set=euckr -uroot -p mydatabase < mydatabase.sql

 

mysql 접속에서 default-character-set 설정을 해주지 않으면 서버는 euckr 인데 클라이언트는 latin1 이 되어버립니다.. 꼭 지정해 주셔야 합니다!!

 

4.1 이상 버전을 사용하실때는 꼭 캐릭터셋을 확인하시기 바랍니다.

 

mysql 테이블을 그냥 복사하셨다면 mysql_fix_privilege_tables 를 실행해주셔야 합니다. 그래야 4.1 에서 추가된 기능들을 사용하실 수 있습니다.

에디터로 mysql_fix_privilege_tables 스크립트를 보시면 맨 상단에

user,password,socket 등을 입력할 수 있게 되어있으니 새로 설치한 환경에 맞게 변경하시고

./bin/mysql_fix_privilege_tables --basedir=/usr/local/mysql-4.1

로 실행하시면 권한테이블의 수정이 이루어집니다.

에러가 나면 --verbose 옵션으로 에러원인을 살펴보시고 조치하세요.

mysql_fix_privilege_tables 스크립트는 서버를 실행한채로 사용하셔야 합니다. (이넘이 mysql 에 접속해서 sql 을 실행하는 스크립이네요..)

이 글에 대한 댓글이 총 7건 있습니다.

헛. 이럴수가 제가 찾던 내용이네요..

조금만 빨리 올라왔어도....흑흑..

 

4.0대에서  몇주전에 4.1.9 버전으로 업그레이드 했습니다.

character-set 문제는 생각보다 잘 해결되었는데

char 타입 사이즈 변경으로 애를 먹었습니다.

데이터 손실은 없었으나 새로 입력되는 데이터들이 문제였죠.

 

Dump & Restore를 반드시 했어야하는데 그걸 하지않아 문제였습니다.

데이터디렉토리만 예전꺼로 연결해서 했더니

select 나 insert 시 문제가 없어서 그냥 라이브 한게 문제였습니다.

 

현재는 디비의 char 사이즈를 다 변경했는데..

그런데 이게 가장 큰 문제가 user 테이블이네요.

password 를 변경하거나 user 계정을 새로 생성하면

패스워드를 먹지 않는듯 합니다.

password() 함수가 먼가 다르게 작동하는건지..

그리고 user 테이블도 역시 varchar 사이즈가 반으로 줄어서 문제가 심각하네요.

이를 어찌해야할지..

엄청 고민됩니다.

 

여하튼 내용 정말 감사합니다 ^^

 

 

이럴수가님이 2005-03-07 13:58에 작성한 댓글입니다.
이 댓글은 2005-03-07 14:00에 마지막으로 수정되었습니다. Edit

old_password() 를 쓰시면 됩니다...  ^^;;

이경환(babocom)님이 2005-03-07 15:44에 작성한 댓글입니다.

여전히 server 와 conn 은 latin1 으로 설정되어 있습니다.

이 부분의 자동설정에 관해서는 인터넷에서 여러 방면으로 검색을 했지만 만족할만한 해결책이 없었습니다. 아래와 같이 해결하는 수밖에 없는것 같습니다.

mysql > set names euckr

 

===>

이부분은 my.cnf 에서 [client]항목에 'default-character-set=euckr'을 지정하면 됩니다.
제 경우는 다음처럼 3가지 모두 지정해놓고 명령라인에는 별도로 지정하지 않으니 참고하세요~

ex) /etc/my.cnf
 [mysqld]
 default-character-set=euckr
 [client]
 default-character-set=euckr
 [mysqldump]
 default-character-set=euckr

 

그런데 PHP 에서 mysql_connect() 후에 'set names euckr'쿼리를 한번 날려주지 않으면 에러가 발생하더군요.
이 쿼리를 날리지 않고 해결하는 방법을 혹시 알고 계신분 없나요?
php.net을 가봐도 리플엔 온통 'set names~'뿐이네요.

 

빈경윤(ibin)님이 2005-03-07 18:59에 작성한 댓글입니다.
이 댓글은 2005-03-07 19:05에 마지막으로 수정되었습니다.

mysql 테이블을 그냥 복사하셨다면 mysql_fix_privilege_tables 를 실행해주셔야 합니다.  그래야지 4.1 에서 추가된 기능들을 사용하실 수 있습니다.

에디터로 mysql_fix_privilege_tables 스크립트를 보시면 맨 상단에

user,password,socket  등을 입력할 수 있게 되어있으니 새로 설치한 환경에 맞게 변경하시고

./bin/mysql_fix_privilege_tables --basedir=/usr/local/mysql-4.1 

로 실행하시면 권한테이블의 수정이 이루어집니다.

에러가 나면 --verbose 옵션으로 에러원인을 살펴보시고 조치하세요.

mysql_fix_privilege_tables 스크립트는 서버를 실행한채로 사용하셔야 합니다.  (이넘이 mysql 에 접속해서 sql 을 실행하는 스크립이네요..)

이넘을 실행하고 서버를 다시 시작하시면 old_password 하지 않으셔도 접속할 수 있습니다..  (이넘이 새 password 컬럼에 맞게 자동으로 변경해 줍니다. )

이경환(babocom)님이 2005-03-07 19:10에 작성한 댓글입니다.
이 댓글은 2005-03-07 19:13에 마지막으로 수정되었습니다.

 

업그레이드 To 4.1로 할때 Character Set을 실수로 기본으로 설정해서 한글 데이터가 깨진 경우 해법

 

아래 링크를 참고하세요.

누가 물어봐서 찾아 알려줬더니 잘 된다고 신기해하더군요

http://dev.mysql.com/doc/mysql/en/charset-conversion.html

송병옥(bosong)님이 2005-05-30 12:40에 작성한 댓글입니다.

정말 도움이 되는 내용 감사합니다.

그런데 제컴에서는 제대로 컨버젼이 되질 않네요.

현재 버젼은 MySQL 4.1.14 이며 윈도우 버젼입니다.

OS는 Windows2000 Server 이구요, 위에서 설명되어 있는데로 모두 수

행한 상태입니다.

MySQL 실행시 --default-character-set=euckr 한 상태로 수행했으며

set names euckr 한 상태로 character set은 모두 euckr 상태입니다.

근데 문제는 기존 사용하던 MySQL 4.0.23 버젼에서 덤프한 데이터를

4.1.14 버젼에서 사용하려고 하면

ERROR 1062 (23000) at line 8457: 중복된 입력 값 '': key 2

이와 같은 에러가 발생합니다. 실제로 중복된 값이 있을까 모두 살펴봤지만 중복된 값은 없었습니다. MySQL 4.0.23 버젼에서 덤프한 데이터를 사용시에는 아무런 에러가 없는데 4.1.14 버젼에서 이용하려면 위에 문제가 발생합니다.

그래서 4.0.23 버젼의 디비 파일을 복사해서 4.1.14 버젼으로 카피하고 4.1.14 버젼에서 덤프한 후 다시 덤프한 데이터로 디비를 생성하려고 하면

ERROR 1062 (23000) at line 46: 중복된 입력 값 'ezardbingwu': key 3

이와 같은 에러가 또 발생합니다.

덤프한 데이터를 이용해서 디비를 생성할 때 사용한 쿼리는 다음과 같습니다.

mysql -uroot -p --default-character-set=euckr TestDB < d:\Test.sql

 

다른 분들은 다 잘 되시는거 같은데 도대체 왜 이러는지 모르겠습니다. 윈도우버젼이라 그런가요? 아님 다른 이유가 있을 까요? 잘 되시는 분들 조언 부탁드립니다.

양용호(rush2k)님이 2005-09-12 19:56에 작성한 댓글입니다.

주로 php 를 사용해 mysql 을 많이 사용하실텐데..

이경우 글자셋을 맞추기 위해 php 에서 mysql_connect 시에..

연결후 set names euckr 을 날려주시면 글자셋이 통일됩니다.

또는 my.cnf 에서 [mysqld] 섹션에 init_connect="set names euckr" 을 넣어주시고 재시작 하셔도 되구요..

혹은 본문에서처럼 세팅하시고 mysqld_safe 시 --skip-character-set-client-handshake  옵션을 추가하여 실행하시면 됩니다.

이경환(babocom)님이 2005-11-14 14:05에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
246434.1이상에서 character-set을 euckr로 모두 맞추기 [4]
이영진
2005-10-31
22326
24502UTF8 환경으로 이전에 관해서... [1]
이경환
2005-10-05
18634
24452APM 에서 UTF-8 사용하기. [3]
백록화
2005-09-24
26547
24242mysql upgrade -- 세번째(4.1버전) [7]
이경환
2005-03-04
29359
24241mysql upgrade -- 두번째(DB이전) [1]
이경환
2005-03-02
18976
24240mysql upgrade -- 첫번째(준비작업)
이경환
2005-02-28
19171
242314.0 에 매치되는 4.1 글자셋 [1]
이경환
2005-08-12
14772
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.053초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다