묻고답하기

[출처] http://kldp.org/script/bbs/read.php?table=prj&no=1346

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

BDB(버클리DB), GEMINI는  MySQL 소스만 가지고는 사용이 안되구요.
다른 추가의 파일들이 있어야 합니다.

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


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

./configure --with-charset=euc_kr

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

이것 절대 안됩니다.  
이렇게 하면, MyISAM를 사용 못합니다. (일종의 버그 입니다.)
단, MyISAM 파일만 사용한다면 상관 없구요. (즉 트랜잭션, row-level
locking 사용안
한다면 상관 없습니다.)

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

Hi!

Maybe the problem is in the Korean character support in MyISAM.
You have 2-byte characters? I have never tested them.
;
;
;

Regards,

Heikki

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

다음 메일에서는 자기쪽에서 테스트가 안되니까...
테스트해서 결과 (gdb 덤프)를 보내달라고 했는데, 아직 못 보냈네요.


아무튼 아래의 설치 과정에 Kldp의 설치과정과 조금 다름니까,
주의 해서 보십시오.


MySQL 설치 (MyISAM 사용)

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에 포함된 MyISAM는 몇가지 버그가 있습니다.
   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 사용
     (   ' MyISAM를 사용하는 경우에는 아래와 같이 일부 옵션을 바꾸어야 합
니다.
               --with-extra-charsets=complex ' 모든 언어 지원  
             --with-extra-charsets=latin1,euc_kr
                --with-charset=latin1    
                
        * 주의 : MyISAM 사용시에는 절대 --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. MyISAM 사용 예

[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 | MyISAM | Dynamic    |    0 |              0 |       16384
|            NULL |        16384 |         0 |        
     1 | NULL        | NULL        | NULL       |                |
MyISAM 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)
글쓴이 제목 최종 글
XE 공지 글 쓰기,삭제 운영방식 변경 공지 [16] 2019.03.05 by 남기남
보노보노 php책을 살려구하는데여.어떤책을 사야할지..  
camp3 꼭 말습해주세여ㅠ..ㅠ [1] 2007.08.10
Yeosi SQL 없는 게시판 만들려고 하는 중인데 엔터 때문에... [2] 2007.08.10
비상 방명록에서 스크롤바 없애는거요;  
제유경 엔죠 사이트처럼 게시물에 오버하면 그 줄 색깔이 변하는건 어케 하는건가요 [1] 2007.08.10
하늘 [질문] PHP에서 goto를 사용하는 방법 [1] 2007.08.10
mini php페이지에서 commit 이나 rollback  
하늘 설치가이드(트랜잭션 지원 : MyISAM)  
바래미 제로님 도와주세요~~~~  
♬~레키~♬ 창따라다니는 메뉴를 구하는데요... [1] 2007.08.10
임준영 문자열에서 엔터를 스페이스로 바꾸려고 하는데 값을 어떻게 구하죠? [3] 2007.08.10
박성진 잠깐.. 허접한 질문 하나.. [1] 2007.08.10
박성진 다시한번.. 쿠키땜시 죽갔어여 ㅠ.ㅡ [1] 2007.08.10
최성규 스위시에서 효과적용을 시켰는데.. [1] 2007.08.10
김찬솔 [질문] 파일 업로드 관련 입니다..  
블루바 이미지 불러오기.. ㅡㅡ;  
Myzzix 게시판 글에 연속문자나, @ 같은 문자가 연속으로 있을때에... [3] 2007.08.10
최재원 또다시 노프레임 질문 ㅡ.ㅜ (노프레임 만드는 개념)  
조원경 완전 초보 질문입니다. 웃지말아주세엽..ㅜ.ㅜ [1] 2007.08.10
송석환 php에서 preg_replace에 대해...알려주세요. [1] 2007.08.10
임태운 브라우저에서 그림이 안보입니다. [2] 2007.08.10
박성진 쿠키 굽다 자꾸 애러 발생합니다. 도와주세요 [1] 2007.08.10
[폐]허접-_- 으아아아아악~! 환장합니다-_-);;;; [1] 2007.08.10
김용태 PHP_SELF에 관한 질문입니다. 더 자세한 내용있으면 좀 부탁드립니다. [1] 2007.08.10
landbin 메일서버를 만들어서 폼메일을 보내는데...  
최재원 노프임과 프레임 한 홈페이지의 차이점 -_-? [2] 2007.08.10
이승혜 정말 이상합니다. 스킨업로드를했는데.  
박정수 최근게시물 클릭하면 해당페이지로 가기...  
나인크 [초보] require 하고 include 가 어떻게 다르죠.. ㅡㅡa [1] 2007.08.10
김수현 음.. [1] 2007.08.10