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를 실행해야한다. 


    





















 



2008년 11월 22일 토요일

MySQL레이아웃

MySQL AB 다운로드 사이트에서 입수가능한 Unix계열 OS용 .tar.gz바이너리 파일의 레이아웃은 다음과 같다.

1.  .tar.gz바이너리 파일 레이아웃

/usr/local/mysql/
         ├bin/                                       <- 명령어군          
         ├data/                                     <- data dir          
         ├include/                                <- include파일          
         ├lib/                                        <- 라이브러리          
         ├scripts/                           <- mysql_install_db스크립트가 있는 곳 
         ├share/mysql/charsets/     <- charsets 디렉토리    
         ├share/mysql/언어명/        <- 에러 메세지    
         ├share/*.sql                           <- mysql권한테이블등 작성sql 
/tmp/mysql.sock                           <- 소켓파일 
/etc/my.cnf                                     <- my.cnf파일 

2. 소스를 컴파일 했을 경우 파일 레이아웃
/usr/local/
        ├bin/                               <- 명령어군
        ├libexec/                         <- mysqld가 있는 곳       
        ├var/                               <- data dir
        ├include/mysql/            <- include파일
        ├lib/mysql/                    <-라이브러리
        ├share/mysql/               <-share 디렉토리 
/tmp/mysql.sock                   <- 소켓파일 
/etc/my.cnf                            <- my.cnf파일

3.Windows경우 레이아웃(mysql-noinstall-*.zip바이너리 파일)
c:\mysql\
         ├bin\                   <- 명령어군
         ├data\                <- data dir
         ├include\           <- include파일    
         ├lib\                   <- 라이브러리     
         ├scripts\           <- bash,perl 스크립트   
         ├share\             <- share디렉토리  
c:\my.{ini,cnf}            <- my.cnf파일
%WINDIR%\my.{ini,cnf}         <- my.cnf파일

2008년 11월 21일 금요일

MySQL의 도입2

윈도우의 경우

windows Installer형식(.msi)하고 zip압축형식 파일로 배포되어지지만, mysql-noinstall-XXXXX.zip형식(예를 들면 mysql-noinstall-5.1.12-beta-win32.zip)을 사용하는 것을 추천한다.   압축을 풀어 생긴 디렉토리를 c:\mysql로 변경한다. 

권한 데이터베이스는  이미 초기상태에 포함되어있다.  생성된 디렉토리를 c:\mysql로 했을 경우 , c:\mysql\data가  그렇다. 

또 Windows용 MySQL서버명령어(mysqld-nt.exe, mysqld-max-nt.exe)에는 Windows Service Control Manager(SCM)에 MySQL서비스를 추가, 삭제하는 옵션이 있다. 

  MySQL인스톨예(Windows경우)
   c:\Document and Settings\>cd \mysql\bin 
   c:\mysql\bin> mysqld-max-nt --install 

 SCM에 서비스 추가,삭제 사용방법은 다음과 같다. 
 
  1.SCM에 서비스 추가 
 mysqld-max-nt --install [서비스명][옵션]
  2.SCM에서 서비스 삭제
 mysqld-max-nt --remove [서비스명]

[서비스명]을 생략하면 MySQL이 서비스명이 된다. 
[옵션]에는 mysqld에 부여하고 싶은 옵션을 1개만 지정가능하다. 

빈번하게 지정하는 옵션은 다음과 같다.
  --defaults-file=
  --defaults-extra-file=

--defaults-file=은, 여기에서 지정한 파일만을 옵션설정파일로 읽어들인다. 
--defaults-extra-file=은 여기에서 지정한 파일을 다른 옵션설정파일과 같이 읽어들인다. 

또 인스톨러가 있는 패키지를 사용했을 경우, 자동적으로 SCM(Service Control Manager)에 서비스가 추가된다.  이럴 때 주의할 점은,  서비스에 추가된 mysqld에는 --defaults-file=옵션이 추가되어 지정한 파일이외의 my.cnf를 전혀 참조하지 않는다는 것이다. 

인스톨러에서 MySQL바이너리 패키지를 인스톨한 다음 c:\my.ini를 편집해도 그 내용이 무시된다. 

 3.인스톨러가 SCM에 등록하는 서비스 예
  c:\Program Files\MySQL\MySQL Server 5.1\bin\mysqld-max-nt.exe --defaults-file="C:/Program Files/MySQL/MySQL Server 5.1/my.ini"

인스톨후 설정

 인스톨한 다음에는 최소한 my.cnf파일에 default-character-set=옵션을 지정해서 서버 character set를 지정해 두어야 한다. 







잠시 쉬어가기

회사 건물 휴게실에서 찍어 본 롯뽄기 힐즈 그리고 자그마하게 보이는 후지산...


2008년 11월 20일 목요일

MySQL의 도입

MySQL인스톨방법에 대해서 정리해 보겠다. 

MySQL인스톨은 정말 쉽다.  자세한 부분은 매뉴얼이나 다른 서적을 참고하기 바란다. 

인스톨
 MySQL인스톨방법을 Unix계열과 Windows로 나눠서 설명해보겠다. 

 1.Unix계열
  각 플랫폼용 바이너리가 .tar.gz형태로 배포되어 있으므로 그것을 사용하는 것이 간단하다.
 .tar.gz를 /usr/local/아래에 전개해 /usr/local/mysql로 rename하던지 symbolic link을 만든다.

   >MySQL인스톨 예
    root@shell# cd /usr/local
    root@shell# tar zxvf mysql-5.1.12-beta -linux-i686-glibc23.tar.gz
    root@shell# ln -s mysql-5.1.12-beta-linux-i686-glibc23 mysql 

 만약에 한번도 MySQL서버를 사용하지 않았던 환경이라면 권한 데이터베이스를 만들필요가 있다.
   
   >권한 데이터베이스작성예
    root@shell# groupadd mysql
    root@shell# useradd -g mysql -d /usr/local/mysql/data -s /bin/false mysql
    root@shell# cd /usr/local/mysql
    root@shell# ./scripts/mysql_install_db --verbose --user=mysql --datadir=/usr/local/mysql/data 

이 예에서는 MySQL서버를 mysql 유저로 동작시키려고 하고 있으므로 useradd로 OS의 사용자를 추가한다.  그 후에는 mysql_install_db를 실행한다. 

 mysql_install_db의 --datadir은 데이터베이스를 보관하는 디렉토리지정, --user는 데이터베이스 디렉토리의 소유자를 지정한다.  --verbose를 붙이면 실제로 테이블이 생성되었는지 아닌지 알 수 있다.  mysql_install_db는 옵션 설정 파일인 my.cnf내부의 [mysqld],[mysql_install_db]을 참조하므로 주의해야한다.  참조하지 않게 하려면 mysql_install_db의 최초인수에 --no-defaults옵션을 지정하면 된다. 

덧붙여 말하면 , 각 디스트리뷰터가 작성하고 있는 MySQL패키지도입은 그다지 추천하지 않는다. 컴파일할 때의 옵션도 가지가지이고 버전관리도 엉성한게 많고 경우에 따라서는 파일배치가 MySQL표준하고는 동떨어진 것도 있으므로 혼란의 원인이 되기 때문이다. 

 > mysql_install_db옵션
    --no-defaults   my.cnf를 읽지 않는다. 반드시 최초의 인수로 지정되어야 한다. 
    --defaults-file= 지정한 my.cnf를 참조한다. 반드시 최초의 인수로 지정되어야 한다. 
    --force  에러가 있어도 처리를 진행한다. 
    --basedir=  base dir를 지정
    --datadir=  data dir를 지정 
    --skip-name-resolve  호스트명이 아닌 IP어드레스로 권한테이블에 기록한다. 
   --verbose 자세한 출력 













2008년 11월 19일 수요일

MySQL개요

MySQL은 오픈소스 RDBMS이다.  개발, 서포트, 배포는 기업(MySQL AB)이 관리한다.

MySQL에서는 복수의 데이터저장형식을 가지고 있어 목적(기능,용도)에 따라서 지정할 수 있다.
이러한 기능을 실현한 것이 Multi Storage Engine이다.

처리의 분산은 Multi Thread기법을 이용한다.  또 복수의 character set을 지원하고 있어서 문자코드자동변환기능도 갖춰져있다. 

여러개의 라이센스형태가 있는데 크게 나누면 상용라이센스와 오픈소스 소프트웨어 라이센스가 있다.  

MySQL이 인터넷 상에서 등장한 것은 1995년이다. 지금보다 시스템 리소스가 열악한 환경에서 개발되어서 그런지 심플하고 다루기 쉬운 구조를 지니고 있다.  

초기단계부터 사용해온 사용자중에는 이런 부분에 매력을 느낀 사람도 많다고 들었다. 

최근의 MySQL은 기능 추가확장의 경향이지만 심플한 특징은 지금도 살아있는 느낌이다. 

특히 웹 어플리케이션에서는 LAMP(Linux, Apache, MySQL, PHP/Perl/Python) 조합으로 구축되어지는 경우도(Drupal, Xoops, Mediawiki등등) 많기때문에 MySQL을 사용하는 사람들도 꽤 있으리라 본다. 

SQL사용방법이나 문법해설은 MySQL 매뉴얼에 잘 써 있으므로 이 블로그에는 기능, 구조 부터 구축, 운용면에서 필요한 정보를 적어보려 한다. 

[정보입수처]
MySQL 정보를 입수하려면, MySQL AB사이트가 가장 확실하다. 

http://www.mysql.com

소스코드와 바이너리의 다운로드도 가능하다. 
MySQL은 버전이 바뀌면 이전하고 다른 동작을 하거나 다른 로직이 되어있는 경우가 많다.

그렇기 때문에 옛날 버전의 매뉴얼을 참조하고 있으면 실제로 적용되지 않는 부분도 있게 된다. 

[라이센스]
기본적으로 라이센스에는 상용(유료)하고 GNU General Public Licence version2(GPL v2)가 있다고 생각하면 간단하지만 판매방식에 따라서 이름과 내용등이 바뀌는 경우도 있다. 

상용라이센스와 최근 수년간 몇번인가 바뀌었다. 

판매제품의 부품용도라면 사용라이센스를 선택해야지 싶다.  이런 경우에는 MySQL AB나 파트너기업에서 라이센스를 구입하게 된다. 

상용이용이라고 해도 GPL v2라도 괜찮다면  소스코드나 바이너리를 다운로드해서 그냥 사용해도 무방하다.  특별한 신청은 필요없다. 
GPL v2에 적용되는 것들은 항상 소스코드하고 바이너리를 제공한다. 
GPL v2조항에 따라서 이용, 배포, 변경이 가능하다. 

현재 비상용의 경우  서버, 클라이언트, 클라이언트 라이브러리도 GPL v2다.

자세한 내용은 아래의 URL을 참조.

http://dev.mysql.com/doc/refman/5.1/en/gpl-license.html









 

MySQL분석 시작!

MySQL서버의 기본적인 개념과 구조 , 그리고 구축과 운용에 관한 여러가지 이야기를 써보려한다.

운용과 구축에 대해서는 , 기초를 확실히 이해 해두면 앞으로 버전업그레이드에도 대응이 될 뿐아니라 , 혹시 많은 변화가 있다고 해도 응용력이 생긴다 볼 수 있다.

이런저런 의미로써 기초적인 것부터 시작하려 한다.

그렇지만 다루는 토픽에는 조금 매니아적인 부분도 써나가려 한다.

이것은 최근의 MySQL기능의 추가도 그렇지만 MySQL사용자층도 두터워졌다고 생각때문이다.

오픈소스 소프트웨어사용의 즐거움은 소스를 보고,소스를 수정가능하다라는 부분도 있으니
그 부분도 이야기 하고 싶다.

MySQL AB회사가 Sun Microsystems에게 매수된 기사가 이 글을 쓰게되 결정적인 기회라고 할 까?

열심히 써 보고 싶다.