[설치] (트랜잭션 지원 : InnoDB)설치가이드

MySQL의 트랜잭션과 row-level locking을 지원하다고 해서 거의 1주일동안 이

거 사용하기 위해서 MySQL 설명서 보고 이것 저것 해 보아서 겨우 성공 했습니

다.

먼저 아셔야 할 것은

MySQL이 지원하는 트랜잭션 지원 3가지 테이블 중에서,

BDB(버클리DB), GEMINI는  MySQL 소스만 가지고는 사용이 안되구요.

다른 추가의 파일들이 있어야 합니다.

InnoDB만이 MySQL 소스만 가지고 운영 가능 하더군요.

또한 kldp나 phpschool의 대부분의 설치 관련 설명서에 보시면,

./configure –with-charset=euc_kr

이런식의 옵션을 주어서 컴파일을 하게 되는데요.

이것 절대 안됩니다.  

이렇게 하면, InnoDB를 사용 못합니다. (일종의 버그 입니다.)

단, MyISAM 파일만 사용한다면 상관 없구요. (즉 트랜잭션, row-level

locking 사용안

한다면 상관 없습니다.)

InnoDB 제작자에게 문의 해 보았더니요.

Hi!

Maybe the problem is in the Korean character support in InnoDB.

You have 2-byte characters? I have never tested them.

;

;

;

Regards,

Heikki

뭐 이런식의 메일 왔습니다.

다음 메일에서는 자기쪽에서 테스트가 안되니까…

테스트해서 결과 (gdb 덤프)를 보내달라고 했는데, 아직 못 보냈네요.

아무튼 아래의 설치 과정에 Kldp의 설치과정과 조금 다름니까,

주의 해서 보십시오.

MySQL 설치 (InnoDB 사용)

1. 소스 파일이나 소스 파일을 구합니다.

   (저의 경우는 /usr/local/src 에 저장했습니다.)

   mysql-3.23.38.tar.gz

2. 소스 파일의 압축을 풉니다.

   #tar xvzf  mysql-3.23.38.tar.gz

3. 이때 생성된 mysql-3.23.38 디렉토리로 이동합니다.

   #cd mysql-3.23.38

  

3.1. MySQL 3.23.38에 포함된 InnoDB는 몇가지 버그가 있습니다.

   http://www.innodb.com 에서 Bug and fix 메뉴에 가시면 내용

있습니다.

   mysql/innobase/include/page0cur.ic 의 173 라인 수정

             page_cur_search_with_match(page, tuple, mode,

                                        &up_matched_fields,

                                        &up_matched_bytes,

                                        &low_matched_fields,

                                        &low_matched_bytes,

                                        cursor);

   위의 사이트에서 2개의 파일 ibuf0ibuf.c , row0undo.c  를 다운 받아서

   교체 합니다.

4. configure 의 옵션 목록을 봅니다.

   #./configure –help > ttt

   #vi ttt

  

   (필요한 옵션을 잘 읽어 보시고 선택하십시오. 아래의 5번에는 제가 선택



    내용이 있습니다.)

5. configure 를 실행하여 컴파일 준비를 합니다.

   이때 가장 빠른 성능을 위해 static 컴파일과 한글지원 옵션을 추가 합니

