출처 : http://www.mysqlkorea.co.kr

아래글 외에 좀더 자세한 내용은 김정균님 홈페이지에 있는 글을 참고하시기 바랍니다.

http://annyung.oops.org/?m=white&p=mysql41

-----------------------------------------------------------------------------------
작성자 : 박장규 (jake at itbridge.co.kr)

MySQL을 안전하게 5.0으로 업그레이드 하는 방법에 대해 futhark가 기고한 내용을 번역한 것이다. 원문은 http://www.futhark.ch/mysql/105.html 에 실려 있다.

MySQL 5.0으로의 안전한 업그레이드: 사용 지정 단어(reserved word)를 유의하자
MySQL 4.1에서 5.0으로의 업그레이드는 간단한 작업이다. 물론 여러분은 이때 변경 시켜야 할
리스트(list of changes - D.1.1 참조)에 대해서 잘 숙지를 해야 하며 특히 업그레이드 방법 노트(notes on how to upgrade - 2.10.2 참조)에 세심한 주의를 기울여야 한다.

하지만, 여러분은 매뉴얼에서는 언급하지 않은 함정이 하나 존재한다는 점을 유의해야 한다. MySQL 5.0은 새로운 기능을 많이 제공한다. 이 기능들은 새로운 사용 지정 단어들과 함수들을
SQL 신텍스에서 함께 제공하는데, 정확히 81개가 되며, 나는 GNU text utilities 과 MySQL 소스 코드
배포판 4.1 및 5.0의 lex.h 파일을 사용해서 이것들을 찾아냈다:

ALGORITHM ASENSITIVE CALL CASCADED CHAIN COMPACT CONDITION
CONNECTION CONTINUE CURSOR DECLARE DEFINER DETERMINISTIC EACH
ELSEIF EXIT FETCH FOUND FRAC_SECOND GOTO INOUT INSENSITIVE
INVOKER ITERATE LABEL LANGUAGE LEAVE LOOP MAX_USER_CONNECTIONS
MERGE MIGRATE MODIFIES MUTEX NAME NAME_CONST ONE OUT PHASE
READS RECOVER REDUNDANT RELEASE RESUME RETURN ROUTINE ROW_COUNT
SCHEMA SCHEMAS SECURITY SENSITIVE SLEEP SPECIFIC SQL
SQLEXCEPTION SQLSTATE SQLWARNING SQL_TSI_DAY SQL_TSI_FRAC_SECOND
SQL_TSI_HOUR SQL_TSI_MINUTE SQL_TSI_MONTH SQL_TSI_QUARTER
SQL_TSI_SECOND SQL_TSI_WEEK SQL_TSI_YEAR STDDEV_POP STDDEV_SAMP
SUSPEND TEMPTABLE TIMESTAMPADD TIMESTAMPDIFF TRIGGER TRIGGERS
UNDEFINED UNDO UNKNOWN VAR_POP VAR_SAMP VIEW WHILE XA

MySQL은 새로운 사용 지정 단어 및 함수 이름을 식별자(identifier)로 사용하는 것에 대해서 매우
관대하다 (Treatment of Reserved Words in MySQL을 참조):
만일 여러분이 IGNORE_SPACE SQL mode (이 모드는 5.0에서도 여전히 디폴트임)를 사용하지
않고 서버를 구동 시킨다면, 함수 이름은 사용 지정 단어로 취급 되지 않으며, 따라서 이 이름들을
괄호와 함께 사용한다면, 단순히 함수로만 취급된다. 또한, MySQL은 점(period)이 있는 이름
(예: database.column)은 반드시 식별자라는 것을 알기 때문에, 아무런 인용 부호도 여기에서는
필요 없게 된다. 쿼리 파서(query parser)조차도 공통으로 사용된 단어 (BIT, DATE, TIME 또는
TEXT과 같은)를 특별하게 취급하며 이것들이 식별자로 명확하게 인식되는 곳에서 인용 부호를
사용하지 않아도 되게끔 만든다.

