2008년 11월 25일 화요일

MySQL의 업그레이드

MySQL의 업그레이드는 단순하다.  순서는 아래와 같다.
1. MySQL서버를 정지한다.
2.바이너리를 교체한다. 
3.메이저 버전업의 경우에는 mysql_fix_privilege_tables 명령어(또는 mysql_upgrade명령어)를 실행한다. 
4.replication이나 NDB를 사용하고 있는 경우에는 전 서버의 버전을 맞추어놓는다. 

mysql_fix_privilege_tables명령어 옵션
 --verbose 상세표시.  이것을 붙여서 사용하는 것을 추천한다.  붙이지 않으면 변경되었나 확인불가
 --bindir= MySQL명령어위치 
 --basedir= MySQL인스톨 디렉토리의 지정
 --user= MySQL서버에 접속할 때 사용하는 사용자명
 --password= MySQL서버에 접속할 때 사용하는 패스워드
 --host= MySQL서버 지정
 --port= MySQL서버 포트 지정
 --socket= MySQL서버의 소켓파일 지정
 --database= 변경하는 데이터베이스 지정. 보통은 mysql  (이 옵션을 사용하는 경우는 드물듯.)
 --sql 메세지에는 SQL문장만 표시
 --no-defaults  my.cnf무시.  반드시 처음에 오는 인수여야한다. 
 --defaults-file= 지정한 my.cnf만을 읽어들임. 반드시 처음에 오는 인수여야한다. 
 --defaults-extra-file=  지정한 my.cnf을 추가해서 읽어들임.  반드시 처음에 오는 인수여야한다. 

위의 명령어를 쓸 때는 아래의 내용을 주의해야 한다. 
  1. my.cnf [mysql_install_db]그룹을 읽어들인다. 
  2. my.cnf [mysql_fix_privilege_tables]그룹을 읽어들인다.
  3. mysql, my_print_defaults 명령어를 호출한다.  (basedir, bindir를 단서로 찾는다)
  4. mysql_fix_privilege_tables.sql파일을 호출한다. (basedir를 단서로 찾는다)
  5. mysql_fix_privilege_tables.sql파일은 보통 share/mysql/디렉토리에 존재한다. (sql문이 있다.)

이 밖에 주의해야 할 사항은 버전간의 언어처리나 미묘한 Storage Engine의 변경이다. 

윈도우즈에 있어서 mysql_fix_privilege_tables
 mysql_fix_privilege_tables은 쉘 스크립트이다.  따라서 윈도우즈에서는 동작하지 않는다. 
윈도우즈에서는 SQL문을 실행해서 권한 테이블을 변경한다. 
   
  윈도우즈에서 MySQL업그레이드 
 dos>cd c:\mysql
 dos>bin\mysql --force mysql <>

Storage Engine변경에 있어서 주의할점
 마이너 버전업의 경우에는 미묘하게 Storage Engine에 수정이 가해진 경우가 있다. 
현재 아래의 내용을 주의.
   
   4.1이하에서 5.0이상으로 변경하는 경우
 1.TEXT필드 인덱스가 바뀌었다.
    >CHECK TABLE [FOR UPGRADE]를 실행해서 에러가 나오는 지 확인(에러가 없는 경우도 있다. )
    >에러가 나오면  MyISAM테이블의 경우 REPAIR TABLE를 실행.  InnoDB테이블의 경우에는 테이블 데이터의 dump와 import를 실시

 2.DECIMAL 내부처리가 바뀌었다.
    >CHECK TABLE[FOR UPGRADE]를 실행해서 에러가 나오는 지 확인.

 3.MyISAM테이블의 RAID옵션이 없어졌다. 
    >테이블 데이터를 dump한 다음에 업그레이드 그리고 데이터를 import한다. 

mysql_upgrade명령어/mysqlcheck 명령어
 MySQL 5.0.19부터 mysql_upgrade라는 명령어가 추가되었다.(5.0.19 ~5.0.22는 쉘 스크립트, 5.0.23부터는 c로 작성되었다.)   이것은 내부에서 다음과 같은 처리를 하는 명령어이다. 

 mysql_upgrade명령어의 내부처리
shell$> mysqlcheck --check-upgrade --all-databases --auto-repair
shell$> mysql_fix_privilege_tables --silent 

mysqlcheck옵션은 다음과 같다. 
1. --check-upgrade
      CHECK TABLE FOR UPGRADE를 실행(FOR UPGRADE는 MySQL 5.0.19에서 추가됨)
          >MySQL 4.1과 5.0에서는 InnoDB, MyISAM에서 TEXT 필드의 인덱스순서를 확인한다. 
          >MySQL 5.0.3과 5.0.5에서는 DECIMAL 저장방식이 바뀌었으므로 확인한다. 

2. --auto-repaire
       테이블 파손의 경우에 REPAIR TABLE를 실행한다. 

MySQL 4.1에서 5.0이상으로 업그레이드 할 경우에는 mysql_upgrade명령어를 실행하면 되는 것로 되어있다.  또 mysql_upgrade는 my.cnf에서의 [mysql_upgrade]그룹을 읽어들이는 것을 주의하길 바란다. 
MySQL 5.0.24/5.1.12-beta의 경우는 mysql_upgrade종료시 데이터 디렉토리에 mysql_upgrade_info라는 파일이 생성된다. 따라서 데이터 디렉토리에 대한 작성권한을 가진 계정으로 mysql_upgrade를 실행해야한다.