다.

  (static 관련은 필요에 따라 사용바람)

   # ./configure –with-charset=euc_kr –with-client-ldflags=-all-static

                       –with-mysqld-ldflags=-all-static

                      

                      

   (위의 모든 줄은 연결해서 입력해야 합니다. enter 치지 마세요)

  

  

   –without-debug         디버깅 모드를 OFF하여 성능을 높입니다.

  

   –with-innodb           Innodb 사용

     (   ‘ InnoDB를 사용하는 경우에는 아래와 같이 일부 옵션을 바꾸어야 합

니다.

               –with-extra-charsets=complex ‘ 모든 언어 지원  

             –with-extra-charsets=latin1,euc_kr

                –with-charset=latin1    

                

        * 주의 : InnoDB 사용시에는 절대 –with-charset=euc_kr 를 사용하

지 마시기 바랍니다.

          configure 에서 euc_kr를 사용하게 되면, innoDB의 대부분에서 에러

가 발생하기 때문에

          사용이 불가능 합니다.

          

          꼭, –with-charset=latin1   으로  컴파일 하시구,

          my.cnf에 한글 사용하도록 지정하여 사용하셔야 합니다.

    )  

  

   –with-berkeley-db      BDB 사용

        (http://www.sleepycat.com 에서 BDB를 먼저 받아서 설치한

후에 사용 가능 한듯 )

        

   –with-gemini=/usr/local/var           Gemini DB 사용

        (http://www.nusphere.com 에서 MySQL Advantage 란 것을 구입해야

사용할 수 있는듯 하네요)

  

    ( 이것중에서 선택적으로 사용가능합니다. 2개 모두 또는 둘중에 하나…)

    

    

     –without-bench      벤티마크 관련 파일을 생성하지 않습니다.

   제가 사용한 예 입니다.

   #./configure –with-charset=latin1 –with-client-ldflags=-all-static

                       –with-mysqld-ldflags=-all-static –without-debug

                       –with-innodb –without-bench

                       –with-extra-charsets=complex

   여기에 추가로 기본 설치 디렉토리를 바꿀 수 있습니다.

   (기본적으로 ‘/usr/local’에 프로그램이 설치되고 ‘/usr/local/var’에 데이

타베이스파일이 남는다.)

   만약 첫번째 파티션의 용량이 부족하다면 이것을 이용해서 바꾸십시오.

                      –prefix=/usr/local/mysql    

                               위의 라인은 기본설치디렉토리를 바꾼 것입니

다.

                      –localstatedir=/usr/local/mysql/data

                               위의 라인은 데이타베이스 디렉토리를 바꾼

것입니다.

   위와 같이 디렉토리르 지정하기 전에 지정한 디렉토리가 존재하는지 확인하

십시오.

   (주의: /usr/local/var 디렉토리는 기본으로 존재하지 않습니다. 데이타디

렉토리를 바꾸지 않은 경우에는 만들어 주세요)

6. gcc 버전을 확인합니다.

   #gcc –version

   gcc 버전은 2.8.x 이상 사용한다

7. 컴파일을 합니다.

   #make

8. 인스톨 합니다.

   #make install

9. Perl을 사용하실 분은 kldp.org의 mysql 설치 문서를 참조하세요.

10. man 페이지 설치

    #cd man

    

    #make install

    #cd ..

* 기종의 DB가 있는 상태에서 upgrade를 하고 계시다면,

  아래의 과정을  생략 하셔도 됩니다.

11. 데이타베이스 설치

    설치가 끝난후 아래와 같은 명령을 한번만 한다.    

    

    #./scripts/mysql_install_db      

     이 명령은 설치후 단 한번만 하는 명령으로 기초테이블 6개가 설치된다.

     (`user’, `db’, `host’, `tables_priv’, `columns_priv’ and `func’)

12.1 MySQL 서버 시작 (테스트를 위해서)

    우선 MySQL이 설치된 디렉토리로 이동한다.    

      #cd mysql_installation_directory

      #cd /usr/local/bin                       – 여기서의 설정되도록 했으

면…

     파일이 있나 확인

      #ls my*

      mysql*                       mysql_setpermission*  mysqladmin*  

mysqlimport*

      mysql_fix_privilege_tables*  mysql_zap*            mysqlbug*    

mysqlshow*

      mysql_install_db*            mysqlaccess*          mysqldump*  

      그리고 나서 아래와 같은 명령을 준다.

      #./safe_mysqld &

12.2. 에러 없이 실행되면..

     아래와 같은 명령을 내려서 설치된 프로그램을 검증해 본다.

     (아래에서 BINDIR은 mysql의 실행파일들이 설치된 디렉토리를 이야기 한

다)

     설치된 MySQL의 버전을 알아본다.

      (MySQL의 설치된 디렉토리에서 bin 디렉토리에 있는 ‘mysqladmin’ 실행)

       #BINDIR/mysqladmin version

      그러면 아래와 비슷한 화면이 나올 것이다.    

        ./mysqladmin  Ver 8.20 Distrib 3.23.38, for pc-linux-gnu on

i686

        TCX Datakonsult AB, by Monty

        Server version          3.23.38

        Protocol version        10

        Connection              Localhost via UNIX socket

        UNIX socket             /tmp/mysql.sock

        Uptime:                 1 min 40 sec

        Threads: 1  Questions: 1  Slow queries: 0  Opens: 6  Flush