위의 내용은 실제로 꽤 안전하지만, 만일 여러분이 위의 것 중에 하나를 식별자로 사용하는
경우에는, 업그레이드를 하는 동안 매우 신중을 기울여야 한다. 데이터 베이스 자체에 저장되어
있는 선-구성(pre-configured) SQL 쿼리를 추출(retrieve)하기 위한 아래의 데이터 추출 툴
(data extraction tool) 예문은 4.1에서는 구동을 하지만 SQL이 새로운 사용 지정 단어로 등록되어
있는 5.0에서는 동작을 하지 않게 된다:

SELECT sql FROM data_sources WHERE data_source_id = 1

ERROR 1064 (42000): You have an error in your SQL syntax;

'sql FROM data_sources WHERE data_source_id = 1'를 사용하기 위한 올바른 신텍스에 대해서는
여러분이 사용하고 있는 MySQL 서버 버전에 관련한 매뉴얼을 검토한다.
위의 쿼리는 5.0에서는 역시 인용 부호를 사용해야 한다:

SELECT `sql` FROM `data_sources` WHERE `data_source_id` = 1

스페이스를 빠트려도 비슷한 에러가 나오게 된다. 4.1 파서(parser)에서는 아무런 문제 없이 허용된
것도 5.0에서는 거부가 된다:

CREATE TABLE var_pop(i INT)

ERROR 1064 (42000): You have an error in your SQL syntax;

'var_pop(i INT)'를 사용하기 위한 올바른 신텍스에 대해서는 사용 중인 MySQL 서버 버전의
매뉴얼을 참조하기 바란다.
여기에서 식별자 var_pop 바로 뒤에 나오는 괄호는 파서로 하여금 VAR_POP를 5.0의 새로운
함수로 인식하지 못하게 한다 (MySQL의 VARIANCE 함수에 대해서 표준 SQL 별칭(alias)으로
인식하게끔 한다).

따라서, 5.0으로의 업그레이드가 비록 매우 손쉬운 과정이라고 하더라도, 안전한 업그레이드를
위해서는 아래의 과정을 준수하는 것을 권장한다:

1. 위에서 설명한 사전 숙지 사항을 잘 검토한다.

2. 매뉴얼 9.5 Treatment of Reserved Words in MySQL를 읽은 다음에 스키메타(schemata)와

어플리케이션 코드에서 인용 부호를 필요로 하는 식별자가 어떤 것인지를 알아 본다.

3. 매뉴얼 5.12.2 general query log를 활성화 시킨 다음에 특별히 주의해야 할 것이 무엇인지를
알아본다

4. 위의 과정을 진행하는 동안 발견한 모든 문제점들을 해결한다: 여러분이 사용할 주요
어플리케이 션은 MySQL 5.0 테스트와는 별도로 검사한다.

5. 마스터/슬레이브 환경에서는, 마스터를 업그레이드 하기 전에 슬레이브를 먼저 업그레이드
하고 가능한 한 많은 수의 읽기 전용 쿼리가 새로운 5.0 슬레이브로 향하도록 만든다.
이렇게 함으로써 여러분은 어플리케이션이 5.0과 어떻게 잘 동작을 하는지를 알 수 있게 되고
업그레이드를 수행하는 동안 무언가 잘못 되는 것이 있을 경우에 원래대로 복귀할 수 있는 안전한
경로를 갖게 된다 (업그레이드 완료 되기 전까지는 해당 어플리케이션을 4.1로 간단히 방향 전환만
시키면 된다).

6. 마지막으로 마스터를 4.1에서 5.0으로 업그레이드 하면 된다.

위의 과정을 통해 우리는 업그레이드 과정 중에 어플리케이션이 깨지는 경우를 피할 수 있게 된다.

관련 링크: http://www.mysqlkorea.co.kr

+ Recent posts