# 항목앞에 (*) 는 Incompatible Change(호환되지 않는 변경)
입니다.. 주의요망!!
# 이글을 작성당시 4.1 최신버전은 4.1.10 입니다.
# 이글은 mysql document 중 Upgrading from Version 4.0 to
4.1 을 번역한 겁니다.
- 글자셋 지원이 향상되었다. 서버는 다중 글자셋을 지원한다.
- 4.1 은 테이블명,컬럼명을 UTF8 형식으로 저장한다. standard
7-bit US-ASCII 가 아닌 문자로 된 테이블명, 컬럼명이 있을때는 dump
& restore 를 사용하라.
그렇지 않으면(직접 복사,이전한 경우) 테이블을 사용할 수 없을
것이며 table not found 에러가 발생할 것이다. 이 경우에는 4.0 으로
다운그레이드 하면 다시 사용할 수 있다.
- 권한테이블의 password 필드가 길어졌다.
mysql_fix_privilege_tables 를 사용하여 수정하라.
- Berkeley DB table handler 의 포멧이 더 길어졌다. 4.0 으로
다운그레이드 해야할 경우 mysqldump 를 사용하여 백업하고 4.0 서버를
시작하기 전에 모든 log.XXXXXXXXXX 파일을 삭제한 후 데이타를
로드하라.
- 커넥션별 타임존을 지원한다. 이름으로 타임존을 사용하려면 time
zone 테이블을 생성해야 한다.
- 오래된 DBD-mysql module (Msql-MySQL-modules) 을 사용한다면 새
버전(DBD-mysql 2.xx 이상)으로 업그레이드하라. 업그레이드하지 않으면
몇몇 메소드(DBI->do() 와 같은..)가 에러상태를 정확히 판단하지
못할 것이다.
- --defaults-file=option-file-name 옵션은 옵션파일이 없다면
에러를 낼 것이다.
- 4.0.12 이상의 버전이라면 4.1 의 변화를 미리 적용해 볼 수 있다.
--new 옵션을 사용하여 mysqld 를 실행하라. 또한 SET @@new=1
명령으로도 동작시킬수 있으며 SET @@new=0 으로 중단할 수있다.
몇가지 4.1 의 변화가 (업그레이드시) 문제가 될 수 있다고 생각되면
업그레이드하기 전에 --new 옵션을 사용해 미리 적용해 보길 권한다.
옵션파일에 아래와 같이 추가하여 적용해 볼 수 있다.
[mysqld-4.0]
new
[Server Changes]
1. 모든 테이블과 컬럼들이 글자셋을 가진다.
글자셋은 SHOW CREATE TABLE 을 사용해 확인할 수 있으며 mysqldump
에서도 글자셋 설정이 추가되었다.(4.0.6 이상의 버전에서는 이 새로운
형식의 덤프를 이해할 수 있지만 그 이전버전에서는 이해할 수 없다.)
단일글자셋을 사용하는 환경에서는 아무런 영향이 없다.( 즉
이전버전에서는 mysqldump 의 글자셋 설정이 아무 의미가 없다는
뜻..)
2. 4.1에서 직접 지원하는 글자셋을 사용한 4.0
데이타는 그대로 사용이 가능하다. 또한 4.1 에서 DB명, 테이블명,
컬럼명은 기본 글자셋이 무엇이든 상관없이 유니코드(UTF8) 로
저장된다.
(*)3. 4.1.0 ~ 4.1.3 버전에서 InnoDB 테이블에
TIMESTAMP 컬럼을 사용했다면 Dump & Restore 해야한다. 해당
버전의 TIMESTAMP 컬럼의 저장방식이 잘못되었다. 4.0 버전이거나 4.1.4
이후 버전이라면 문제가 없다.
(*)4. 4.1.3 부터 InnoDB 는 latin1 이 아니고
BINARY 가 아닌 문자열의 비교에 글자셋 비교함수를 사용한다. 이것으로
공백문자와 ASCII(32) 보다 작은 코드값의 문자들은 글자셋 내에서
정렬순서에 변화가 생겼다. InnoDB 는 latin1 과 BINARY 문자열에
대해서는 여전히 문자열 끝에 공백을 추가하여 비교하는 방식을
사용한다. 만약 4.1.2 혹은 그 이전 버전에서 latin1 이 아닌 컬럼에
인덱스가 있거나 테이블에 CHAR/VARCHAR/TEXT 등의 BINARY 가 아닌
컬럼에 ASCII(32) 보다 작은 코드값의 문자가 있다면 4.1.3 으로
업그레이드 후 ALTER TABLE 이나 OPTIMIZE TABLE 을 사용하여 인덱스를
재구성하라. 또한 이런 경우 MyISAM 테이블도 재구성하거나 수정하여야
한다.
(*)5. 4.1.0 ~ 4.1.5 의 버전에서 UTF8 형식의
컬럼이나 다른 멀티바이트 글자셋 컬럼에 prefix index 를 사용하였다면
4.1.6 혹은 그 이상 버전으로 업그레이드 하기 위해서는 테이블을
재구성해야 한다.
(*)6. 4.1 이전 버전에서 DB명, 테이블명, 컬럼명
등에 액센트 문자(128 ~225 코드값) 를 사용하였다면 4.1 버전으로 곧장
업그레이드 할 수 없다. (4.1 버전은 메타데이타 저장에 UTF8 을
사용하기 때문에..) RENAME TABLE 을 사용하여 UTF8 에서 지원되는
테이블명,DB명,컬럼명으로 변경하라.
(*)7. CHAR(N) 은 N 개의 글자를 의미한다. 이전
버전에서는 N 바이트를 의미했다. 1바이트 글자셋에서는 문제가 없으나
멀티바이트 글자셋을 사용한다면 문제가 된다.
8. 4.1 에서 frm 파일의 포멧이 변경되었다.
4.0.11 이후의 버전은 새 형식을 사용할 수 있지만 그 이전 버전에서는
사용할 수 없다. 4.1 에서 그 이전 버전으로 테이블을 이전하려면 Dump
& Restore 를 사용하라.
9. 4.1.1 이나 그 이상의 버전으로 업그레이드하면
4.0 이나 4.1.0 으로 다운그레이드 하는것은 어렵다.
이전 버전에서는 InnoDB 의 다중 테이블스페이스를 인식하지
못한다.
(*)10. 4.1.3 의 커넥션별 타임존 지원기능에서
타임존 시스템 변수명은 system_time_zone 으로 변경되었다.
11. 윈도우 서버는 --shared-memory 옵션을
사용하여 공유메모리를 사용한 로컬 클라이언트 접속을 지원한다.
하나의 윈도우 머신에서 다수의 서버를 운영한다면 각각의 서버에
--shared-memory-base-name 옵션을 사용하라.
12. 통계 UDF 함수 인터페이스가 조금 변경되었다.
이제 각각의 XXX() 통계함수에 xxx_clear() 함수를 선언해야 한다.
[Client Changes]
mysqldump 에 --opt 와 --quote-names 옵션이 디폴트로
활성화되었다. --skip-opt 와 --skip-quote-names 옵션으로 비활성화 할
수 있다.
[SQL Changes]
(*)1. 4.1.2 부터 SHOW TABLE STATUS 출력내용중
Type 이 Engine 으로 변경되었다.
(TYPE 옵션은 4.x 버전에선 계속 지원되지만 5.1 버전에서는
사라질것이다.)
(*)2. 문자 비교는 SQL 표준을 따른다. 비교전에
문자열 끝공백을 제거하는 대신에 짧은 문자열을 공백을 추가하여
늘리는 방식을 사용한다. 이와 관련된 문제는 'a' > 'a\t' 라는
것이다.(이전 버전에서는 'a' = 'a\t' 이었다.) 만약 ASCII(32) 보다
작은 코드값의 문자로 끝나는 CHAR 나 VARCHAR 컬럼이 있다면 REPAIR
TABLE 이나 myisamchk 를 사용하여 수정하라.
3. multiple-table DELETE 를 사용할때 삭제하려는
테이블의 별칭(Alias) 를 사용해야 한다.
DELETE test FROM test AS t1, test2 WHERE ...
Do this:
DELETE t1 FROM test AS t1, test2 WHERE ...
이것은 4.0 버전에서 발생하던 문제를 수정하기 위함이다.
(*)4. TIMESTAMP 는 이제 'YYYY-MM-DD HH:MM:SS'
형식의 문자열로 리턴된다. (4.0.12 부터 --new 옵션이 이와같이
동작하도록 지원한다.)
만약 4.0 의 방식처럼 숫자로 리턴되길 원한다면 +0 를 붙여서
출력하라.
mysql> SELECT ts_col + 0 FROM tbl_name;
TIMESTAMP 컬럼의 길이는 더이상 지원하지 않는다. TIMESTAMP(10)
에서 (10) 은 무시된다.
이것은 SQL 표준 호환성을 위해 필요했다. 차기 버전에서는
하위호환을 가지도록 timestamp 의 길이가 초단위의 일부분을
출력하도록 할것이다.
(*)5. 0xFFDF 와 같은 이진값은 해당값의 문자로
간주된다. 이것은 문자를 이진값으로 입력할때 글자셋과 관련된 문제를
해결한다. 숫자값으로 사용하기 위해서는 CAST() 를 사용하라.
mysql> SELECT CAST(0xFEFF AS UNSIGNED INTEGER) < CAST(0xFF
AS UNSIGNED INTEGER);
-> 0
CAST() 를 사용하지 않는다면 해당값의 문자에 대한 비교가
될것이다.
mysql> SELECT 0xFEFF < 0xFF;
-> 1
이진값을 숫자형식에 사용하거나 = 연산에 대해 사용할때도 위와
동일하다.(4.0.13 부터 --new 옵션으로 4.0 서버에서 이러한 동작을
반영해볼 수 있다.)
6. DATE, DATETIME, TIME 값을 다루는 함수를 위해
클라이언트에 리턴되는 값은 임시적인 형식으로 고정되었다. 가령 4.1
버전에서 다음과 같은 값을 리턴한다.
mysql> SELECT CAST('2001-1-1' AS DATETIME);
-> '2001-01-01 00:00:00'
4.0 에서는 결과형식이 다르다.
mysql> SELECT CAST('2001-1-1' AS DATETIME);
-> '2001-01-01'
7. AUTO_INCREMENT 컬럼에 DEFAULT 를 명시할 수
없다.(4.0 에서는 무시되었으나 4.1 에서는 에러를 발생한다.)
8. LIMIT 는 음수를 인자로 받지 않는다. (-1
대신에 큰 정수숫자를 사용하라.)
9. SERIALIZE 는 sql_mode 변수값을 위한 모드값이
아니다. 대신에 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 를
사용하라. 또한 SERIALIZE 는 --sql-mode 옵션의 유효한 값이
아니며
대신 --transaction-isolation=SERIALIZABLE 를 사용하라.
[C API Changes]
(*)1. 4.1.3 에서 mysql_shutdown() 함수의
인자(SHUTDOWN-level)가 추가되었다. 이전에 사용한 mysql_shutdown(X)
을 mysql_shutdown(X,SHUTDOWN_DEFAULT) 로 수정해야 한다.
2. mysql_real_query() 와 같은 몇몇 API 들이
에러발생시 -1 이 아닌 1 을 리턴한다. 만약 아래와 같은 코드를
사용하였다면 수정해야 한다.
if (mysql_real_query(mysql_object, query, query_length) ==
-1)
{
printf("Got error");
}
Non-Zero 값을 체크하도록 수정하라.
if (mysql_real_query(mysql_object, query, query_length) !=
0)
{
printf("Got error");
}
[Password-Handling Changes]
- 보안을 강화하기 위해 패스워드 해시 방식이 변경되었다. 4.0 이나
그 이전의 라이브러리를 사용한 클라이언트를 사용시에 문제가 발생할
수 있다.(아직 4.1로 업그레이드 하지 않은 클라이언트가 리모트 접속을
시도할때 발생할 수 있다.) 다음 항목은 이 문제 해결에 대한 전략을
제공한다. 이것은 낡은 클라이언트와 보안성의 사이에서 타협안을
제시한다.
1. 클라이언트만 4.1 라이브러리를 사용하도록
업그레이드한다. (몇가지 API 의 리턴값을 제외하고) 어떤 변화도
필요하지 않지만 Server/Client 어느쪽에서도 4.1의 새로운 기능을
사용할 수 없을것이다.
2. 4.1로 업그레이드 후
mysql_fix_privilege_tables 스크립트를 실행하여 password 컬럼의
길이를 수정한다. 그러나 서버 시작시 --old-passwords 옵션을 사용하여
하위호환성을 유지한다. 그러다가 모든 클라이언트가 4.1로 업그레이드
하면 --old-passwords 옵션 사용을 중지할 수 있다. 또한 패스워드를 새
형식에 맞도록 수정할수도 있다.
3. 4.1로 업그레이드 후
mysql_fix_privilege_tables 스크립트를 실행하여 password 컬럼의
길이를 수정한다. 모든 클라이언트가 4.1로 업그레이드 되었다면
--old-passwords 옵션을 사용하지 않고 서버를 실행한다. 대신에 모든
계정에 대해 패스워드를 새 형식에 맞도록 수정한다.
4. Netware 환경에서 4.0 에서 4.1 로 업그레이드
할때 Perl 과 PHP 버전을 업그레이드 하라.
|