tables: 1  Open table

s: 2

      그리고 아래와 같은 명령도 한번 해본다.

        #BINDIR/mysqladmin variables | more

        

        

        이곳에서 확인할 것은  

        

        | character_set        | euc_kr                |

        

        이런 값이 있어야 합니다.  

        혹시 이 값이 latin1 이라면 아래 쪽의 my.cnf 설정에서 바꿀 수 있습

니다.

      

12.3. MySQL 서버를 중지해 본다.

        #BINDIR/mysqladmin -u root shutdown

12.4 safe_mysqld로 서버를 재시작해본다.

        #BINDIR/safe_mysqld  &

12.5 간단한 데이타베이스 테스트를 한다.

        아래와 같은 명령을 해본다.    

       #BINDIR/mysqlshow

          +———–+

          | Databases |

          +———–+

          | mysql        |

          | test           |

          +———–+          

       #BINDIR/mysqlshow mysql

          Database: mysql

          +————–+

          |    Tables         |

          +————–+

          | columns_priv  |

          | db                  |

          | func               |

          | host               |

          | tables_priv      |

          | user               |

          +————–+          

        #BINDIR/mysql -e “select host,db,user from db” mysql

          +——+——–+——+

          | host  |    db     | user  |

          +——+——–+——+

          | %      | test      |          |

          | %      | test_%  |          |

          +——+——–+——+

12.6 MySQL 서버를 중지해 본다.

        #BINDIR/mysqladmin -u root shutdown

      

12.7 자동으로 MySQL 서버 시작과 종료  

     MySQL 서버의 start와 stop argument로 시작과 종료를 할 수 있

다.      

     소스 디렉토리(/usr/local/src/mysql-3.23.38/support-files)에

mysql.server 스크립트 파일이 있습니다.

       #chmod 755 mysql.server

       # mysql.server start

       # mysql.server stop

     mysql.server 파일을 /etc/rc.d/init.d 디렉토리에 복사합니다.

       # cp mysql.server /etc/rc.d/init.d

     부팅과 동시에 MySQL 서버를 시작하려면 레드햇 리눅스의 경우

     `/etc/rc.d/rc.local’ 파일에 아래와 같이 한줄을 삽입한다.

     (디렉토리를 설치된 디렉토리를 정확히 적어준다.)

       # MySQL database server starting…      

       /etc/rc.d/init.d/mysql.server start

13. 메세지의 한글 사용 ( 권장하지 않음 )

      configure에서 지정한 문자셋으로 한글 데이타나 테이블의 이름등에 한

글 사용이 가능합니다.

      (혹은 my.cnf 설정에서 지정해도 됩니다.)

    

      여기에서 이야기하는 한글 사용은 MySQL의 에러 메세지등이 한글로 나오

게 하는 방법입니다.

       (mysql.server 파일을 수정하므로써 별다른 옵션없이 한글을 사용

        할 수 있다. 이 경우 2.18절의 한글 사용법은 건너뛴다.)        

        mysql.server를 vi 에디터 등으로 열어서 ‘mysqld’ 를 실행시키는

        부분을 모두 찾아서 ‘mysqld –language=korean’ 로 바꿔준다.

        아마 2~3 군데 쯤 될것이다.

14. MySQL 서버 옵션

        MySQL 서버는 다음 세가지 디렉토리에 옵션을 적어줄 수 있다.    

        

       *디렉토리*             *사용목적*

       `/etc/my.cnf’          글로벌 옵션

       `DATADIR/my.cnf’    서버-스펙 옵션

       `~/.my.cnf’            사용자-스펙 옵션

      my.cnf 파일을 소스 디렉토리(mysql-3.23.38/support-files)에

      my-????.cnf  로 존재합니다. 이 파일을 수정하여 원하는 위치에 복사

해 주시면 됩니다.

      ???? 는 huge, large, medium, small 입니다.

      my-???.cnf 을 열어 보시면 앞부분의 설명에 시스템의 메모리, CPU 등

의 수 에 따라 조금씩 다른

      설정을 예로 만들어 둔 것입니다.  앞부분을 주의 깊게 읽어 보시고, 사

용할 파일을 잘 결정 하신 후에

       #vi my-medium.cnf

       #cp my-medium.cnf /etc/my.cnf

                  

       #vi /etc/my.cnf

      

       my.cnf 에 몇가지를 수정 합니다.

      

     * 아래의 예는  my-medium.cnf 파일을 복사한 후에 수정한 예 입니다.

    

     ——————— my.cnf 예 입니다. ——————–

       # The following options will be passed to all MySQL clients

       [client]

       #password       = your_password

       port            = 3306

       socket          = /tmp/mysql.sock

      

       # Here follows entries for some specific programs

      

       # The MySQL server

       [mysqld]

       port            = 3306

       socket          = /tmp/mysql.sock

       skip-locking

       set-variable    = key_buffer=16K

       set-variable    = max_allowed_packet=1M

       set-variable    = thread_stack=64K

       set-variable    = table_cache=4

       set-variable    = sort_buffer=64K

       set-variable    = net_buffer_length=2K

       server-id       = 1

      

       # Uncomment the following if you want to log updates

       #log-bin

      

       # Uncomment the following if you are NOT using BDB tables

       skip-bdb

       # 저는 bdb를 사용하기 않기 때문에 원래의 주석을 제거 했습니다.

      

  

       # Uncomment the following if you are using Innobase tables

       # innoDB를 사용하기 위해서 아래 전부의 주석을 제거 하여 사용합니

다.

       innodb_data_home_dir = /usr/local/var/

       innodb_log_group_home_dir = /usr/local/var/

       innodb_log_arch_dir = /usr/local/var/

       innodb_data_file_path =

ibdata1:25M;ibdata2:37M;ibdata3:10M;ibdata4:30M

       # 위의 라인이 가장 중요한 부분 인데요.

       # 사용하실 데이타 베이스의 통 합계 만큼을  4개의 파일에 나누어서

크기를

       # 지정하시면 됩니다.   즉, 4개의 합계 크기가 원하는 총 DB의 크기입

니다.

      

       set-variable = innodb_mirrored_log_groups=1

       set-variable = innodb_log_files_in_group=3

       set-variable = innodb_log_file_size=5M

       set-variable = innodb_log_buffer_size=8M

       innodb_flush_log_at_trx_commit=1

       innodb_log_archive=0

       set-variable = innodb_buffer_pool_size=16M

       set-variable = innodb_additional_mem_pool_size=2M

       set-variable = innodb_file_io_threads=4

       set-variable = innodb_lock_wait_timeout=50

      

       # 이 값을 원래 없는데요. 한글을 기본으로 사용하기 위해서 추가합니

다.

       default-character-set = euc_kr

      

       [mysqldump]

       quick

       set-variable    = max_allowed_packet=16M

      

       [mysql]

       no-auto-rehash

       # Remove the next comment character if you are not familiar with

SQL

       #safe-updates

      

       [isamchk]

       set-variable    = key_buffer=8M

       set-variable    = sort_buffer=8M

      

       [myisamchk]

       set-variable    = key_buffer=8M

       set-variable    = sort_buffer=8M

      

       [mysqlhotcopy]

       interactive-timeout

      —————————————————————–

      

      

       이 내용중에 innoDB에 관련 된 부분이 주석 처리 되어 있습니다.

       이것을 필요한 값들을 수정하신 후에

       주석을 제거 하고 사용 하시면 됩니다.

     * 한글 에러 메세지를 사용하려면..

       [myslqd] 셕션에 아래와 같은 한 줄을 넣는다.

         language=korean      

     * 또는 mysqld 실행할때 옵션을 줘서 실행

         mysql –langueage=korean

15. 시스템이 공유라이브러리가 필요할때, 잘 찾을수 있도록 아래와 같이 수정

해 준다.

     리눅스의 경우 우선 root로 로긴해서.. /etc/ld.so.conf 파일에 다음 한

줄을 추가하자.

         /usr/local/lib/mysql

     그리고 나서

         /sbin/ldconfig

     를 실행한다.

16. my.cnf를 수정하여 innoDB를 사용하게 하였다면, 처음 실행시

innodb_data_home_dir 에 관련 파일들을

     생성합니다. 이때는 서버가 무자게 느려 지는 데요.  이상이 아니므로 걱

정하지 않으셔도 됩니다.

    

     초기화가 끝나면 다시 정상적인 속도가 나옵니다.

    

     # cd /usr/local/var

     # ls -al

       합계 120024

       drwx——    4 root     root         4096  6월  9 09:07 .

       drwxr-xr-x   19 root     root         4096  6월  9 09:05 ..

       -rw-rw—-    1 root     root        25088  6월  9 09:07

ib_arch_log_0000000000

       -rw-rw—-    1 root     root      5242880  6월  9 09:10

ib_logfile0

       -rw-rw—-    1 root     root      5242880  6월  9 09:07

ib_logfile1

       -rw-rw—-    1 root     root      5242880  6월  9 09:07

ib_logfile2

       -rw-rw—-    1 root     root     26214400  6월  9 09:10 ibdata1

       -rw-rw—-    1 root     root     38797312  6월  9 09:07 ibdata2

       -rw-rw—-    1 root     root     10485760  6월  9 09:07 ibdata3

       -rw-rw—-    1 root     root     31457280  6월  9 09:07 ibdata4

       drwx——    2 root     root         4096  6월  9 09:05 mysql

       -rw-r–r–    1 root     root         1344  6월  9 09:07

spider.mbyn.co.kr.err

       -rw-rw—-    1 root     root            5  6월  9 09:07

spider.mbyn.co.kr.pid

       drwx——    2 root     root         4096  6월  9 09:10 test

      

      위와 같이 my.cnf에 지정한 파일들이 생성 되어 있습니다.

      

17. InnoDB 사용 예

[root@spider var]# mysql test

Welcome to the MySQL monitor.  Commands end with ; or \\g.

Your MySQL connection id is 7 to server version: 3.23.38

Type ‘help;’ or ‘\\h’ for help. Type ‘\\c’ to clear the buffer

mysql> create table test (id int not null primary key auto_increment,

name varchar(50) not null, key test_name(name)

) type=innodb;

Query OK, 0 rows affected (0.02 sec)

mysql> show table status;

+——+——–+————+——+—————-+————-+—–

————+————–+———–+—————-+————-+–

———–+————+—————-+———————–+

| Name | Type   | Row_format | Rows | Avg_row_length | Data_length |

Max_data_length | Index_length | Data_free |

Auto_increment | Create_time | Update_time | Check_time | Create_options

| Comment               |

+——+——–+————+——+—————-+————-+—–

————+————–+———–+—————-+————-+–

———–+————+—————-+———————–+

| test | InnoDB | Dynamic    |    0 |              0 |       16384

|            NULL |        16384 |         0 |        

     1 | NULL        | NULL        | NULL       |                |

InnoDB free: 95232 kB |

+——+——–+————+——+—————-+————-+—–

————+————–+———–+—————-+————-+–

———–+————+—————-+———————–+

3 rows in set (0.00 sec)

mysql> insert into test (name) values (‘aaa’);

Query OK, 1 row affected (0.04 sec)

mysql> insert into test (name) values (‘bbb’);

Query OK, 1 row affected (0.01 sec)

mysql> select * from test;

+—-+——+

| id | name |

+—-+——+

|  1 | aaa  |

|  2 | bbb  |

+—-+——+

2 rows in set (0.00 sec)

# 트랜잭션 시작

mysql> begin;

Query OK, 0 rows affected (0.00 sec)

mysql> insert into test (name) values (‘ccc’);

Query OK, 1 row affected (0.00 sec)

mysql> insert into test (name) values (‘dddd’);

Query OK, 1 row affected (0.00 sec)

mysql> select * from test;

+—-+——+

| id | name |

+—-+——+

|  1 | aaa  |

|  2 | bbb  |

|  3 | ccc  |

|  4 | dddd |

+—-+——+

4 rows in set (0.00 sec)

# 트랜잭션 취소

mysql> rollback;

Query OK, 0 rows affected (0.02 sec)

# 트랜잭션 이전의 데이타만 나옵니다.

mysql> select * from test;

+—-+——+

| id | name |

+—-+——+

|  1 | aaa  |

|  2 | bbb  |

+—-+——+

2 rows in set (0.00 sec)

이상입니다.

서진우

슈퍼컴퓨팅 전문 기업 클루닉스/ 상무(기술이사)/ 정보시스템감리사/ 시스존 블로그 운영자

You may also like...

페이스북/트위트/구글 계정으로 댓글 가능합니다.