10진수 변환

카테고리 없음 2011. 6. 3. 14:59 Posted by 민수
   final static char[] digits = {
    '0' , '1' , '2' , '3' , '4' , '5' ,
    '6' , '7' , '8' , '9' , 'a' , 'b' ,
    'c' , 'd' , 'e' , 'f' , 'g' , 'h' ,
    'i' , 'j' , 'k' , 'l' , 'm' , 'n' ,
    'o' , 'p' , 'q' , 'r' , 's' , 't' ,
    'u' , 'v' , 'w' , 'x' , 'y' , 'z'
     };
    private static String toUnsignedString(int i, int shift) {
    char[] buf = new char[32];
    int charPos = 32;
    int radix = 1 << shift;
    int mask = radix - 1;
    do {
       buf[--charPos] = digits[i & mask];
       System.out.println("("+i+"&"+ mask+") :"+(i & mask)+" / i :" +i );
       i >>>= shift;
    } while (i != 0);

    return new String(buf, charPos, (32 - charPos));
        }


기타 :http://froginpot.tistory.com/11 

디자인 패턴

카테고리 없음 2011. 5. 25. 12:50 Posted by 민수

Installing Ruby DBI

카테고리 없음 2009. 3. 13. 18:16 Posted by 민수


http://dailyvim.blogspot.com/2008/08/installing-ruby-dbi-mysql-on-centos-52.html
 
There's no good documentation on how to do this online, so here's a quick tutorial on how to get Ruby's DBI and MySQL packages installed on CentOS 5.2. There aren't any pre-packaged binaries for this, so building from scratch is pretty much your only option.

# download
wget http://tmtm.org/downloads/mysql/ruby/mysql-ruby-2.7.tar.gz

# extract
tar zxvf mysql-ruby-2.7.tar.gz

# change dir
cd mysql-ruby-2.7

# configure (requires mysql development package AND gcc)
ruby extconf.rb --with-mysql-config
checking for mysql_ssl_set()... yes
checking for mysql.h... yes
creating Makefile

# finish (as root)
make install
(ignore warnings)

Now DBI:

# download
wget http://rubyforge.org/frs/download.php/41303/dbi-0.2.2.tar.gz

# extract
tar zxvf dbi-0.2.2.tar.gz

# change dir
cd dbi-0.2.2

# setup
ruby setup.rb config --with=dbi,dbd_mysql
ruby setup.rb setup

# finish (as root)
ruby setup.rb install

Thread Deadlock 진단하기

카테고리 없음 2008. 12. 9. 15:18 Posted by 민수

원문 : http://performancewiki.com/thread-analysis.html

 

JVM 프로세스는 멀쩡히 살아있음에도 응답이 없는 경우

다음과 같은 가능성이 있습니다.

 

1. 데드락

2. 무한루프 상태

3. 프로세싱이 매우 느린 경우...

 

이 때 JVM 프로세스가 CPU를 전혀 사용하고 있지 않다면 1번, 데드락일 가능성이

매우 높습니다.

 

root@pw4 # ps -fp 790652
     UID     PID    PPID   C    STIME    TTY  TIME CMD
    root  790652       1   0 13:54:37  pts/0  3:05 /usr/IBM/WebSphere/AppServer/java/bin/java -Declipse.se

5 분이 지난 후에 다시 보아도 역시 그대로이군요...

   
root@pw4 # ps -fp 790652
     UID     PID    PPID   C    STIME    TTY  TIME CMD
    root  790652       1   0 13:54:37  pts/0  3:05 /usr/IBM/WebSphere/AppServer/java/bin/java -Declipse.se

 

 

TIME 컬럼이 CPU 사용시간을 의미하는데, 전혀 늘어나지 않았습니다.

즉, jvm이 CPU를 쓰지 않고 있고 무언가 때문에 대기상태에 있다는 것을 의미합니다.

 

이 프로세스를 "kill -3 [PID]" 명령으로 죽여서 생성된 java 코어 파일을 분석해

보도록 하겠습니다.

 

root@pw4 # kill -3 790652
root@pw4 # ls *790652*


이것과 비슷하게 생긴 파일을 찾아 열어봅니다.: javacore.20070126.122115.790652.txt

 

root@pw4 # vi javacore.20070126.122115.790652.txt

 

그리고 파일 내에서 다음과 같은 내용을 찾아봅니다.


 

| LOCKS subcomponent dump routine
| ===============================
|    
|    Monitor pool info:
|     Current total number of monitors: 2
|          
|Monitor Pool Dump (flat & inflated object-monitors):
|      sys_mon_t:0x00039B40 infl_mon_t: 0x00039B80:
|       java/lang/Integer@004B22A0/004B22AC: Flat locked by "DeadLockThread 1"
|                                                 (0x41DAB100), entry count 1
|            Waiting to enter:
|                "DeadLockThread 0" (0x41DAAD00)
|      sys_mon_t:0x00039B98 infl_mon_t: 0x00039BD8:
|       java/lang/Integer@004B2290/004B229C: Flat locked by "DeadLockThread 0"
|                                                             (0x41DAAD00), entry count 1
|            Waiting to enter:
|                "DeadLockThread 1" (0x41DAB100)
|JVM System Monitor Dump (registered monitors):
|          Thread global lock (0x00034878):
|          Windows native HEAP lock lock (0x000348D0):
|          NLS hash table lock (0x00034928):
|          portLibrary_j9sig_async_monitor lock (0x00034980):
|          Hook Interface lock (0x000349D8):
|            < lines removed for brevity >
|
|=======================
|Deadlock detected !!!
|---------------------
|          
|  Thread "DeadLockThread 1" (0x41DAB100)
|    is waiting for:
|      sys_mon_t:0x00039B98 infl_mon_t: 0x00039BD8:
|      java/lang/Integer@004B2290/004B229C:
|    which is owned by:
|  Thread "DeadLockThread 0" (0x41DAAD00)
|    which is waiting for:
|      sys_mon_t:0x00039B40 infl_mon_t: 0x00039B80:
|      java/lang/Integer@004B22A0/004B22AC:
|    which is owned by:
|  Thread "DeadLockThread 1" (0x41DAB100)

데드락이 있다는 것은 확인했으니 이제 부터 발생원인을

찾야야 하겠군요...

 

만약 진단 결과가 데드락이 아니었다면,
busy hang 상태인지를 점검해보아야 합니다.

 

다음과 같은 가능성이 있습니다.

 

1. 다른 thread의 일이 완료될 때까지 마냥 기다리는 상태

2. I/O 오퍼레이션이 완료될 때까지 마냥 기다리는 상태

3. 그냥 sleep하고 있는 상태...

 

그러면 이 번엔 각 쓰레드를 모니터링해보겠습니다.

 

ps -mp 명령으로 jvm 내에 어떤 Thread들이 있는지 출력합니다.

 

$ ps -mp 43824 -o THREAD
    USER   PID  PPID     TID ST  CP PRI SC    WCHAN        F     TT BND COMMAND
  wsuser 43824 51762       - A   66  60 77        *   200001  pts/4   - java ...
       -     -     -    4021 S    0  60  1 22c4d670   c00400      -   - -
       -     -     -   11343 S    0  60  1 e6002cbc  8400400      -   - -
       -     -     -   14289 S    0  60  1 22c4d670   c00400      -   - -
       -     -     -   14379 S    0  60  1 22c4d670   c00400      -   - -
...
       -     -     -   43187 S    0  60  1 701e6114   400400      -   - -
       -     -     -   43939 R   33  76  1 20039c88   c00000      -   - -
       -     -     -   50275 S    0  60  1 22c4d670   c00400      -   - -
       -     -     -   52477 S    0  60  1 e600ccbc  8400400      -   - -
...
       -     -     -   98911 S    0  60  1 7023d46c   400400      -   - -
       -     -     -   99345 R   33  76  0        -   400000      -   - -
       -     -     -   99877 S    0  60  1 22c4d670   c00400      -   - -
       -     -     -  100661 S    0  60  1 22c4d670   c00400      -   - -
       -     -     -  102599 S    0  60  1 22c4d670   c00400      -   - -
...

 

그러면 위 thread들이 뭘하고 있는 추적해보겠습니다.

dbx 명령으로 jvm 프로세스를 attach합니다.

 

root@pw4 # dbx -a 43824

dbx > thread
thread  state-k     wchan    state-u    k-tid   mode held scope function
 $t1     wait      0xe60196bc blocked   104099     k   no   sys  _pthread_ksleep
>$t2     run                  blocked    68851     k   no   sys  _pthread_ksleep
 $t3     wait      0x2015a458 running    29871     k   no   sys  pthread_mutex_lock
...
 $t50    wait                 running    86077     k   no   sys  getLinkRegister
 $t51    run                  running    43939     u   no   sys  reverseHandle    
 $t52    wait                 running    56273     k   no   sys  getLinkRegister
 $t53    wait                 running    37797     k   no   sys  getLinkRegister
 $t60    wait                 running     4021     k   no   sys  getLinkRegister
 $t61    wait                 running    18791     k   no   sys  getLinkRegister
 $t62    wait                 running    99345     k   no   sys  getLinkRegister  
 $t63    wait                 running    20995     k   no   sys  getLinkRegister

 

ps -mp 명령에서 ID 43939는 reverseHandle이란 funtion을 수행중이군요.

 

javadump 파일 상에서 $t51이 어떤 내용인지를 연결하는 키를 찾으려면 다음과 같이 합니다

 

dbx > thread info 51
thread  state-k     wchan    state-u    k-tid   mode held scope function
 $t51    run                  running    43939     u   no   sys  reverseHandle
      general:
         pthread addr = 0x220c2dc0         size         = 0x18c
         vp addr      = 0x22109f94         size         = 0x284
         thread errno = 61
         start pc     = 0xf04b4e64
         joinable     = yes
         pthread_t    = 3233
      scheduler:
         kernel       =
         user         = 1 (other)
      event :
         event        = 0x0
         cancel       = enabled, deferred, not pending
      stack storage:
         base         = 0x220c8018         size         = 0x40000
         limit        = 0x22108018
         sp           = 0x22106930

 

여기서 pthread_t의 값이 javadump 파일상에 나와있는 키 값입니다.</PRE><PRE>javadump파일을 찾아보면 다음과 같이 관련 부분을 찾을 수 있습니다.

 

"Worker#31" (TID:0x36288b10, sys_thread_t:0x220c2db8) Native Thread State:
ThreadID: 00003233 Reuse: 1 USER SUSPENDED Native Stack Data : base: 22107f80
pointer 22106390 used(7152) free(250896)

----- Monitors held -----
java.io.OutputStreamWriter@3636a930
com.ibm.servlet.engine.webapp.BufferedWriter@3636be78
com.ibm.servlet.engine.webapp.WebAppRequestDispatcher@3636c270
com.ibm.servlet.engine.srt.SRTOutputStream@36941820
com.ibm.servlet.engine.oselistener.nativeEntry.NativeServerConnection@36d84490 JNI pinning lock

----- Native stack -----

_spin_lock_global_common pthread_mutex_lock - blocked on Heap Lock
sysMonitorEnterQuicker sysMonitorEnter unpin_object unpinObj
jni_ReleaseScalarArrayElements jni_ReleaseByteArrayElements
Java_com_ibm_servlet_engine_oselistener_nativeEntry_NativeServerConnection_nativeWrite

------ Java stack ------ () prio=5 </PRE><PRE>com.ibm.servlet.engine.oselistener.nativeEntry.NativeServerConnection.write(Compiled Code)
com.ibm.servlet.engine.srp.SRPConnection.write(Compiled Code)
com.ibm.servlet.engine.srt.SRTOutputStream.write(Compiled Code)
java.io.OutputStreamWriter.flushBuffer(Compiled Code)
java.io.OutputStreamWriter.flush(Compiled Code)
java.io.PrintWriter.flush(Compiled Code)
com.ibm.servlet.engine.webapp.BufferedWriter.flushChars(Compiled Code)
com.ibm.servlet.engine.webapp.BufferedWriter.write(Compiled Code)
java.io.Writer.write(Compiled Code)
java.io.PrintWriter.write(Compiled Code)
java.io.PrintWriter.write(Compiled Code)
java.io.PrintWriter.print(Compiled Code)
java.io.PrintWriter.println(Compiled Code)
pagecompile._identifycustomer_xjsp.service(Compiled Code)
javax.servlet.http.HttpServlet.service(Compiled Code)
com.ibm.servlet.jsp.http.pagecompile.JSPState.service(Compiled Code)
com.ibm.servlet.jsp.http.pagecompile.PageCompileServlet.doService(Compiled Code)
com.ibm.servlet.jsp.http.pagecompile.PageCompileServlet.doGet(Compiled Code)
javax.servlet.http.HttpServlet.service(Compiled Code)
javax.servlet.http.HttpServlet.service(Compiled Code)

 


위의 경우는 락을 얻기 위해 busy wait을 하고 있음을 알 수 있습니다. (_spin_lock_global_common)


mysql variables

카테고리 없음 2008. 12. 8. 23:53 Posted by 민수

1. mysql은 동적으로 변화 가능한 옵션은 3가지로 나눌 수 있다.
- session : 조정된 값은 오직 현재 커넥션에만 영향을 미친다.
- global : 조정된 값이 전체 서버에 영향을 미친다.
- both : 값을 변화시킬 때 session/global을 반드시 명기해야 한다.


mysql> show global variables like 'query%';
+------------------------------+---------+
| Variable_name                | Value   |
+------------------------------+---------+
| query_alloc_block_size       | 8192    |
| query_cache_limit            | 1048576 |
| query_cache_min_res_unit     | 4096    |
| query_cache_size             | 0       |
| query_cache_type             | ON      |
| query_cache_wlock_invalidate | OFF     |
| query_prealloc_size          | 8192    |
+------------------------------+---------+
7 rows in set (0.00 sec)

mysql> show session variables like 'query%';
+------------------------------+---------+
| Variable_name                | Value   |
+------------------------------+---------+
| query_alloc_block_size       | 8192    |
| query_cache_limit            | 1048576 |
| query_cache_min_res_unit     | 4096    |
| query_cache_size             | 0       |
| query_cache_type             | ON      |
| query_cache_wlock_invalidate | OFF     |
| query_prealloc_size          | 8192    |
+------------------------------+---------+
7 rows in set (0.00 sec)


2.  변경된 옵션 적용하기
set global(또는 session) parameter =value
- 동작 중에 변경된 옵션은 서버 재 시작 전까지미만 적용된다.
- 영구히 변경하려면, /etc/my.cnf 파일을 수정해야 한다.
- super 권한이 있어야 바꿀 수 있다.

3. 주요 옵션 (show varialbles like '...%' 이용)
(1) table_cache (디폴트 64): 사용하는 테이블에 대한 핸들러를 캐시에 저장, opend_tables 항목이 높을 경우 table_cache를 높인다.
(2) thread_cache_size(디폴트 0) : 재 사용을 위해 보관할 쓰래드 수, thread_created가 높을 경우 증가된다. 클라이언트가 커넥션 풀을 쓰는 경우는 의미가 없다.
(3) max_connections(기본 100) : 허용 가능한 최대 동시 접속수, 쓰레드 관련 메모리 튜닝시 매우 중요, 각각의 커넥션은 최소 thread_stack의 사이즈만큼의 메모리 사용
(4) connect_timeout  : connect요청받고 몇초간 기다릴지
(5) net_buffer_length : 클라이언트에 보내는 초기 메시지의 바이트 수 조절한다.
(6) max_allowd_packet : 서버 / 클라이언트간 최대 전송 가능 패킷 크기를 설정한다., Text나 bloc컬럼이 많이 있거나, 리플리케이션을 하는 경우 최소 16M이상 잡아야 한다.
(7) back_log (디폴트 50) : connection이 대량으로 몰릴 때 큐에 대기가능한 커넥션의 갯수
(8) wait_timeout : 커넥션의 타임아웃
(9) net_retry_count : 통신이 잘못되어 실패할 때, 몇 번까지 재시도할지
(10) max_connect_error : 계속적으로 문제를 발생시키는 클라이언트를 몇번째 재시도후 block할지 지정. 한번 block되면, 서버를 재시작하거나 flush host명령을 실행하기 전까지 접속 불가 일반적인 경우.. 내부에서만 쓸 경우가 많아서 크게 잡아놓음
   나의 경우는 다음과 같이 지정
max_connections를 1000, 이때  thread_stack은 196608, thread_cache_size는 4.
connect_timeout : 5,  max_allowed_packet : 33,553,408(리플리케이션 적용) , back_log는 50
max_user_connections : 0 ,  max_connect_errors  99999999


3. 주요 환경변수 (show staus like 'thread..%' 이용)
(1) Connection관련
- Max_used_connections (720) : 피크 타임의 동시 접속 수, 튜닝의 제일 중요한 요소임
- Bytes_received (3656293909) / Bytes_sent (1293843766) : 모든 클라이언트와 전송된 바이트의 총합
- connections( 2045524 ) : 시도된 connection의 합
- Aborted_connects (40979) : 어플리케이션 또는 mysql의 커넥션 관련 옵션이 잘 못 될 수 있다.
(2) Thread 관련
-thread_created:서버 시작후, 현재까지 만들어진 총 쓰레드의 갯수
-thread_connected: 현재 열려있는 쓰레드수
-thread_cached : 재사용 가능한 동작 중이지 않은 쓰레드
-thread_running : sleeping 상태가 아닌 쓰레드 수
 [master]
| Threads_cached    | 43    |
| Threads_connected | 23    |
| Threads_created   | 66    |
| Threads_running   | 3     |
 [slave]
| Threads_cached    | 120   |
| Threads_connected | 383   |
| Threads_created   | 1681  |
| Threads_running   | 1     |
- slow_launch_threads :쓰래드 생성에 걸린 시간이 slow_launch_time 이상 걸린 쓰래드의 수. Slow_launch_time은 기본 2초이다. 0에 가까와야 좋은 것이다. 내 db는 0이군.
 *쓰레드 캐쉬의 적중률은  threads_created/connections로 계산 가능
A DB(캐슁용) : 1681/1505789 : 0.1%의 쓰레드 캐쉬의 적중률을 보여준다 (현재 thread_cache_size : 4)
B DB(어드민용) : 179348 / 2046107  : 8.7%의 쓰레드 캐쉬의 적중률을 보여준다 (현재 thread_cache_size : 128 )
=>thread_cache_size나 높여볼까나? 확실히 thread_cache_size가 높은 것이 훨씬 높다.
(3) Handler
일반적인 해석
  - handler_read_first가 높은 경우  많은 풀 인덱스 스캔이 이루어짐
  - handler_read_next가 높은 경우  풀 인덱스 스캔과 레인지 스캔이 이루어짐
  - handler_read_rnd가 높은 경우  많은 풀 테이블 스캔과 레인지 스캔이 이루어짐
  - handler_read_key가 높은 경우  인덱스를 읽는 경우가 많음
 [A DB(캐슁용)] => 별 튜닝 요소가 없다.
| Handler_commit             | 0     |
| Handler_delete             | 0     |
| Handler_discover           | 0     |
| Handler_prepare            | 0     |
| Handler_read_first         | 0     |
| Handler_read_key           | 0     |
| Handler_read_next          | 0     |
| Handler_read_prev          | 0     |
| Handler_read_rnd           | 0     |
| Handler_read_rnd_next      | 19    |
| Handler_rollback           | 0     |
| Handler_savepoint          | 0     |
| Handler_savepoint_rollback | 0     |
| Handler_update             | 0     |
| Handler_write              | 25    |
 [B DB(어드민용)] =>튜닝 요소가 많다.  많은 풀 테이블 스캔과 레인지 스캔이 이루어지는 것 같다.
| Handler_commit        | 199415     |
| Handler_delete        | 269322     |
| Handler_discover      | 0          |
| Handler_read_first    | 67565      |
| Handler_read_key      | 13910141   |
| Handler_read_next     | 429593667  |
| Handler_read_prev     | 2196569    |
| Handler_read_rnd      | 372568     |
| Handler_read_rnd_next | 2211096685 |
| Handler_rollback      | 1415609    |
| Handler_update        | 595584     |
| Handler_write         | 2026479    |

 

4. 성능
(1) MySQL의 느린 응답을 나타낸다. => slow_queries와 slow_launch_threads
(2) 부하가 심하다는 것을 나타낸다 =>   threads_created,  max_used_connections,  opend_tables이 큰 경우 (이 경우 table_cache를 올리자)
(3) 인덱스를 많이 읽는다. => handler_read_key가 높은 경우 
(4) 락 경쟁과 관련된 항목 =>  table_locks_waited VS table_locks_immediate , 만약 table_locks_waited가 높으면, myisam에서 innodb로 변경하는 것이 좋다.
A DB(캐슁)
| Table_locks_immediate | 20498565 |
| Table_locks_waited    | 0        |
B DB(어드민)
| Table_locks_immediate | 9500191 |
| Table_locks_waited    | 12509   |
(5) 메모리에 적용할 수 없는 큰 임시 테이블이 많이 만들어졌다 => created_tmp_disk_tables
=>  tmp_table_size를 올려서 과도한 DISK I/O가 발생하는 것을 막는다. 즉, 디스크를 안쓰고, 메모리를 쓰도록 한다.
A DB(캐슁) |Created_tmp_disk_tables | 0   (tmp_table_size | 67108864 )
B DB(어드민)| Created_tmp_disk_tables | 107  ( tmp_table_size | 33554432 )
(6)  select쿼리가 최적화 되지 못했다 => Select_xxx
=> select_full_join과 select_range_check는 많거나 다른 인덱스가 필요하다.
(6) sort_xxx 환경변수들의 값이 크다 => 쿼리에 따라 ordering 및 grouping 비용 크다.
=> sort_buffer_size가 크게 설정한다. 25%이상의 성능 향상을 기대할 수 있다. sort_buffer에 데이터를 정렬 한 후 실제 결과값을 처리하는 것은 read_rnd_buffer_size에 영향을 준다.
  

5. 최적화
(1) Table Cache 최적화
- table_cache 값을 올릴 때, mysqld가 필요로 하는 file descriptor의 수가 증가한다.
- MyISAM 엔진을 사용하는 경우 열려있는 각각의 테이블에 대해 하나의 file descriptor가 필요하게 되고, 게다가 인덱스 파일을 위해 하나의 file descriptor가 더 필요하다.
- 대부분의 운영체제에서는 프로세스당 사용할 수 있는 file descriptor의 수가 제한되는데, 이를 위해서 ulimit을 이용해서 file descript를 최대한 unlimited로 수정하는 것이 좋다.
- Opend_table 환경변수가 높을 때, 그리고 FLUSH TABLE을 자주 수행하지 않는다면 table_cache를 높이는 것이 좋다.
(2) Table Scan 최적화
- 디스크 억세스를 줄이기 위해 read_buffer가 사용된다.
- read_buffer_size는 기본 128Kb의 크기를 가지고, 높을 수록 테이블 스캔의 성능을 높여준다.
- 높여주되 지나치게 큰 값을 잡는 것은 좋지 않다. 기본적으로 테이블 스캔을 수행하는 모든 쓰래드에 할당될 수 있다.
(3) Join
- 조인되는 컬럼에 인덱스가 존재하지 않을 경우 성능이 매우 떨어진다.
- 인덱스를 추가할 수 없는 경우 join_buffer_size를 높인다.
- 두 테이블 간에 풀 조인이 일어날 경우 하나의 join_buffer가 할당되고 인덱스가 적용되지 않는 조인의 테이블 수가 늘어나는 만큼의 join_buffer가 할당된다.
(4) querty cache
select 쿼리와 그 결과를 저장한다. Query_cache_size를 클 수록 쿼리 캐시 싸이즈도 커진다. 하지만, 테이블이 바뀌면, Query cache는 모두 reset된다.
query_cache_limit을 조정함으로써 쿼리 캐시에 저장될 최대 쿼리 크기를 조절할 수 있고, Query_cache_min_res_unit(block size)를 설정하여 쿼리 캐시의 조각화를 줄일 수도 있다. 기본값은 4K이다.
Qcache_hits 와 Com_select를 비교하여 쿼리 캐시 적중률을 계산하여 성능을 최적화 할 수 있다

[출처] mysql-성능튜닝 #2|작성자 webman21

mysql의 최대 성능 향상 방법

카테고리 없음 2008. 12. 8. 23:46 Posted by 민수

mysql의 최대 성능 향상 방법

10.1 버퍼 크기 조정
mysqld 서버가 사용하는 기본 버퍼 크기는 다음의 명령으로 알 수 있다.

shell> mysqld --help

이 명령은 모든 mysqld 옵션의 목록과 설정 변수를 보여준다. 출력되는 내용은 기본값을
포함하고 있으며 다음과 비슷하다.

Possible variables for option --set-variable (-O) are:
back_log current value: 5
connect_timeout current value: 5
join_buffer current value: 131072
key_buffer current value: 1048540
long_query_time current value: 10
max_allowed_packet current value: 1048576
max_connections current value: 90
max_connect_errors current value: 10
max_join_size current value: 4294967295
max_sort_length current value: 1024
net_buffer_length current value: 16384
record_buffer current value: 131072
sort_buffer current value: 2097116
table_cache current value: 64
tmp_table_size current value: 1048576
thread_stack current value: 131072
wait_timeout current value: 28800

mysqld 서버가 현재 가동중이면 다음의 명령을 통해 실제 변수값을 볼 수 있다.

shell> mysqladmin variables

각 옵션은 밑에서 설명한다. 버퍼 크기, 길이, 스택 크기는 바이트이다. 'K'(킬로바이트)
나 'M'(메가바이트)를 앞에 붙여 값을 지정할 수 있다. 예를 들면 16M는 16 메가바이트를
가리킨다. 대소문자는 구별하지 않는다. 16M 와 16m은 같다.

-back_log
mysql이 가질 수 있는 최대 연결 요청의 수. 이것은 main mysql 스레드가 매우 짧은 시간
동안 매우 많은 연결 요청을 받을 때 기능을 한다. 이때 메인 스레드가 연결을 체크하고 새
로운 스레드를 시작하는데는 약간의 시간이 걸린다.(그러나 아주 짧은 시간임) back_log 값
은 mysql이 순간적으로 새로운 요청에 답하는 것을 멈추기전에 이 짧은 시간동안 얼마나
많은 요청을 쌓아두고 있는지를 지정한다. 매우 짧은 시간동안 매우 많은 연결이 예상될때
만 이 값을 증가시켜야 한다.

다른 말로 이 값은 tcp/ip 연결을 받는 listen queue의 크기이다. 각 운영체제마다 이러한 큐
의 크기에 한계가 있다. Unix system call listen(2) 매뉴얼페이지에 자세한 정보가 있다. ba
ck_log값의 한계는 운영체제 문서를 확인해봐라. back_log를 최대값보다 더 높여도 효과가
없다.

-connect_timeout
Bad handshake에 반응하기 전에 연결 패킷을 mysql 서버에서 기다리는 시간.(초)

-join_buffer
(인덱스를 사용하지 않는 조인의) full-join에서 사용하는 버퍼의 크기. 버퍼는 두 테이블 사
이에서 각 full-join마다 한번 할당이 된다. 인덱싱을 추가하지 못할 때 조인 버퍼를 증가시
키면 full join의 속도를 향상시킬 수 있다. (일반적으로 빠르게 조인을 하는 가장 좋은 방법
은인덱스를 추가하는 것이다)

-key_buffer
인덱스 블락은 버퍼링되고 모든 스레드에서 공유한다. 키 버퍼는 인덱스 블락에서 사용하는
버퍼의 크기이다. 인덱스가 많은 테이블에서 delete나 insert 작업을 많이 하면 키 버퍼값을
증가시키는 것이 좋다. 더 빠른 속도를 내려면 LOCK TABLES를 사용하자. [Lock Tables]
참고.

-max_allowed_packet
한 패킷의 최대 크기. 메시지 버퍼는 net_buffer_length 바이트로 초기화되지만 필요하면 최
대 허용 패킷 바이트를 증가시킬 수 있다.기본값은 큰 패킷을 잡기에는 작다. 거대 BLOB
컬럼을 사용한다면 값을 증가시켜야 한다. 사용자가 원하는 최대 blob만큼 크게 해야 한다.

-max_connections
동시 클라이언트 숫자. mysqld가 필요로하는 파일 지시자(descriptor)의 숫자만큼 값을 늘려
야 한다. 밑에서 파일 디스크립터 제한에 대한 내용을 참고하자.

-max_connect_errors
호스트에서 최대 연결 에러이상의 interrupted 연결이 있으면 더 많은 연결을 위해 호스트는
block화된다. FLUSH HOSTS 명령으로 호스트의 block을 해제할 수 있다.

-max_join_size
최대 조인 크기이상으로 레크도를 읽는 조인을 하면 에러가 난다. 만약 사용자가 where 문
을 사용하지 않고 시간이 많이 걸리면서 몇백만개의 레코드를 읽는 조인을 수행하려 하면
이 값을 설정한다.

-max_sort_length
BLOB나 TEXT 값으로 정열할때 사용하는 바이트의 숫자. (각 값중 오직 첫번째 max_sort
_length 바이트만 사용된다. 나머지는 무시된다)

-net_buffer_length
질의에서 통신 버퍼가 초기화되는 크기. 일반적으로 바뀌지 않지만 매우 적은 메모리를 가
지고 있을 때 예상되는 질의에 맞게 세팅할 수 있다. (이것은 클라이언트에 가는 예상된 sql
문의 길이이다. 질의문이 이 크기를 넘으면 버퍼는 자동으로 max_allowed_packet 바이트까
지 증가한다)

-record_buffer
순차적인 검색을 하는 각 스레드에서 각 검색 테이블에 할당하는 버퍼 크기. 순차적인 검색
을 많이 하면 이 값을 증가시켜야 한다.

-sort_buffer
정렬이 필요한 각 스레드에서 할당하는 버퍼 크기. order by 나 group by 오퍼레이션을 빠
르게 하려면 이 값을 증가시킨다. 16.4 [임시 파일] 참고.

-table_cache
모든 스레드에서 열 수 있는 테이블의 숫자. mysqld가 필요로 하는 파일 디스크립터의 숫
자만큼 이 값을 증가시켜라. mysql은 각 유일한 오픈 테이블에서 두개의 파일 디스크립터가
필요하다. 파일 디스크립터 제한을 참고한다. 테이블 캐쉬가 어떻게 작동하는지는 10.6 [테
이블 캐쉬]를 참고한다.

-tmp_table_size
임시 테이블이 이 값을 넘으면 mysql은 "The Table tbl_name is full"이라는 에러 메시지를
낸다. 매우 많은 group by 질의를 사용하면 이 값을 증가시켜야 한다.

-thread_stack
각 스레드의 스택 사이즈. creash-me test(**역자주 : 데이터베이스의 벤치마킹을 하는 테스
트입니다. 말그대로 데이터베이스를 죽여주지요) 에서 잡히는 많은 제한은 이 값에 달려있
다. 기본값은 일반적으로 충분히 크다. 11장의 [벤치마크] 참조

-wait_timeout
연결을 끊기전에 연결 활동(activity)을 서버에서 기다리는 시간(초).

table_cache 와 max_connections는 서버가 열 수 있는 최대 파일 갯수에 영향을 미친다. 이
값을 증가시키면 운영시스템에서 오픈 파일 디스크립터의 per-process 숫자의 한계까지 올
릴 수 있다. (** ... imposed by your operating system on the per-process number of
open file descriptors. 번역이 이상하므로 영문 참고)
그러나 많은 시스템에서 이 한계를 증가시킬수 있다. 이렇게 하려면 각 시스템에서 이 한계
를 변화시키는 방법이 매우 다양하므로 운영체제 문서를 참고해야 한다.

table_cache 는 max_connections 와 관계가 있다. 예를 들면 200개의 연결이 있으면 최소 2
00 * n 의 테이블 캐쉬를 가져야 한다. 여기서 n은 조인에서 테이블의 최대 숫자이다.

mysql은 매우 유용한 알고리즘을 사용하기 때문에 일반적으로는 매우 적은 메모리로 사용
할 수 있으며 메모리가 많을 수록 성능이 더 많이 향상된다.

많은 메모리와 많은 테이블을 가졌고 중간정도 숫자의클라이언트에서 최대의 성능을 원한다
면 다음과 같이 사용한다.

shell> safe_mysqld -O key_buffer=16M -O table_cache=128
-O sort_buffer=4M -O record_buffer=1M &

메모리가 적고 연결이 많으면 다음과 같이 사용한다.

shell> safe_mysqld -O key_buffer=512k -O sort_buffer=100k
-O record_buffer=100k &

또는:

shell> safe_mysqld -O key_buffer=512k -O sort_buffer=16k
-O table_cache=32 -O record_buffer=8k -O net_buffer=1K &

매우 많은 연결이 있을 때 mysqld가 각 연결마다 최소한의 메모리를 사용하도록 설정하지
않았다면 "swapping problems" 문제가 생길 것이다.

mysqld에서 옵션을 바꾸었으면 그것은 서버의 해당하는 인스턴스에만 영향을 미친다는 것
을 기억하자.

옵션을 바꾸었을때의 효과를 보기 위해 다음과 같이 해보자.

shell> mysqld -O key_buffer=32m --help

마지막에 --help 옵션이 들어간 것을 기억하자. 그렇지 않으면 커맨드 라인에서 사용한 옵
션의 효력은 출력에는 반영되지 않을 것이다.


10.2 메모리 사용 방법 <메모리 최적화>

아래에서 설명하는 목록은 mysqld 서버가 메모리를 사용하는 방법에 대해서 나타내고 있
다. 메모리 사용과 관련된 서버의 변수 이름이 주어진다.


- 키 버퍼(변수 key_buffer)는 모든 스레드에서 공유한다. 서버에서 사용하는 다른 버퍼는
필요한대로 할당이 된다.

- 각 연결은 각 스레드마다의 특정한 공간을 사용한다. 스택(64k, 변수 thread_stack) , 연결
버퍼(변수 net_buffer_length), result 버퍼 (변수 net_buffer_length) 등. 연결 버퍼와 result
버퍼는 필요할때 max_allowed_packet 까지 동적으로 증가된다. 질의가 수행될 때 현재의
질의문의 복사문이 또한 할당이 된다.
(** When a query is running a copy of the current query string is also alloced.)

- 모든 스레드는 같은 기본 메모리를 공유한다.
- 메모리 맵은 아직 지원이 안된다. (압축 테이블을 제외하고. 그러나 이것은 다른 이야기이
다) 왜냐하면 4GB의 32비트 메모리 공간은 대부분의 대형 테이블에서 충분히 크기가 않기
때문이다. 우리가 64비트 주소 공간을 가진 시스템을 가지게 될 때 우리는 메모리 맵핑을
위한 일반적인 지원을 추가할 것이다.

- 테이블에서 순차적인 검색을 하는 각 요청은 read 버퍼에 할당이 된다. (변수 record_buff
er)

- 모든 조인은 한번에 수행이 되며 대부분의 조인은 임시 테이블을 생성하지 않고 수행이
된다. 대부분의 테이블은 메모리 기반(HEAP) 테이블이다. 거대 길이의 레코드를 가졌거나
BLOB 컬럼을 포함한 임시 테이블은 디스크에 저장이 된다. 현재의 문제는 메모리 기반 테
이블이 tmp_table_size를 초과했을때 "The table tbl_name is full"이라는 에러가 생기는 것
이다. 가까운 시일안에 필요할때 자동적으로 메모리 기반(HEAP) 테이블을 디스크 기반(NI
SAM) 테이블로 바꾸도록 고칠 것이다.
이 문제를 해결하기 위해서 mysqld의 tmp_table_size 옵션을 설정하여 임시 테이블 크기를
늘이거나 클라이언트 프로그램에서 SQL_BIG_TABLES라는 sql 옵션을 설정하여야 한다. 7.
24 SET OPTION 을 참고하자.
mysql 3.20에서 임시 테이블의 최대 크기는 record_buffer*16이다. 3.20 버전을 사용하고 있
다면 record_buffer의 값을 증가시켜야 한다. 또한 mysqld를 시작할 때 --big-tables 옵션을
사용하여 항상 임시 테이블을 디스크에 저장할 수 있지만 질의 속도에 영향을 미친다.

- 정열을 하는 대부분의 요청은 정렬 버퍼와 하나나 두개의 임시 파일을 할당한다. 16.4의
[임시 파일]을 참고한다.

- 대부분의 파징(parsing)과 계산은 지역 메모리에서 이루어진다. 작은 아이템에는 메모리 o
verhead가 필요없고 일반적인 느린 메모리 할당(slow memory allocation)과 freeing(메모리
해제)는 무시된다. 메모리는 오직 예상지 못한 거대 문자열에서 할당이 된다.( mallloc() 과
free() 사용)

- 각 인덱스 파일은 한번에 열리며 각 병행수행되는 스레드에서 데이터 파일은 한번에 열
린다. 각 병행수행 스레드마다 테이블 구조, 각 컬럼의 컬럼 구조, 3 * n 의 버퍼 크기가 할
당된다. ( n은 최대 레코드 길이이며 BLOB 컬럼은 해당하지 않는다) BLOB는 BLOB 데이
터의 길이에 5에서 8 바이트를 더한 값을 사용한다.

- BLOB 컬럼을 가진 각 테이블에서 버퍼는 거대 BLOB 값을 읽을 수 있도록 동적으로 커
진다. 테이블을 검색하면 버퍼는 최대 BLOB의 값만큼 버퍼가 할당이 된다.

- 모든 사용중인 테이블의 테이블 핸들러는 캐쉬에 저장되며 FIFO로 관리가 된다. 일반적
으로 캐쉬는 64 엔트리를 갖는다. 동시에 두개의 실행 스레드에서 테이블을 사용하면 캐쉬
는 테이블의 두 엔트리를 포함한다. 10.6 [테이블 캐쉬]를 참고한다.

- mysqladmin flush-tables 명령은 사용하지 않는 모든 테이블을 닫고 현재 실행되는 스레
드가 끝날 때 모든 사용중인 테이블을 닫는다고 표시한다. 이것은 효과적으로 사용중인 메
모리를 해제한다.


ps 와 다른 시스템 상황 프로그램은 mysqld가 많은 메모리를 사용하고 있다고 보고할 것이
다. 이것은 다른 메모리 주소의 스레드-스택때문에 생긴다. 예를 들면 솔라리스의 ps 는 스
택사이의 사용하지 않는 메모리를 사용하는 메모리로 간주한다. 이것은 swap -s를 이용 사
용가능한 스왑을 체크하여 확인할수 있다. 우리는 mysqld를 상용 메모리 유출 측정 프로그
램으로 테스팅해서 mysqld에는 메모리 유출이 없다.


10.3 속도 향상에 영향을 미치는 컴파일/링크 방법 <컴파일시 최적화하기>

다음 테스트의 대부분은 리눅스와 mysql 벤치마크를 가지고 수행되었지만 다른 운영 시스
템에도 암시해주는 것이 있다.

static으로 링크를 할때 가장 빠른 실행 속도를 얻을 수 있다. 데이터베이스에 연결하기 위
해 TCP/IP보다는 유닉스 소켓을 사용하면 더 좋은 성능을 낼 수 있다.

리눅스에서 pgcc와 -O6을 사용하면 가장 빠르다. 'sql_yacc.cc'를 이 옵션으로 컴파일하려면
gcc/pgcc는 모든 성능을 내기 위해 많은 메모리가 필요하기 때문에 180M의 메모리가 필요
하다. 또한 mysql을 설정할때 libstdc++ 라이브러리를 포함하지 않기 위해 CXX=gcc라고 설
정해야 한다.

- pgcc를 사용하고 모두다 -O6 옵션으로 컴파일하면 mysqld 서버는 gcc로 컴파일한 것보
다 11% 빨라진다.

- 동적으로 링크하면 (-static을 사용하지 않고) 13% 느려진다.
If you connect using TCP/IP rather than Unix sockets, the result is 7.5% slower.
- 유닉스 소켓을 사용하는 것보다 tcp/ip로 연결하는 것이 7.5% 느려진다.

- On a Sun sparcstation 10, gcc 2.7.3 is 13% faster than Sun Pro C++ 4.2.
- On Solaris 2.5.1, MIT-pthreads is 8-12% slower than Solaris native threads.
(** 번역을 안한 이후. 리눅스랑 상관없으니깐... **)

TcX에서 제공한 mysql 리눅스 배포판은 pgcc로 컴파일되었고 정적으로 링크되었다.


10.4 How MySQL uses indexes

prefix- and end-space compressed. See section 7.26 CREATE INDEX syntax (Compatibil
ity function).

모든 인덱스(PRIMARY, UNIQUE and INDEX()) 는 B-trees 에 저장된다. 문자열은 자동적
으로 앞 뒤의 공간(?)이 압축된다. 7.26 [인덱스 생성] 참고.

인덱스의 사용 :
- WHERE 문에서 해당하는 레코드 빨리 찾기
- 조인을 수행할때 다른 테이블에서 레코드 가져오기
- 특정 키에서 MAX() 나 MIN() 값 찾기
- 소팅이나 그룹화할때 인덱스 키를 사용하면 테이블을 정열하거나 그룹화한다. 키에 DES
C가 붙으면 역순으로 인덱스를 읽는다.
- 어떤 경우에는 데이터 파일에 묻지 않고 값을 가져온다. 어떤 테이블에서 사용하는 모든
컬럼이 숫자이고 특정 키로 형성되어있으면 빠른 속도로 인덱스 트리에서 값을 가져올 수
있다.

다음 예제를 보자.

mysql> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;


다중 컬럼 인덱스가 col1 과 col2에 있으면 해당하는 레코드를 직접 가져올 수 있다. 분리
된 단일 컬럼 인덱스가 col1 과 col2 에 있으면 최적화기는 어떤 인덱스가 더 적은 레코드
를 가졌는지 확인하고 레코드를 가져오기 위해 그 인덱스를 사용하도록 결정한다.

테이블이 다중 컬럼 인덱스를 가졌다면 최적화기가 레코드를 찾는데 어떤 인덱스키를 사용
할 수 있다. 예를 들면 세가지 컬럼 인덱스(col1, col2, col3)를 가졌다면 (col1), (col1,col2)
(col1,col2,col3) 인덱스를 사용하여 검색을 할 수 있다.

MySQL can't use a partial index if the columns don't form a leftmost prefix of the inde
x.
Suppose you have the SELECT statements shown below:
(** 해석이 잘 안되는데 예제를 보시면 무슨 말인지 알 수 있을 것임**)

mysql> SELECT * FROM tbl_name WHERE col1=val1;
mysql> SELECT * FROM tbl_name WHERE col2=val2;
mysql> SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3;

If an index exists on (col1,col2,col3), only the first query shown above uses the index.
The second and third queries do involve indexed columns, but (col2) and (col2,col3) are
not leftmost prefixes of (col1,col2,col3).

인덱스가 (col1,col2,col3)로 있다면 위의 질의중 오직 첫번째 질의만 인덱스를 사용한다. 두
번째 및 세번째 질의은 인덱스된 컬럼이 포함되어 있지만 (col2) 와 (col2,col3)는 (col1,col2,c
ol3) 인덱스에 해당하지 않는다.

MySQL also uses indexes for LIKE comparisons if the argument to LIKE is a constant
string that doesn't start with a wildcard character. For example, the following SELECT
stat ements use indexes:

mysql은 또한 LIKE의 인수가 와일드카드 문자로 시작하지 않는 상수 문자열일이라면 LIK
E 비교문에서 인덱스를 사용한다. 예를 들어 다음의 SELECT 문은 인덱스를 사용한다.

mysql> select * from tbl_name where key_col LIKE "Patrick%";
mysql> select * from tbl_name where key_col LIKE "Pat%_ck%";

첫번째 문장에서는 "Patrick" <= key_col < "Patricl" 을 가진 레코드만 고려된다. 두번째 문
장에서는 "Pat" <= key_col < "Pau" 을 가진 레코드만 고려된다.


다음의 SELECT 문은 인덱스를 사용하지 않는다:

mysql> select * from tbl_name where key_col LIKE "%Patrick%";
mysql> select * from tbl_name where key_col LIKE other_col;

첫번째 문장에서 LIKE 값은 와일드카드 문자로 시작하고 있다. 두번째 문장에서는 LIKE
값이 상수가 아니다.



10.5 WHERE 문에서 최적화하기
(이번 절은 완전한 내용을 포함하고 있지는 않다. mysql은 많은 최적화방법이 있다.)

In general, when you want to make a slow SELECT ... WHERE faster, the first thing t
o check is whether or not you can add an index. All references between different tables
should usually be done with indexes. You can use the EXPLAIN command to determine
which indexes are used for a SELECT. See section 7.21 EXPLAIN syntax (Get informat
ion about a SELECT).
일반적으로 느린 SELECT ... WHERE 문을 빠르게 하려면 가장 먼저 확인해야 할 것이 인
덱스 추가 문제이다. 다른 테이블사이에서 모든 레퍼런스(references 참조)는 일반적으로 인
덱스에 의해 수행된다. SELECT 문에서 어떤 인덱스를 사용하는지 결정하기 위해 EXPLAI
N 명령을 사용할 수 있다. 7.21 [Explain]을 참고.

mysql에서 수행하는 최적화는 다음과 같다.


- 불필요한 삽입어 제거

((a AND b) AND c OR (((a AND b) AND (c AND d))))
-> (a AND b ANDc) OR (a AND b AND c AND d)

-상수 폴딩(folding)

(a<b AND b=c) AND a=5
-> b>5 AND b=c AND a=5

- 상수 조건 제거(상수 폴딩때문에 필요)

(B>=5 AND B=5) OR (B=6 AND 5=5) OR (B=7 AND 5=6)
-> B=5 OR B=6

- 인덱스에서 사용되는 상수 표현은 한번에 계산된다.
(Constant expressions used by indexes are evaluated only once.)

- WHERE 절이 없는 단일 테이블의 COUNT(*)는 테이블 정보에서 직접 값을 가져온다.
단일 테이블에서 사용된 NOT NULL 표현도 이와 같이 수행된다.

- 유효하지 않은 상수 표현은 미리 제거된다. mysql은 불가능하고 해당하는 레코드가 없는
SELECT 문을 빠르게 감지한다.

- GROUP BY 나 그룹 펑션(COUNT(), MIN() ...)을 사용하지 않으면 HAVING은 WHERE
에 합쳐진다.
(** HAVING 절에서는 인덱스를 사용하지 못함. 그러므로 가능한 HAVING절을 사용하지
않는게 속도면에서 좋다 **)

- 각 서브 조인에서 빠르게 WHERE 문을 계산하고 가능한한 레코드를 제외하도록 간소하
게 WHERE 문이 만들어진다.

- mysql은 일반적으로 최소한의 레코드를 찾기 위해 인덱스를 사용한다. =, >, >=, <, <=,
BETWEEN 그리고 'something%' 처럼 앞이 와일드카드로 시작하지 않는 LIKE 문등을
사용하여 비교를 할 때 인덱스를 사용한다. (** 10.4 절에서 설명하였듯이 like 를 사용할때
와일드카드로 시작하는 like 문을 사용하면 인덱스를 사용하지 않는다. 일정한 단어로만 시
작하는 컬럼에서 자료를 찾을 때 유용할 것이다. **)

- Any index that doesn't span all AND levels in the WHERE clause is not used to opti
mize the query.

다음의 WHERE 문은 인덱스를 사용한다.:

... WHERE index_part1=1 AND index_part2=2
... WHERE index=1 OR A=10 AND index=2 /* index = 1 OR index = 2 */
... WHERE index_part1='hello' AND index_part_3=5
/* optimized like "index_part1='hello'" */

다음의 WHERE 문은 인덱스를 사용하지 않는다.:

... WHERE index_part2=1 AND index_part3=2 /* index_part_1 is not used */
... WHERE index=1 OR A=10 /* No index */
... WHERE index_part1=1 OR index_part2=10 /* No index spans all rows */

- 질의에서 다른 테이블보다 모든 상수 테이블을 먼저 읽는다. 상수 테이블은 다음과 같다.
ㅇ빈 테이블이나 1개의 레코드만 있는 테이블
ㅇWHERE 문에서 UNIQUE 인덱스나 PRIMARY KEY 를 사용하고 모든 인덱스
는 상수 표현으로된 테이블

다음의 테이블은 상수 테이블로 사용된다.

mysql> SELECT * FROM t WHERE primary_key=1;
mysql> SELECT * FROM t1,t2
WHERE t1.primary_key=1 AND t2.primary_key=t1.id;

- 모든 가능성을 시도하여 테이블을 조인하는데 가장 좋은 조인 조합을 찾는다. (ORDER B
Y나 GROUP BY의 모든 컬럼이 동일한 테이블에서 나오면 조인을 할때 이 테이블이 먼저
선택된다)

- ORDER BY 문과 다른 GROUP BY 문이 있을 때, 또는 ORDER BY 나 GROUP BY가
조인 큐의 첫번째 테이블이 아닌 다른 테이블의 컬럼을 포함하고 있으면 임사 테이블을 만
든다.

- 각 테이블 인덱스를 찾고 레코드의 30%미만을 사용하는 (best) 인덱스가 사용된다. 그런
인덱스가 없으면 빠른 테이블 검색이 사용된다.

- 어떤 경우에는 mysql은 데이터 파일을 조회하지 않고 인덱스에서 레코드를 읽을 수 있
다. 인덱스에서 사용한 모든 컬럼이 숫자라면 질의를 처리하는데 단지 인덱스 트리만을 사
용한다.

- 각 레코드가 출력되기 전에 HAVING 절에 맞지 않는 레코드는 건너뛴다.

다음은 매우 빠른 질의의 예이다:

mysql> SELECT COUNT(*) FROM tbl_name;
mysql> SELECT MIN(key_part1),MAX(key_part1) FROM tbl_name;
mysql> SELECT MAX(key_part2) FROM tbl_name
WHERE key_part_1=constant;
mysql> SELECT ... FROM tbl_name
ORDER BY key_part1,key_part2,... LIMIT 10;
mysql> SELECT ... FROM tbl_name
ORDER BY key_part1 DESC,key_part2 DESC,... LIMIT 10;

다음의 커리는 인덱스 트리만을 사용하여 값을 구한다.(인덱스 컬럼은 숫자라고 가정):

mysql> SELECT key_part1,key_part2 FROM tbl_name WHERE key_part1=val;
mysql> SELECT COUNT(*) FROM tbl_name
WHERE key_part1=val1 and key_part2=val2;
mysql> SELECT key_part2 FROM tbl_name GROUP BY key_part1;

다음의 질의는 개별적인 정열을 하지 않고 정열된 순서대로 열을 가져오는 데 인덱스를 사
용한다:

mysql> SELECT ... FROM tbl_name ORDER BY key_part1,key_part2,...
mysql> SELECT ... FROM tbl_name ORDER BY key_part1 DESC,key_part2 DESC,...


10.6 테이블 열고 닫는 방법

open 테이블의 캐쉬는 table_cache의 최대값까지 커질 수 있다. (기본값 64 ; 이 값은 mysql
d에서 -0 table_cache=# 으로 바꿀 수 있다) 캐쉬가 꽉 찼을때, 그리고 다른 스레드가 테이
블을 열려고 할 때, 또는 mysqladmin refresh 나 mysqladmin flush-tables를 사용할때를 제
외하고는 테이블은 결코 닫히지 않는다.

테이블 캐쉬가 꽉 차면 서버는 캐쉬 엔트리를 사용하도록 조절하기 위해 다음의 절차를 사
용한다.

- 가장 먼저 사용했던 순서대로 현재 사용하지 않는 테이블을 닫는다.
- 캐쉬가 꽉 찼고 어떤 테이블도 닫히지 않지만 새로운 테이블을 열어야 한다면 캐쉬가 필
요한 만큼 임시적으로 확장된다.
- 캐쉬가 임시적으로 확장된 상태이고 테이블을 사용할 수 없는 상황으로 가면 테이블을
닫고 캐쉬를 해제한다.

테이블은 각 동시병행적인 접근때마다 열린다. 동일한 테이블에 접근하는 두개의 스레드가
있거나 같은 질의에서 테이블에 두번 접근하면(with AS) 테이블을 두번 열여야 한다는 의
미이다. 테이블의 첫번째 개방은 두개의 파일 디스크립터를 가진다. ; 추가적인 테이블의 개
방은 하나의 파일 디스크립터를 가질 뿐이다. 처음에 개방에 사용하는 추가적은 파일 디스
크립터는 인덱스 파일에 사용된다. ; 이 디스크립터는 모든 스레드에서 공유된다.


10.6.1 데이터베이스에서 많은 수의 테이블을 만들때의 단점

디렉토리에 많은 파일이 있다면 open, close 그리고 create 오퍼레이션은 느려질 것이다. 서
로 다른 많은 테이블에서 SELECT 문을 수행하면 테이블 캐쉬가 꽉 찰 때 약간의 overhea
d가 있을 것이다. 왜냐면 개방된 테이블이 있다면 다른 테이블은 닫혀야 하기 때문이다. 테
이블 캐쉬를 크게 해서 이러한 오우버헤드를 줄일 수 있다.


10.7 많은 테이블을 여는 이유

mysqladmin status 를 실행할 때 다음과 같이 나올 것이다:

Uptime: 426 Running threads: 1 Questions: 11082 Reloads: 1 Open tables: 12

단지 6테이블을 사용했는데 이러한 결과는 당황스러울 것이다.

mysql은 멀티스레드를 사용한다. 그래서 동시에 같은 테이블에서 많은 질의를 할 수 있다.
같은 파일에 대하여 다른 상황을 가지는 두개의 스레드에 대한 문제를 줄이기 위해 테이블
은 각 동시병행적인 스레드마다 독립적으로 개방된다. 이것은 테이타 파일에서 약간의 메모
리와 하나의 추가적인 파일 디스크립터를 사용한다. 모든 스레드에서 인덱스 파일은 공유된
다.


10.8 데이터베이스와 테이블에서 심볼릭 링크 사용

데이터베이스 디렉토리에서 테이블과 데이터베이스를 다른 위치로 옮기고 새로운 위치로 심
볼릭 링크를 사용할 수 있다. 이렇게 하는 것을 원할 경우가 있다. 예를 들면 데이터베이스
를 더 여유공간이 많은 파일시스템으로 옮기는 경우 등.

mysql에서 테이블이 심볼링 링크되었다는 것을 감지하면 심볼링 링크가 가리키는 테이블을
대신 사용할 수 있다. realpath() call 을 지원하는 모든 시스템에서 작동한다. (최소한 리눅
스와 솔라리스는 realpath()를 지원한다) realpath()를 지원하지 않는 시스템에서 동시에 실
제 경로와 심볼릭 링크된 경로에 접근하면 안된다. 이런 경우에는 업데이트 된후에 테이블
이 모순될 수 있다.

mysql은 기본값으로 데이터베이스 링크를 지원하지 않는다. 데이터베이스간에 심볼릭 링크
를 사용하지 않는 작동을 잘 할 것이다. mysql 데이터 디렉토리에 db1 데이터베이스가 있
고 db1을 가리키는 db2 심볼릭 링크를 만들었다고 해보자:

shell> cd /path/to/datadir
shell> ln -s db1 db2

이제 db1에 tbl_a라는 테이블이 있다면 db2에도 tbl_a가 나타날 것이다. 한 스레드가 db1.tbl
_a를 업데이트하고 다른 스레드가 db2.tbl_a를 업데이트하면 문제가 생길 것이다.

정말로 이 기능이 필요하면 , `mysys/mf_format.c'에서 다음의 코드를 수정해야 한다.:

if (!lstat(to,&stat_buff)) /* Check if it's a symbolic link */
if (S_ISLNK(stat_buff.st_mode) && realpath(to,buff))

위 코드를 다음과 같이 수정한다 :

if (realpath(to,buff))


10.9 테이블에 락 거는 방법

mysql의 모든 락은 deadlock-free 이다. 언제나 질의를 시작할때 한번에 모든 필요한 락을
요청하고 언제나 같은 순서대로 테이블에 락을 걸어 관리한다.

WRITE 락을 사용하는 방법은 다음과 같다:

- 테이블에 락이 없으면 그 테이블에 write 락을 건다.
- 이런 경우가 아니라면 write 락 큐에 락을 요청한다.

READ 락을 사용하는 방법은 다음과 같다:

- 테이블에 write 락이 없으면 그 테이블에 read 락을 건다.
- 이런 경우가 아니라면 read 락 큐에 락을 요청한다.

락이 해제되었을 때 락은 write 락 큐의 스레드에서 사용할 수 있으며 그러고 나서 read 락
큐의 스레드에서 사용한다.

테이블에서 업데이트를 많이 하면 SELECT 문은 더 이상 업데이트가 없을 때까지 기다린
다는 것을 의미한다.

이러한 문제를 해결하기 위해 테이블에서 INSERT 와 SELECT 오퍼레이션을 많이 사용하
는 경우에 다음과 같이 하면 된다. 임시 테이블에 레코드를 입력하고 한번에 임시 테이블에
서 실제 테이블로 레코드를 업데이트한다.

다음의 예를 보자:

mysql> LOCK TABLES real_table WRITE, insert_table WRITE;
mysql> insert into real_table select * from insert_table;
mysql> delete from insert_table;
mysql> UNLOCK TABLES;

만약 어떤 경우에 SELECT문에 우선권을 주고 싶다면 INSERT 옵션에서 LOW_PRIORITY
or HIGH_PRIORITY 옵션을 사용할 수 있다. 7.13 [Insert] 참고. (** LOW_PRIORITY를 지
정하면 클라이언트에서 테이블을 읽지 않을 때까지 INSERT 문 수행이 미루어진다. **)

단일 큐를 사용하기 위해 `mysys/thr_lock.c' 의 락킹 코드를 바꿀 수 있다. 이런 경우 writ
e 락과 read 락은 같은 우선권을 가지며 어떤 애플리케이션에서는 유용할 수 있다.

10.10 테이블을 빠르고 작게 배열하는 방법 <** 테이블 최적화 **>

다음은 테이블에서 최대의성능을 내는 방법과 저장 공간을 절약할 수 있는 테크닉이다:

- 가능한한 NOT NULL로 컬럼을 선언한다. 속도가 빨라지며 각 컬럼마다 1 비트를 절약할
수 있다.
- default 값을 가질 때 유리하다. 입력되는 값이 기본값과 다를 때만 확실하게 값이 입력된
다. INSERT 문에서 첫번째 TIMESTAMP 컬럼이나 AUTO-INCREAMENT 컬럼의 값을
입력할 필요가 없다. 18.4.49 [mysql_insert_id()] 참고.
- 가능한한 테이블을 작게 만드려면 더 작은 integer 타입을 사용하자. 예를 들면 MEDIUM
INT 가 보통 INT 보다 좋다.
- 가변 길이 컬럼이 없다면(VARCHAR, TEXT or BLOB columns), 고정 길이 레코드 포
맷이 사용된다. 이 경우 속도는 더 빠르지만 불행히도(흑흑~) 낭비되는 공간이 더 많다. 10.1
4 [Row format] 참고.
- mysql이 질의를 효과적으로 최적화하기 위해 많은 양의 데이터를 입력한후 isamchk --a
nalyze를 실행하자. 이렇게 하면 동일한 값을 가진 줄의 평균 숫자를 가리키는 각 인덱스의
값을 업데이트한다. (물론 unique 인덱스에서는 항상 1이다)
- 인덱스와 인덱스에 따른 데이타를 정열하려면
isamchk --sort-index --sort-records=1 을 사용하자.(if you want to sort on index 1).
인덱스에 따라 정렬된 모든 레코드를 읽기 위해 unique 인덱스를 가졌다면 이렇게 하는 것
이 속도를 빠르게 하는 가장 좋은 방법이다.
- INSERT 문에서 가능한 다중 값 목록을 사용하자. 개별적인 SELECT 문보다 훨씬 빠르
다. 데이타를 테이블에 입력할 때 LOAD DATA INFILE을 사용하자. 많은 INSERT 문을
사용하는 것보다 보통 20배 빠르다. 7.15 [Load] 참고.

많은 인덱스를 가진 테이블에 데이타를 입력할때 다음의 과정을 사용하면 속도를 향상시킬
수 있다.
1. mysql이나 Perl 에서 CREATE TABLE로 테이블을 만든다.
2. mysqladmin flush-tables 실행. (** 열린 테이블을 모두 닫음 **)
3. isamchk --keys-used=0 /path/to/db/tbl_name 사용. 테이블에서 모든 인덱스 사용을 제
거한다.
4. LOAD DATA INFILE 를 이용 테이블에 데이타를 입력.
5. pack_isam을 가지고 있고 테이블을 압축하기 원하면 pack_isam을 실행.
6. isamchk -r -q /path/to/db/tbl_name 를 이용 인덱스를 다시 생성.
7. mysqladmin flush-tables 실행.

- LODA DATA INFILE 과 INSERT 문에서 더 빠른 속도를 내려면 키 버퍼를 증가시킨
다. mysqld나 safe_mysqld에서 -O key_buffer=# 옵션을 사용하면 된다. 예를 들어 16M는
풍부한 램을 가졌다면 훌륭한 값이다.
- 다른 프로그램을 사용하여 데이타를 텍스트 파일로 덤프할때 SELECT ... INTO OUTFIL
E 을 사용하자. 7.15 [LOAD DATA INFILE] 참고.
- 연속으로 다량의 insert와 update를 할 때 LOCK TABLE을 사용하여 테이블에 락을 걸
면 속도를 향상시킬 수 있다. LOAD DATA INFILE 그리고 SELECT ...INTO OUTFILE
는 원자적이기 때문에 LOCK TABLE을 사용하면 안된다. 7.23 [LOCK TABLES/UNLOCK
TABLES] 참고.

테이블이 얼마나 단편화되었는지 점검하려면 '.ISM' 파일에서 isamchk -evi 를 실행한다. 1
3장 [Maintenance] 참고.



10.11 INSERT 문에서 속도에 영향을 미치는 부분 <** insert 최적화 **>

insert 하는 시간은 다음와 같이 구성된다:

Connect: (3)
Sending query to server: (2)
Parsing query: (2)
Inserting record: (1 x size of record)
Inserting indexes: (1 x indexes)
Close: (1)

(숫자)는 비례적인 시간이다. 이것은 테이블을 개방할때 초기의 overhead를 고려하고 있지
는 않다. (매 동시병행적으로 수행되는 질의마다 발생)

The size of the table slows down the insertion of indexes by N log N (B-trees).


테이블의 크기는 N log N(B-trees)에 따라 인덱스의 입력이 느려진다. (**말이 좀 이상. 테
이블이 커짐에 따라 인덱스 생성도 느려진다는 뜻이겠죵 **)

테이블에 락을 걸거나 insert 문에서 다중 값 목록을 사용하여 입력 속도를 빠르게 할 수
있다. 다중 값 목록을 사용하면 단일 insert 보다 5배 정도 속도가 빨라진다.

mysql> LOCK TABLES a WRITE;
mysql> INSERT INTO a VALUES (1,23),(2,34),(4,33);
mysql> INSERT INTO a VALUES (8,26),(6,29);
mysql> UNLOCK TABLES;

주요한 속도 차이는 모든 INSERT 문이 완료되고 난 후에 한번에 인덱스 버퍼가 쓰여기지
때문에 생긴다. 보통 서로 다른 여러 INSERT 문이 있으면 많은 인덱스 버퍼 플러쉬가 있
을 것이다. 모든 줄을 단일 문으로 입력하면 락은 필요없다.

락킹은 또한 다중 연결 테스트의 총 시간을 줄일 수는 있다. 그러나 어떤 스레드에서는 총
대기시간은 증가할 수 있다.(왜냐면 락을 기다리기 때문이다)
예를 들어보자:

thread 1 does 1000 inserts
thread 2, 3, and 4 does 1 insert
thread 5 does 1000 inserts

락을 사용하지 않으면 2, ,3 4는 1과 5 전에 끝마칠 것이다. 락을 사용하면 2,3,4는 아마도 1
이나 5 전에 끝나지 않을 것이다. 그러나 총 시간은 40% 빨라진다.

INSERT, UPDATE, DELETE 오퍼레이션은 mysql에서 매우 빠르다. 그렇기 때문에 줄에서
5개 이상의 insert나 update를 할 때 락을 추가하면 더 좋은 성능을 얻을 수 있다. 줄에 매
우 많은 자료를 입력한다면 다른 스레드에서 테이블에 접근하도록 하기 위해 때때로(각 100
0줄마다) UNLOCK TABLES를 사용하는 LOCK TABLES 실행하면 된다. 이렇게 하면 좋
은 성능을 낼 수 있다. (** 열심히 입력을 하고 중간에 락을 풀었다가 다시 락을 거는 것
반복함**)

물론 LOAD DATA INFILE 이 더 빠르다.



10.12 DELETE 문에서 속도에 영향을 미치는 부분 <** DELETE 문 최적화 **>

레코드를 삭제하는 시간은 정확히 인덱스 숫자에 비례한다. 레코드를 빠르게 지우기 위해
인덱스 캐쉬의 크기를 증가시킬 수 있다. 기본 인덱스 캐쉬는 1M 이다; 빠르게 삭제하기 위
해 증가되어야 한다.(충분한 메모리를 가지고 있다면 16M로 하자)


10.13 mysql에서 최대 속도를 얻는 방법

벤치마킹을 시작하자! mysql 벤치마크 스위트에서 어떤 프로그램을 사용할 수 있다. (일반
적으로 'sql-bench' 디렉토리에 있음) 그리고 입맞에 맞게 수정하자. 이렇게 하면 당신의 문
제를 해결할 수 있는 다른 해결책을 찾을 수 있으며 당신에게 가장 빠른 해결책을 테스트할
수 있다.

- mysqld를 적절한 옵션으로 시작하자. 메모리가 많을수록 속도가 빠르다.
10.1 [MySQL parameters] 참고.
- SELECT 문의 속도를 빠르게 하기 위해 인덱스를 만들자.
10.4 [MySQL indexes] 참고.
- 가능한 효율적으로 컬럼 타입을 최적화하자. 예를 들면 가능한 NOT NULL로 컬럼을 정
의하자. 10.10 [Table efficiency] 참고.
- --skip-locking 옵션은SQL 요청에서 파일 락킹을 없앤다. 속도가 빨라지지만 다음의 과
정을 따라야 한다:
ㅇ isamchk로 테이블을 체크하거나 수리하기 전에 mysqladmin flush-tables 로 모
든 테이블을 플러시해야 한다. (isamchk -d tbl_name은 언제나 허용된다. 왜냐하면 이건 단
순히 테이블의 정보를 보여주기 때문이다)
ㅇ 동시에 뜬 두개의 mysql 서버가 동일한 테이블을 업데이트하려 한다면 동일한
데이터 파일에 두개의 mysql 서버를 띄우면 안된다.

--skip-locking 옵션은 MIT-pthreads로 컴파일할때 기본값이다. 왜냐면 모든 플랫
폼의 MIT-pthreads에서 flock()가 완전하게 지원이 되지 않기 때문이다.

- 업데이트에 문제가 있다면 업데이트를 미루고 나중에 하자. 많은 업데이트를 하는 것이
한번에 하나를 업데이트하는 것보다 더 빠르다.
- FreeBSD 시스템에서 MIT-pthreads에 문제가 있으면 FreeBSD 3.0 이후 버전으로 업데
이트 하는것이 좋다. 이렇게 하면 유닉스 소켓을 사용하는 것이 가능하며(FreBSD에서 유닉
스 소켓이 MIT-pthreads에서 TCP/IP 연결을 사용하는 것보다 빠르다) 그리고 스레드 패키
지가 조정(intergrated?)되어야 한다.
- 테이블이나 컬럼 단계를 체크하는 GRANT는 성능을 떨어뜨린다.


10.14 로우 포맷과 다른 점은 무엇인가? 언제 VARCHAR/CHAR을 사용해야 하는가?

mysql은 실제의 SQL VARCHAR 타입이 없다. 그대신 mysql은 레코드를 저장하고 이것을
VARCHAR로 에뮬레이트하는데 세가지 방법이 있다.

테이블에 VARCHAR, BLOB, TEXT 컬럼이 없으면 고정 row size를 사용한다. 그외에는
동적 row size를 사용한다. CHAR 과 VARCHAR 컬럼은 애플리케이션의 관점에서 동일하
게 취급된다; 둘다 trailing space는 컬럼을 가져올때 제거된다.

isamchk -d 를 이용 테이블에서 사용하는 포맷을 체크할 수 있다.
(-d 는 "테이블 묘사"를 의미)

mysql은 세가지 다른 테이블 포맷을 가지고 있다; 고정길이, 다이나믹, 압축.


고정 길이 테이블
- 기본 포맷. 테이블에 VARCHAR, BLOB, TEXT 컬럼이 없을 때 사용.
- 모든 CHAR, NUMERIC, DECIMAL 컬럼은 컬럼 길이에 space-padded 이다. (** space-
padded를 무엇이라고 번역해야 할지 애매모호해서 **)
- 매우 빠름
- 캐쉬하기 쉽다
- 손상 후 복구가 쉽다. 왜냐면 고정된 위이에 레코드가 위치하기 때문이다.
- 많은 양의 레코드가 지워졌거나 운영 시스템에서 자유 공간을 늘리길 원치 않는다면 (isa
mchk를 이용) 재조직화할 필요없다.
- 보통 다이나믹 테이블보다 많은 디스크 공간을 필요로 한다.


다이나믹 테이블
- 테이블이 VARCHAR, BLOB, TEXT 컬럼을 포함하고 있을 때 사용.
- 모든 문자열 컬럼은 다이나믹하다.(4보다 작은 길이를 가진 문자열 제외)
- 컬럼이 문자열 컬럼에서 비었거나 ('') 숫자형 컬럼에서 0(NULL 값을 가진 컬럼과 동일
한 것이 아니다) 을 나타내는 비트맵이 모든 레코드 앞에 선행된다. 문자열 컬럼에서 trailin
g space를 제거한 후 zero의 길이를 가지거나 숫자형 컬럼이 zero의 값을 가지면 비트 맵으
로 표시되고 디스크에 저장되지 않는다. 비지 않은 문자는 문자내용에 길이 바이트만큼 추
가되어 저장된다.
- 보통 고정 길이 테이블보다 디스크 공간 절약.
- 줄의 길이를 확장하는 정보를 가지고 줄을 업데이트하면 줄은 단편화될 것이다. 이런 경
우 더 좋은 성능을 위해 때때로 isamchk -r 을 실행해야 한다. 통계적으로(?) isamchk -ei
tbl_name을 사용하자.
- 손상후 복구가 어렵다. 왜냐면 레코드가 많은 조각드로 단편화되고 링크(단편)가 없어지
기 때문이다.
- 다이나믹 사이즈 테이블의 예상되는 열 길이 :
3
+ (number of columns + 7) / 8
+ (number of char columns)
+ packed size of numeric columns
+ length of strings
+ (number of NULL columns + 7) / 8

각 링크마다 6 바이트가 더 있다. 다이나믹 레코드는 업데이트로 레코드가 늘어날때마다 링
크된다. 각 새로운 링크는 최소 20바이트일 것이며, 그래서 다음의 확장은 아마도 동일한 링
크로 될 것이다. 그게 아니라면 다른 링크가 있을 것이다. isamchk -ed 로 얼마나 많은 링
크가 있는지 체크할 수 있다. 모든 링크는 isamchk -r 로 제거할 수 있다.(** ?? **)

There is a penalty of 6 bytes for each link. A dynamic record is linked whenever an up
date causes an enlargement of the record. Each new link will be at least 20 bytes, so th
e next enlargement will probably go in the same link. If not, there will be another link.
You may check how many links there are with isamchk -ed. All links may be removed
with isamchk -r.


압축 테이블

- 읽기 전용 테이블은 pack_isam 유틸리티로 만들 수 있다. 확장 mysql 이메일 지원을 구
입한 모든 고객은 내부적인 용도로 pack_isam을 사용할 권리가 주어진다.
- 압축해제 코드는 모든 mysql 배포판에 있으므로 pack_isam이 없는 고객도 pack_isam으
로 압축된 테이블을 읽을 수 있다. (테이블이 같은 플랫폼에서 압축되어 있는한)
- 매우 적은 디스크 용량을 사용.
- 각 레코드는 개별적으로 압축이 된다.( 매우 적은 액세스 overhead) 레코드의 헤더는 테
이블의 가장 큰 레코드에 따라 (1-3 바이트) 고정된다. 각 컬럼은 다르게 압축이 된다. 압축
타입은 다음과 같다:

ㅇ 일반적으로 각 컬럼마다 다른 Huffman 테이블이다.
ㅇ Suffic 공간 압축
ㅇ Prefix 공간 압축
ㅇ 0 값을 가진 숫자는 1비트로 저장.
ㅇ integer 컬럼의 값이 작은 범위를 가졌다면, 컬럼은 최대한 작은 타입으로 저장
된다. 예를 들면 BIGINT 컬럼은 모든 값이 0부터 255라면 TINIINT 컬럼(1바이트)로 저장
된다.
ㅇ 컬럼이 몇가지 가능한 값으로만 구성되어 있다면, 컬럼 타입은 ENUM으로 변환
된다.
ㅇ 컬럼은 위 압축 방법을 조합하여 사용한다.
- 고정 길이나 다이나믹 길이의 테이블을 다룰 수 있다. 그러나 BLOB나 TEXT 컬럼은 다
룰 수 없다.
- isamchk로 압축을 해재할 수 있다.

mysql은 다른 인덱스 타입을 지원한다. 그러나 일반적인 타입은 NISAM이다. 이것은 B-tre
e 인덱스이며 모든 키의 갑을 합하여 (키 길이+4)*0.67로 인덱스 파일의 크기를 대강 계산
할 수 있다. (이것은 모든 키가 정렬된 순서로 입력된 가장 나쁜 경우이다)


String indexes are space compressed. If the first index part is a string, it will also be p
refix compressed. Space compression makes the index file smaller if the string column h
as a lot of trailing space or is a VARCHAR column that is not always used to the full
length. Prefix compression helps if there are many strings with an identical prefix.

문자열 인덱스는 공간이 압축된다. 첫번째 인덱스 부분이 문자열이라면, prefix가 압축된다.
문자열 컬럼이 다량의 trailing space를 가졌거나 언제나 완전한 길이를 사용하지 않는 VA
RCHAR 컬럼일 때 space 압축은 인덱스 파일을 더 작게 만든다. prefix 압축은 많은 문자
열에 동일한 prefix가 있을 때 유용하다

mysql variables

카테고리 없음 2008. 12. 8. 23:23 Posted by 민수
Mysql variables

variables 설 명 default
auto_increment_increment  auto increment의 증가량 1
auto_increment_offset  auto increment의 시작포인트 default 1 1
automatic_sp_privileges    ON                                              
back_log  Queue에 대기 가능한 connection 수 50
basedir  MySQL home directory  /home1/irteam/naver/mysql/                      
binlog_cache_size  한 트랜젝션동안 바이너리 로그를 위한 sql문을 잡고있는 캐시의 크기 32768
bulk_insert_buffer_size  MYISAM이 빠른 대량 insert 를 하기위한 size 8388608
character_set_client client로 부터 도착하는 character set  euckr                                           
character_set_connection  introduser와 숫자-문자변환을 위한 character set을 가지고있지 않은 literals 을 위해 사용되는 character set  euckr                                           
character_set_database database 에서 default로 사용되어지는 character set. database가 바꾸지 않는한 서버에서 이값을 작성한다. default database가 없다면 ,character_set_server와 같은 값을 가진다.  euckr                                           
character_set_results query 결과가 client로 되돌아가기 위해 사용하는 character set   euckr                                           
character_set_server server의 default character set.  euckr                                           
character_set_system 저장식별자를 위해 서버에서 사용하는 케릭터셋. The value is always utf8.   utf8                                            
character_sets_dir  character set의 디렉토리  /home1/irteam/naver/mysql/share/mysql/charsets/ 
collation_connection 연결 character set의 대조  euckr_korean_ci                                 
collation_database default database에 사용되는 대조. dafault database가 바꾸지 않는한 서버가 이값을 지정한다. default database가 없다면 , 그값은 collation_server와 같다.  euckr_korean_ci                                 
collation_server The server's default collation.   euckr_korean_ci                                 
completion_type 트렌젝션 완성 타입:
0 (the default), COMMIT 과 ROLLBACK 이 영향을 주지 않는다.
1, COMMIT 과ROLLBACK 은 COMMIT AND CHAIN 과 ROLLBACK AND CHAIN과 각각 동등하다. (막 종료된 트렌젝션과 같은 분리된레벨의 새로운 트렌젝션이 바로 시작된다.)
2, COMMIT 과 ROLLBACK 은 COMMIT RELEASE 과 ROLLBACK RELEASE과 각각 동등하다. (트렌젝션이 종료된후 서버연결이 끊긴다.)
0
concurrent_insert ON (the default), MySQL은 INSERT 와SELECT 구문이 가운데 free block이 없는 MyISAM table에서 동시에 실행되도록  허용한다. 이 옵션을 끄기위해 --safe 나 --skip-new 를 startup시 사용.

In MySQL 5.0.6, 이값은 세개의 숫자값으로 바뀌었다.:
Value Description
0 Off
1 (Default) 구멍없는 MyISAM테이블에 동시 insert가능
2 모든 MyISAM table에 동시 insert사용가능. 만약 테이블이 구멍을가지고있고 다른 쓰레드에 의해 사용되어진다면 새로운 레코드는 테이블의 마지막에 insert된다. 만약 테이블이 사용되어지지 않는 MySQL은 normal read lock 과 구멍으로 새로운 레코드를 insert한다.
1
connect_timeout connect 요청 후 지연시간 5
datadir  자료가 저장 될 디렉토리  /home1/irteam/naver/mysql/var/                  
date_format 날짜 형식  %Y-%m-%d                                        
datetime_format 시간 형식  %Y-%m-%d %H:%i:%s                               
default_week_format 주일 형식 0
delay_key_write 이 옵션은 MyISAM table에 영향을 준다. CREATE TABLE을 사용할때 DELAY_KEY_WRITE table옵션을 핸들링하는데 효과를 주는 값들이 있다.
옵션 설명
OFF - DELAY_KEY_WRITE 는 옵션 무시.
ON -  ON은 default로 CREATE TABLE에서 DELAY_KEY_WRITE 옵션을 열거한다.
ALL - 모든 새로 열린 테이블들은 DELAY_KEY_WRITE옵션이 가능하도록 만들어진 것 처럼 취급된다.

DELAY_KEY_WRITE 이 테이블에서 가능하다면 테이블이 닫힐때를 제외하고 모든 테이블의 인덱스 업데이트를 위해 키버퍼가 플러시되지 않는다. 이것은 키를 기록하는데 속도가 빨라지지만 이것을 사용한다면 서버 구동시 모든 MyISAM테이블에 대하여 --myisam-recover option 자동체킹 옵션을 추가해야만 한다. (for example, --myisam-recover=BACKUP,FORCE)
 ON                                              
delayed_insert_limit  delayed_insert_limit 에 delayed rows값을 넣고 난 후에는, INSERT DELAYED handler thread가 어떤 SELECT 구문이 pending되어있는지 체크한다. 만약그렇다면, 그것들을 delayed row를 삽입하기 전에 실행한다. .  100
delayed_insert_timeout Insert의 delay time out 300
delayed_queue_size Insert delayed를 다룰 때 큐에 저장될 크기 1000
div_precision_increment  / 을 이용한 분할오퍼레이션의 결과를 증가시키기 위해 수행한 정확한 digit 4
engine_condition_pushdown NDB 에 적용 default 0 (OFF) , 1일 경우 옵션을 사용- 조건절이 인덱스가 잡혀있지 않아 NDB에서 full table scan을 할때 이 옵션을 사용하면 조건이 스토리지 엔진으로 pushed down되고 NDB노드로 보내져 각 노드들이 스캔을 수행해 만족하는 조건을 서버로 보내준다  OFF                                             
expire_logs_days binary log가 자동으로 지워지는 날의 수 - 지정한 숫자에 따라 생성된 바이너리 로그가 삭제된다. 0
flush 모든 SQL변화를 DISK에SYNC하는 것  OFF                                             
flush_time flush time을 위해 모든테이블이 닫히고 모든 자원이 free해지고 unflush된 데이터를 disk에 저장하는 시간. 0
ft_boolean_syntax  boolean full text search에 의해 지원된 오퍼레이션 리스트  + -><()~*:""&
ft_max_word_len full text index에 포함되는 단어의 최대길이  84
ft_min_word_len  full text index에 포함되는 단어의 최단길이  4
ft_query_expansion_limit  쿼리 익스팬션을 통한 full text search의 수 20
ft_stopword_file  full text sertch를 위해 stopword를 읽어오는 파일  (built-in)                                      
group_concat_max_len  group_concat 함수를 사용했을 때 결과의 최대길이 1024
have_archive  아카이브 테이블의 사용여부  NO                                              
have_bdb  BDB table을 Mysql 데몬이 지원한다면 YES . --skip-bdb를 사용하면 DISABLED    NO                                              
have_blackhole_engine  BLACKHOLE tables를 mysql데몬이 지원한다면 YES , 아니면 NO  NO                                              
have_compress 서버에서 zlib 압축 라이브러리가 가능하다면 YES,가능하지 않을때 NO, COMPRESS() and UNCOMPRESS() functions이 사용되어지지 않는다면 사용 할 수 없다.  YES                                             
have_crypt 서버에서 crypt() system call이 가능하다면 YES , 아니면 NO. ENCRYPT() function 이 사용되어지지 못하면 사용 할 수 없다.  YES                                             
have_csv mysqld가 ARCHIVE table을 support한다면 YES, 아니면 NO .   NO                                              
have_example_engine mysqld 가 EXAMPLE table을 support한다면 YES, 아니면 NO.  NO                                              
have_federated_engine mysqld 가 FEDERATED table을 support한다면 YES, 아니면 NO.   NO                                              
have_geometry 서버가 spatial data types을 support한다면 YES , 아니면 NO.  YES                                             
have_innodb mysqld가 InnoDB table을 제공한다면 YES. --skip-innodb을 사용하면 DISABLED  YES                                             
have_isam ISAM table 은 더이상 제공하지 않기때문에 항상 NO이다.  NO                                              
have_ndbcluster mysqld 가 NDB Cluster table을 제공한다면 YES. --skip-ndbcluster를 사용하면 DISABLED  NO                                              
have_openssl mysqld가 SSL connection를 제공한다면 YES, 아니면 NO  NO                                              
have_query_cache mysqld 가 query cache를 제공한다면 YES, 아니면  NO  YES                                             
have_raid RAID table은 더이상 사용하지 않기 때문에 항상 NO  NO                                              
have_rtree_keys RTREE index가 가능하다면 YES, 아니면 NO. (이것들은 MyISAM table의 공간적인 인덱스에 사용한다.)  YES                                             
have_symlink  symbolic link를 support할수있다면 YES, 아니면 NO. 이것은 유닉스에서 DATA DIRECTORY 와 INDEX DIRECTORY table option을, 그리고 Windows에서data directory symlinks를 제공하기 위해서 요구되어진다.     YES                                             
init_connect  server에 client들이 접속을 할때마다 string  
init_file  서버시작시 설정해주면 sql문이 파일로 저장된다.  
init_slave  slave서버의 sql thread가 시작될 때 string  
innodb_additional_mem_pool_size  자료사전의 정보와 다른 내부의 자료구조를 저장하기위해 사용 1048576
innodb_autoextend_increment table space의 autoextend 증가량 (Mb) 8
innodb_buffer_pool_awe_mem_mb Adress Windowing Extensions memory에 버퍼풀이 위치한다면 그 Mb 0
innodb_buffer_pool_size 데이터와 인덱스를 캐시에 저장하기 위한 크기 8388608
innodb_checksums  디스크와 datafile에 checksum검증 여부  ON                                              
innodb_commit_concurrency  동시에 commit할수있는 thread의 수. 사용하지 않을때 0 0
innodb_concurrency_tickets innodb_thread_conurrency에 의해 Inno_db에 동시에들어갈 thread가 결정되는데 thread가 INNODB로 들어가기위한 ticket . 500
innodb_data_file_path  테이블 스페이스이름:크기;  ibdata1:10M:autoextend                          
innodb_data_home_dir 이노디비 데이터 디렉토리                                                   
innodb_doublewrite  default에 의해 두번씩 저장  ON                                              
innodb_fast_shutdown  default 1은 내부적수행(메모리구조정리,인덱스버퍼정리작업)을 skip하고 shutdown, 0은 shutdown전에 full purge와 buffer merge. 2는 log만 flush하고 shutdown- mysql이 깨지고 커밋되지않은 트렌젝션은 잃어버린다.다음startup시 회복된다. 1
innodb_file_io_threads 이노디비의 파일 입출력 쓰래드 수 4
innodb_file_per_table  테이블의 생성마다 shared table space에 data와 index를 .ibd파일로 새로이 만든다.  OFF                                             
innodb_flush_log_at_trx_commit 0 - 1초마다 disk에 기록하고sync  1- commit할 때 마다 2- commit마다 disk에 기록하고 1초마다 sync 1
innodb_flush_method fdatasync(the default)면 Innodb는 data와 log를 flush하기위해  fsync() 를 사용한다. O_DSYNC이면 Innodb는 O_SYNC를 로그파일을 flush하고 오픈하는데 사용하지만 O_SYNC로 datafile을 flush한다. O_DIRECT는 O_DIRECT로 datafile을 open하고 fsync()로 data와 log를 flush한다. InnoDB가 fdatasync()대신 fsync()를 사용한다는 것과 ,  O_DSYNC 를default로 사용하지 않는것을 참고하라.왜냐하면 그것들은 많은 유닉스들에 문제가 있어왔기 때문이다. 이값은 Unix에만 관련해있다. Windows에서 flush method는 항상 async_unbuffered 이며 바꿀수없다.
이variable의 다른 값들은 InnoDB performance에 두드러진 영향을 줄 수 있다.
                                                 
innodb_force_recovery The crash recovery mode. 경고: 이값은 0보다 커야한다. 깨진 DB에서 table을 dump하고싶을때 긴급한 상황일때만  가능한 숫자는  1 에서 6이다. 이 변수들의 뜻은 Section 14.5.8.1, “Forcing InnoDB Recovery”에 설명되어있다. 안전하게 측정한다,이노디비는 이 변수의 값이 0보다 클때 어떠한 데이타의 변화도 예방한다 0
innodb_lock_wait_timeout lock이 대기하는 시간 – 교착을 찾아내고 그 트랜젝션을 취소. 50
innodb_locks_unsafe_for_binlog 이 변수는 InnoDB search와 index scan의 next-key locking 을 제어한다.  default 0 (disabled) 은 next-key locking 이 가능한것을 의미한다.  OFF                                             
innodb_log_arch_dir  꽉찬 log들이 기록 보존되는 디렉토리                                                  
innodb_log_archive InnoDB archive file들이 로깅되는지 여부. 이값은 현재의 역사적인기록을 위한것이지만 사용하지 않는다. Mysql이 사용하는 그것이 소유한 로그파일로 백업하였고 그것으로부터 회복한다. 그래서 이노디비 로그파일은 필요하지 않다. default는 0  OFF                                             
innodb_log_buffer_size 이 노디비가 디스크에 로그파일을 기록하기 위해 사용하는 버퍼의 크기. 값의 범위는 1MB 에서 8MB이다. default 1MB. 큰 로그버퍼는 트랜젝션이 commit되기전에 로그를 디스크에 기록할 필요없이 돌아가는 큰 트랜젝션을 허용한다. 그렇기때문에 큰 트랜젝션을 가졌다면 로그버퍼를 크게하여 디스크의 I/O를 줄여라. 1048576
innodb_log_file_size log file의 크기 5242880
innodb_log_files_in_group 로그 그룹의 로그파일의 수. InnoDB 는 환형으로 돌아가면서 로그를 작성한다.  default (권장)  2. 2
innodb_log_group_home_dir InnoDB log file의 디렉토리 경로. 만약 어떤 이노디비 로그변수도 열거하지 않았다면 default는 Mysql data 디렉토리에ib_logfile0 과 ib_logfile1라는두개의 5MB 짜리 파일을 만들것이다.  ./                                              
innodb_max_dirty_pages_pct 아직쓰지않은 page의 %가 값을 초과하지 않도록. 90
innodb_max_purge_lag  purge 오퍼레이션이 늦춰질 때 delay된 Insert,update, delete를 어떻게 제어하는가에 대한 variable  0
innodb_mirrored_log_groups database를 위해 유지하는 log의 동일한 복사본 1
innodb_open_files  이노디비에서 열려있는 파일의 수 300
innodb_support_xa  트렌젝션의 준비를 위해 여분의 디스크 플러시를 실행하는것 – 플러시수를 감소하여 좋은성능을 원하면 0  ON                                              
innodb_sync_spin_loops  thread가 중지되기 전에 이노디비 mutex에 의해 thread가 자유로워 질 때까지 기다린 횟수 20
innodb_table_locks table lock 수  ON                                              
innodb_thread_concurrency Innodb가 동시 사용가능한 최대 시스템 쓰래드의 수 –cpu8개 이상의 경우 높일수 있지만 낮추는 것이 성능에 도움이 될때도 있다. 8
innodb_thread_sleep_delay  thread가 queue에 들어오기 전에 sleep하며 기다린시간 10000
interactive_timeout  서버가 닫히기전 대화식연결 활동을위해 서버가 wait한시간 28800
join_buffer_size Index가 적용되지 않는 join의 테이블수가 늘어나면 join버퍼가 할당 131072
key_buffer_size index 블록을 위해 사용되는 buffer크기 402653184
key_cache_age_threshold  hot-chain으로부터 warm-chain으로 key cashe가 가는 것을 제어한다. 300
key_cache_block_size 키캐시의 블록사이즈 1024
key_cache_division_limit 키캐시 버퍼 체인에서 hot과 warm의 구분 포인트 100
language  언어  /home1/irteam/naver/mysql/share/mysql/english/  
large_files_support 큰 파일의 지원을 위한 mysqld의 컴파일 옵션  ON                                              
large_page_size 큰 페이지의 지원을 위한 크기 0
large_pages  큰 페이지의 지원 여부  OFF                                             
license GPL  GPL                                             
local_infile local에서 파일에 관한 구문을 지원하는지 여부  ON                                              
locked_in_memory mysqld가 memory에서 lock되는지 여부 --memlock  OFF                                             
log log 기록 여부 – general log  OFF                                             
log_bin binary log의 기록 여부  OFF                                             
log_bin_trust_function_creators 이 값은 binary log가 가능할때 제공된다. 안전하지 않은 이벤트로 바이너리 로그를 쓰는stored function creators를 제어한다. If set to 0 (the default), 사용자들은 SUPER 권한이나 CREATE ROUTINE or ALTER ROUTINE 권한을 가지고 있지 않은 한 create나 alter stored function을 허용하지 않는다. A setting of 0은 또한 함수가 DETERMINISTIC이나 READS SQL DATA or NO SQL을 선언해야만 수행하도록 제한한다.set to 1, MySQL은 stored function creation에 대한 이런 제한들을 수행하지 않는다.  OFF                                             
log_error error log의 위치                                                  
log_slave_updates 마스터서버로부터 슬레이브 서버로 받은 updates는 슬레이브가 가지고있는 바이너리로그에 기록되어져야한다. 이 값이 어떤 효과를 가지기위해서 바이너리로깅은 슬레이브에서 가능해야 한다.   OFF                                             
log_slow_queries long query time 보다 긴 query  OFF                                             
log_warnings warning messages를 추가하여 생성.default 은 1,활성화  0은 비활성화.  이 값이 1보다 크면 Aborted connections은 에러로그에 기록되지않는다. 1
long_query_time  쿼리시간의 최대 길이 10
low_priority_updates update쿼리의 우선순위를 낮게 잡는다  OFF                                             
lower_case_file_system  이 변수는 파일시스템의 data directory에 위치한 파일 이름의 대소문자 구별을 설명한다. OFF 는 filename이 대소문자를 구별, ON 은 대소문자를 구별하지 않는다.  OFF                                             
lower_case_table_names table의 대소문자 구별유무,  If set to 1, table name이 소문자로 저장된다. 대소문자구별 안함. If set to 2, table name이 대소문자를 구별하여 저장된다. 이옵션은 데이터베이스와 테이블까지 적용된다. 참조 9.2.2, “Identifier Case Sensitivity”.

만약 InnoDB table을 사용한다면 , 모든 플렛폼이 소문자로 강제로 바꾸도록  이 값을 1로 지정하여야한다.

파 일 이름의 대소문자 구분을 하지 않는 시스템에서 MySQL이 동작하고있을때 이 값을 0으로 지정하면 안된다. (such as Windows or Mac OS X).만약 startup할떄 이값을 setting하지 않았고 파일시스템이 대소문자 구분을 하지 않는 data drectory에 위치하였다면 , MySQL은 자동적으로 이 값을 2로 세팅한다. 
0
max_allowed_packet 최대 전송가능 패킷의 크기설정 1047552
max_binlog_cache_size 4G가 기본이고 트랜젝션이 이보다 큰경우 모두 rollback 1.84467E+19
max_binlog_size 만 약 바이너리로그의 작성이 최근 바이너리 로그의 파일 크기가 이 옵션의 값을 넘치게 할때 서버는 바이너리로그를 전환시킨다.(최근의 파일을 닫고 다음것을 open한다). 이값은 1GB를 넘지 못하고 4096 bytes 이상 이어야 한다. default 1GB.
한트랜젝션이 한개의 큰 덩어리로 로그에 쓰여지려 할 때, 몇몇개의 바리어리 로그들로 쪼개지지않는다. 그러므로, 하나의 큰 트렌젝션이 있다면 max_binlog_size보다 로그의 크기가 큰지 확인해야한다.
1073741824
max_connect_errors 문제를 발생시키는 client를 몇번 재시도 후 블록할지 하고 한번 블록 되면 서버 재시작이나 flush host하기 전까지 접속 할 수 없다.  10
max_connections 허용 가능한 최대 동시접속 수 - 각각의 커넥션은 최소 thread stack의 사이즈 만큼 메로리를 사용한다. 100
max_delayed_threads 최대 delay된 쓰래드의 수 20
max_error_count SHOW ERRORS and SHOW WARNINGS 구문으로 보여지는 에러,경고,메세지의 최대 수. 64
max_heap_table_size  MEMORY table의 최대 허용크기. 이값은 메모리테이블의 MAX_ROWS값을 계산할 때 사용된다. 이값을 셋팅하면 CREATE TABLE이나 ALTER TABLE or TRUNCATE TABLE로 테이블을 다시만들지 않는 한, 현존하는 어떠한 메모리 테이블에도 효과를 주지 않는다.. 16777216
max_insert_delayed_threads  max_delayed_threads와 동의어. 20
max_join_size join에서 사용될 최대 크기 1.84467E+19
max_length_for_sort_data 어떤 파일 정렬 알고리즘을 사용할것인지 결정하는 인덱스값의 크기를 제한. 1024
max_relay_log_size relay log크기 0
max_seeks_for_key key에 기초한row를 찾는 최대 횟수 1.84467E+19
max_sort_length  TEXT,BLOB의 정렬에 사용되는 최대크기 1024
max_sp_recursion_depth 저장과정에서 스스로를 호출하는 횟수 0
max_tmp_tables 한 client가 동시에 열수있는 임시테이블의 최대 수 (This option does not yet do anything) 32
max_user_connections  최대 동시 접속자 수 0
max_write_lock_count  write lock의 갯수가 이 값을 넘으면 pending된 read lock requests가 처리 되도록 허용한다. 1.84467E+19
multi_range_count   256
myisam_data_pointer_size create tables시 maxrow가 정의되지 않았을경우 default값 6
myisam_max_sort_file_size  repair,alter load등 index재생성시 사용되는 임시파일크기 9.22337E+18
myisam_recover_options 복구옵션   OFF                                             
myisam_repair_threads repair_threads 1
myisam_sort_buffer_size REPAIR, INDEX, ALTER 정렬에 사용되는 메모리 67108864
myisam_stats_method 상태 메쏘드  nulls_unequal                                   
net_buffer_length  mysql이 client에 보내는 초기 메시지의 바이트수 – 설정 값보다 클경우 max_allowed_pocket만큼 커진 후 다시 작아진다. 16384
net_read_timeout  client의 network를 통한 읽기 시간 조절(초)  30
net_retry_count client와 통신 오류시 재시도 횟수 10
net_write_timeout client의 network 60
new 이값은  MySQL 4.0 에서 4.1 로 바뀌면서몇가지 행동양식들이 양립성을 갖게 하기 위해 있는 옵션이다. In MySQL 5.0, its value is always OFF  OFF                                             
old_passwords  MySQL 4.1이전의 사용자 계정에서 사용하던 passwords 스타일  OFF                                             
open_files_limit  운영체제가 허용하는 mysqld로 열수있는 파일의 수 . 이것은 시스템에서 허용하는 실제값이다 mysqld 나mysqld_safe의 옵션인 --open-files-limit 를 사용하여 주는 값과 아마도 다를것이다.  0 은 시스템에서 MySQL open files의 수를 변화시킬 수 없다. 1134
optimizer_prune_level 쿼리  동안 optimizer가 찾는 공간 으로부터 장래성없는 부분적 계획을 제거하기 위한 최적화를 발견하도록 하는 컨트롤이다. 0 disables optimizer는 철저한 검색을 수행한다. 1 optimizer가  제거하기 위해 계획 레코드의 숫자에 기초한 retrieved by 즉시 계획으로부터 되찾는다. 1
optimizer_search_depth query optimizer 에 의한 찾기 실행의 최대 깊이. 값을 크게하면 쿼리결과의 릴레이션수가 쿼리 계획보다 좋다. 그러나 쿼리를 위한 계획을 실행하는데 더 오래 걸린다. 값을 작게하면 쿼리가 계획 실행이 더 빠르지만 계획 결과는 최적화에서 거리가 멀다. 0, 시스템이 자동적으로 논리적인 값을 골라잡는다.만약 쿼리가 사용하는 테이블의 최대치를 사용한다면 2를 더한다, the optimizer가 MySQL 5.0.0에서 사용하는 search실행 algorithm 을 바꾼다. This variable was added in MySQL 5.0.1. 62
pid_file process ID (PID) file의 path경로. --pid-file option으로 setting할수있다.  /home1/irteam/naver/mysql/var/a51474.pid        
port 포트 3306
preload_buffer_size index를 미리 적재할때 할당되는 버퍼 사이즈  32768
protocol_version MySQL server가 사용하는 client/server protocol version 10
query_alloc_block_size 구문이 파싱,실행되는 동안 생성된 오브젝트가 위치하게되는 메모리 블록의 할당 크기. memory 단편화에 문제가 있다면 이 값을 늘려주는것이 도움이 될것이다. 8192
query_cache_limit 이 값의 byte수보다 큰 결과는 캐쉬하지 않는다. The default value is 1MB. 1048576
query_cache_min_res_unit  쿼리 캐시에 의해 할당되는 블록의 최소크기(byte). 4096
query_cache_size 쿼리 결과 캐싱을 위해 할당되는 메모리 양.default 0, query cache사용 안함.허용하는 값은 multiples of 1024; 다른 값은  multiple크기 이하이다. 만약 query_cache_type 이 0이라도 할당되는 메모리의 byte는 query_cache_size 이다. 33554432
query_cache_type query cache type설정. connect 이후에 모든 클라이언트의 타입을 바꾸기위해 GLOBAL 값을 설정한다.개인적인 클라이언트는 그들의 고유한 쿼리케쉬를 사용하기 위해서 SESSION값을 설정한다.

Option Description
0 or OFF : 쿼리 캐시로부터 결과를 되찾거나 결과를 캐시에 넣지 않는다. 쿼리캐시버퍼에 할당하지 않는다. query_cache_size를 0 으로 할당해주어야만 한다.
1 or ON  :  SELECT SQL_NO_CACHE로 시작하는 모든 쿼리결과를 수용한다.
2 or DEMAND :  SELECT SQL_CACHE 로시작하는 쿼리만 캐시한다. 
 ON                                              
query_cache_wlock_invalidate 정상적으로 한 클라이언트가 MyISAM테이블에 Write lock우선권을 얻을때 쿼리캐시에 그 쿼리결과가 존재할때 다른 클라이언트는 그 테이블로부터 읽은 이슈가되는 구문으로 부터 블록되지않는다.  1로 세팅하면 , table에 Writelock을 습득은 테이블을 조회하는 쿼리캐시안의 어떤쿼리들을 무효화한다. 이것은 강제적으로 테이블에 접근을시도하는 다른 클라이언트를 락이 효과를 발휘하는동안 기다리도록한다.    OFF                                             
query_prealloc_size 구 문의 파싱과 실행을위해 사용되는 변하지않는 버퍼의 사이즈. 이 버퍼는 구문들사이에서 벗어나지 않는다. 만약 복잡한 쿼리를 구동한다면 더 큰 query_prealloc_size 값이 퍼포먼스를 개선하는 데 도움이 될것이다. 왜냐하면 그것은 서버가 쿼리를 실행하는 작업을 하는동안 필요한 메모리 할당을 줄여주기 때문이다. 8192
range_alloc_block_size 범위지정 최적화를 하는동안 할당되는 블록의 사이즈  2048
read_buffer_size table scan의 성능을 높이고 Disk access를 줄여준다. 2093056
read_only 복 제 슬레이브 서버를 위해 값을 ON으로 할때 , 슬레이브는 슬레이브 쓰레드나 SUPER권한을가진 사용자로부터의 업데이트를 제외한 업데이트는 허용하지 않느다. 이것은 클라이언트로부터가 아닌 마스터서버로부터의 업데이트만을 받아들이는것을 보장한다. As of MySQL 5.0.16, this variable does not apply to TEMPORARY tables  OFF                                             
read_rnd_buffer_size sort_buffer에서 정렬한 수 실제 결과값을 처리 8384512
relay_log_purge 더이상 필요하지 않은 로그파일을 자동으로 퍼지. The default value is 1 (ON).   ON                                              
relay_log_space_limit   0
rpl_recovery_rank 사용하지 않는 variable 0
secure_auth 이 옵션을 주고 시작한 서버는 이전버전에 패스워드가저장되어있는 사용자들의 연결요청을 블록한다.  OFF                                             
server_id 서버의 ID 474
skip_external_locking mysqld가 외부locking을 사용한다면 OFF , ON 은 사용 안함.  ON                                              
skip_networking  TCP/IP연결 여부  OFF                                             
skip_show_database SHOW DATABASES권한이 없지만 SHOW DATABASES구문을 사용하는 사람들을 막는다. 한 사용자가 다른 사용자에게 속해있는 데이터베이스를 보는 것에 관련하여 보안성을 개선 할 수가 있다. 그것은 SHOW DATABASES권한에 의존하는 효과이다 : 이 값이 ON이면, the SHOW DATABASES권한을 가진 사용자만이 SHOW DATABASES구문을 수행할수 있다, 그리고 모든 데이터베이스 이름이 보여진다.이 값을 OFF로 한다면, SHOW DATABASES는 모든 사용자에게 허용될것이다, 그러나  SHOW DATABASES나 다른 권한을 가진 사용자들은 오직 그들의 데이터베이스의 이름만 보여진다.  OFF                                             
slave_compressed_protocol slave/master protocol에 압축을 사용하는지 하지 않는지 여부. slave와 master가 모두 압축을 지원해야한다.  OFF                                             
slave_load_tmpdir LOAD DATA INFILE구문의 복제를 위해 슬레이브가 생성하는 임시파일의 디렉토리 이름.  /tmp/                                           
slave_net_timeout 읽기가 중단되기전 마스터/슬레이브의 연결로부터 데이타를 위해 기다리는 초의 숫자. 이 타임아웃은 TCP/IP 연결만 적용된다. 소켓이나 파이프,공유메모리에는 적용되지 않는다. 3600
slave_skip_errors 슬레이브가 skip해야만 하는 리플리케이션 에러들.  OFF                                             
slave_transaction_retries  만 약 복제 슬레이브의 SQL thread가 InnoDB deadlock 이나 exceeded InnoDB의 innodb_lock_wait_timeout 이나 NDBCluster의 TransactionDeadlockDetectionTimeout, TransactionInactiveTimeout등에 의한 트랜젝션 실행 실패를 에러와함께 stop되기 전에 자동적으로 재시도. The default MySQL 4.0.3 is 0. retry가 가능하게 하려면 반드시 0보다 크게 설정해야한다. . In MySQL 5.0.3 or newer, the default is 10. 10
slow_launch_time 만약 thread의 생성 시간이 이 값보다 더 오래걸린다면 , 서버는 status variable값의 Slow_launch_threads를 증가시킨다. 2
socket Unix용,로컬 클라이언트가 연결하기위해 사용되는 소켓파일의 이름 The default is /tmp/mysql.sock. (포맷에 따라 directory가 다르다, such as /var/lib/mysql for RPMs.)

 Windows에서는 , 로컬 클라이언트가 연결을 위해 named pipe를 사용한다. The default value is MySQL (not case sensitive).
 /home1/irteam/naver/mysql/tmp/mysql.sock        
sort_buffer_size sort_merge_pass와 관련 - sort_buffer에서 데이터를 정렬. ORDER BY or GROUP BY 작업이 더 빨라진다. 2097144
sql_mode 다이나믹한 현재의 서버 SQL모드  
sql_notes    ON                                              
sql_warnings    OFF                                             
storage_engine  스토리지 엔진 타입  MyISAM                                          
sync_binlog 이 variable의 값이 양수이면, Mysql 서버는 fdatasync()를 사용하여 모든 sync_binlog를 바이너리 로그에 기록한 후에 바이너리 로그를 디스크로 동기화한다.  만약 자동commit이 가능하다면 구문마다 바이너리 로그를 기록하고 그렇지않으면 트랜젝션마다 한번 기록한다. The default value is 0, 디스크로 동기화하지 않는다.  1은  가 장 안전한 선택이다. 왜냐하면 crash가일어나면 바이너리 로그로부터 대체로 한 구문이나 트랜젝션을 잃어버린다. 그러나, 또한 가장 느린 선택이다. ( 디스크가 굉장히 빠른 동기화를 만들어내는 battery-backed cache를 가지고있지않는한)   0
sync_frm 이 값이 1이면 , 임시파일이 아니라면 fdatasync()함수를 사용하여 DISK로 동기화되는 .frm파일이 만들어진다. 이것은 느리지만 crash에 안전하다. The default is 1  ON                                              
sync_replication 0  
sync_replication_slave_id 0  
sync_replication_timeout 10  
system_time_zone The server system time zone. 서버가 실행될때, machine의 default를 상속하여 time zone을 세팅한다.  아마도 서버의 구동이나 구동 스크립트를위해 사용되는 계정의 환경으로 수정되었을 것이다.  그 값은 system_time_zone을 세팅하는데 사용된다. 일반적으로 the time zone은 TZ환경변수에 의해 열거된다. 또한 mysqld_safe script 옵션인 --timezone으로도 열거된다.

The system_time_zone 값은 time_zone값과 다르다. 비록 값이 같더라도, 마지막엔 클라이언트가 연결될때마다 time zone이 초기화하는데 변수가 사용될것이다.
 
table_cache  기본64, 사용하는 테이블에 대한 핸들러를 캐시에 저장 – Opend_tables가 높은 경우 table_cash를 높여준다. -mysqld가 필요로 하는 file descriptor 증가. 512
table_lock_wait_timeout table-level lock을 위한 wait timeout을 열거한다, 둘째. default timeout 은 50초이다.  timeout은 계산자를 열은 연결에게만 작동한다. 이변수는 또한 실행중 global로 setting할 수있다. (you need the SUPER privilege to do this).  50
table_type storage_engine과 동의어 . In MySQL 5.0, storage_engine이 우선적인 이름이다.  MyISAM                                          
thread_cache_size 재사용을 위해 보관할 쓰래드의 크기 - thread create가 높을경우 증가시킴.client가 connection full을 사용할경우 효과없음. 8
thread_stack 각 thread의 스택 크기.  값에 의존하는 test는 충돌에 의해 많은 제한이 발견되었다. 일반적인 작업을 하기에 default는 충분히 크다. 262144
time_format  시간 형식  %H:%i:%s                                        
time_zone  현재mysql 서버의 time zone   SYSTEM                                          
timed_mutexes  이 변수는  InnoDB mutexes 의 시간이 정해지는것을 통제한다. 만약 이변수의 값이  0이거나 OFF 이라면(the default), mutex timing is disabled. 만약 이 변수의 값이  1 이거나  ON이면 ,B190 운영체제가 기다리는 시간의 양을 가리키는 SHOW ENGINE INNODB MUTEX의 결과물의 값 os_wait_times와 함께 mutex timing 이 가능하다. 아니라면, the value is 0  OFF                                             
tmp_table_size disk I/O의 과도한 발생을 방지한다. 33554432
tmpdir 임시 디렉토리  /tmp/ 
transaction_alloc_block_size 필요한 메모리의 트랜젝션당 증가하는 메모리 풀의 바이트 양. See the description of transaction_prealloc_size. 8192
transaction_prealloc_size 각종 트랜젝션과 관련된 할당이 가져가는 메모리로부터 트랜젝션당 메로리풀. 최초의 pool의 크기는 transaction_prealloc_size이다. 메모리 부족으로 pool로 부터 만족하지 못하는 모든 할당을 위해, pool 은  transaction_alloc_block_size 로 증가된다. 트렌젝션이 끝났을때, pool 은 transaction_prealloc_size bytes로 잘려진다. transaction_prealloc_size을 만드는것은 한 트랜젝션의 모든 구문을 담기에 충분히 크기 때문에 많은 malloc() calls를 피할수있다. . 4096
tx_isolation The default transaction isolation level. Defaults to REPEATABLE-READ.
이 값은 SET TRANSACTION ISOLATION LEVEL구문으로 set 되어있다. 만약 isolation level 에 tx_isolation 을 직접 setting하고 싶다면 이름은 공간을 포함하여야 하고, 이름은 quotes로 묶여있어야한다, 공간은 dash로 재배치 되어야 한다.
SET tx_isolation = 'READ-COMMITTED';
 REPEATABLE-READ
updatable_views_with_limit 이 variable은  기 본테이블에 정의된 뷰가 프라이머리키의 모든 컬럼을 포함하고있지 않을때 만들수있는 뷰를 업데이트 하는것을 제어한다.만약 update구문이 LIMIT 절을 포함한다면 (Such updates often are generated by GUI tools.) update는 UPDATE or DELETE 구문이고. 여기서 Primary key 의 의미는 PRIMARY KEY,나 UNIQUE는  NULL을 포함하지 않는  index이다.

1 or YES: 에러 메세지가 아닌 경고만 발행. default
0 or NO: update 금지 
 YES
version 현재 Mysql서버 버전  5.0.27
version_comment MySQL설치시 열거했던 --with-comment option에서 허용하는 설정 스크립트  Source distribution
version_compile_machine MySQL 이 깔린 기계나 건축의 타입(i686)  x86_64
version_compile_os MySQL 이 깔린 OS  unknown-linux-gnu
wait_timeout  서버와 클라이언트의 커넥션 타임아웃시간 (초) 28800

linux 날짜 type

tip 2008. 12. 8. 14:22 Posted by 민수

Syntax to specify format
date +FORMAT

Task: Display date in mm-dd-yy format

Type the command as follows:
$ date +"%m-%d-%y"
Output:

02-27-07

Turn on 4 digit year display:
$ date +"%m-%d-%Y"
Just display date as mm/dd/yy format:
$ date +"%D"

Task: Display time only

Type the command as follows:
$ date +"%T"
Output:

19:55:04

Display locale’s 12-hour clock time
$ date +"%r"
Output:

07:56:05 PM

Display time in HH:MM format:
$ date +"%H-%M"

How do I save time/date format to a variable?

Simply type command as follows at a shell prompt:
$ NOW=$(date +"%m-%d-%Y")
To display a variable use echo / printf command:
$ echo $NOW
Sample shell script:

#!/bin/bash
NOW=$(date +"%m-%d-%Y")
FILE="backup.$NOW.tar.gz"
# rest of script

Complete list of FORMAT control characters supported by date command

FORMAT controls the output.It can be the combination of any one of the following:


%%

a literal %
%a

locale's abbreviated weekday name (e.g., Sun)
%A

locale's full weekday name (e.g., Sunday)

%b

locale's abbreviated month name (e.g., Jan)
%B

locale's full month name (e.g., January)
%c

locale's date and time (e.g., Thu Mar 3 23:05:25 2005)
%C

century; like %Y, except omit last two digits (e.g., 21)
%d

day of month (e.g, 01)
%D

date; same as %m/%d/%y

%e

day of month, space padded; same as %_d
%F

full date; same as %Y-%m-%d
%g

last two digits of year of ISO week number (see %G)
%G

year of ISO week number (see %V); normally useful only with %V
%h

same as %b
%H

hour (00..23)

%I

hour (01..12)
%j

day of year (001..366)
%k

hour ( 0..23)
%l

hour ( 1..12)
%m

month (01..12)
%M

minute (00..59)

%n

a newline
%N

nanoseconds (000000000..999999999)
%p

locale's equivalent of either AM or PM; blank if not known
%P

like %p, but lower case
%r

locale's 12-hour clock time (e.g., 11:11:04 PM)
%R

24-hour hour and minute; same as %H:%M

%s

seconds since 1970-01-01 00:00:00 UTC
%S

second (00..60)
%t

a tab
%T

time; same as %H:%M:%S
%u

day of week (1..7); 1 is Monday
%U

week number of year, with Sunday as first day of week (00..53)

%V

ISO week number, with Monday as first day of week (01..53)
%w

day of week (0..6); 0 is Sunday
%W

week number of year, with Monday as first day of week (00..53)
%x

locale's date representation (e.g., 12/31/99)
%X

locale's time representation (e.g., 23:13:48)
%y

last two digits of year (00..99)

%Y

year
%z

+hhmm numeric timezone (e.g., -0400)
%:z

+hh:mm numeric timezone (e.g., -04:00)
%::z

+hh:mm:ss numeric time zone (e.g., -04:00:00)

%:::z

numeric time zone with : to necessary precision (e.g., -04, +05:30)
%Z

alphabetic time zone abbreviation (e.g., EDT)

shell tip

카테고리 없음 2008. 8. 15. 02:26 Posted by 민수
펌 기억이 ~~
#!/bin/sh
echo "This Script Executable File : $0"
echo "Process ID: $$"
 
a=1
 
while [ $a -ne 50 ]
do
        echo "-------Test $a------------"
        insmod ../exe/emc_drv.ko
        sleep 5
        rmmod emc_drv.ko
        sleep 5
 
        a=$(($a+1))
done

위 코드는 변수 a가 50이 될 때까지 (즉, 반복 테스트를 50번 하는 것) emc_drv.ko
드라이버를 올렸다가 내리는 것을 반복 테스트 하는 것이다. 중간에 sleep을 통해서 5초
간 쉴 수 있다.


간단한 예제이지만 여기서 중요한 주의사항을 소개한다.
1. a=1와 같이 assignment문장에서는 중간에 빈칸을 두어서는 안된다. 즉,
a = 1 식으로 하면 에러나온다. (-.-)
2. 'while [ $a'에서는 '['앞뒤를 띄워 줘야 한다. 즉,
'while [$a'은 자꾸 a가 뭐냐고 물어본다. -.-
3. 당연한 마지막 팁은 변수 값을 참조하려면 반드시 $를 붙여야 하지만, 값을 넣을
때는 변수만 쓰면 된다. 즉,
a=$(($a+1))



---------------------------------------------------------------------














쉘 프로그래밍 강좌


참고서적 : 초보자용 리눅스 프로그래밍 ( 대림출판사, 한동훈,이만용역, NEIL MATTHEW, RICHARD STONES 저 ) ※ 넷츠고 리눅스 동호회 7월 제 5회 정기 공개강좌 자료 글쓴이 : 위경섭 ( powerhack@netsgo.com ) 1. 변수 . 쉘변수는 처음 사용될때 만들어진다. 즉 미리 선언할 필요가 없다. . 쉘변수는 유닉스 명령과 마찬가지로 대소문자에 구별이 있다. . 쉘변수는 기본적으로 데이터를 문자열로 저장한다. 수치를 대입해도 실제 수치 가 아닌 문자열이 저장된다. 계산이 필요할 경우는 자동으로 수치로 변환하여 계산후 다시 문자열로저장된다. . 쉘변수의 값을 사용할 때는 변수명앞에 "$" 를 붙여서 사용한다. . 쉘변수에 값을 대입할때는 "$"를 사용하지 않는다. . 쉘변수는 타입이 없다. 즉 아무 값이나 다 넣을 수 있다. 1.1 환경변수 쉘을 기동하고나면 기본적으로 셋팅되어있는 변수들이다. 유닉스/리눅스에는 많은 환경변수들이 있고 필요한경우 이 변수들을 마치 일반변수처럼 값을 얻어오거나 셋 팅할 수 있다. 여기서는 쉘과 직접적인 관련이 있는것만 설명한다. $0 - 실행된 쉘 스크립트 이름 $# - 스크립트에 넘겨진 인자의 갯수 $$ - 쉘 스크립트의 프로세스 ID 1.2 인자 변수 쉘스크립트에 인자를 넘겨줄때 그 인자들에 대한 정보를 가지고 있는 변수들. $1~ $nnn : 넘겨진 인자들 $* : 스크립트에 전달된 인자들을 모아놓은 문자열. 하나의 변수에 저장되며 IFS 환경변수의 첫번째 문자로 구분된다. $@ : $*과 같다. 다만 구분자가 IFS변수의 영향을 받지 않는다. 1.3 일반변수 일반변수에 특별한 제약은 없다. 단 대소문자 구분만 정확하게 해주면 된다. 예제 ) #!/bin/sh echo "This Script Executable File : $0" echo "Argument Count : $#" echo "Process ID : $$" echo "Argument List \$* : $*" echo "Argument List \$@ : $@" echo "Argument 1 : $1" echo "Argument 2 : $2" echo "Argument 3 : $3" echo "Argument 4 : $4" 실행 ) $chmod 755 test1 $./test1 a1 a2 a3 a4 This Script Executable File : ./test1 Argument Count : 4 Process ID : 905 Argument List $* : a1 a2 a3 a4 Argument List $@ : a1 a2 a3 a4 Argument 1 : a1 Argument 2 : a2 Argument 3 : a3 Argument 4 : a4 1.4 연산 변수의 산술연산은 생각하는것 처럼 쉽지않다. 위에서 언급했듯이 변수에는 모든것 이 문자열로 저장되기 때문에 연산이 불가능하다. 연산을 위해서는 좀 복잡한 절차 를 거쳐야 한다. 변수 = $((산술식)) 이것이 가장 단순한 연산 규칙이다. 산술식내에는 변수( $1, $a 와 같은 ) 도 들어 갈 수 있다. 산술식 내에 숫자가 아닌 문자열, 또는 문자열이 담겨있는 변수가 들어 가면 그것들은 계산에서 제외된다. (정확히 말하면 0 으로 간주되어 연산이 이루어 지지 않는다.) 1.5 매개변수 확장 매개변수 확장이란 변수의 값을 문자열등으로 대체하는 것을 말한다. 단순한 대체뿐 아니라 변수내의 문자열을 조작하여 원하는 문자열만을 추출할 수도 있다. 형식 ${parm:-default} : parm이 존재하지 않으면 default로 대체된다. ${#parm} : parm의 길이를 참조한다.(가져온다) ${parm%word} : 끝에서부터 word와 일치하는 parm의 최소부분(첫번째 일치) 을 제거하고 나머지를 반환한다. ${parm%%word} : 끝에서부터 word와 일치하는 parm의 최대부분(마지막 일치) 을 제거하고 나머지를 반환한다. ${parm#word} : 처음부터 word와 맞는 parm의 최소부분(첫번째 일치)을 제거하 고 나머지 부분을 반환한다. ${parm##word} : 처음부터 word와 맞는 parm의 최대부분(마지막 일치)을 제거하 고 나머지를 반환한다. * word에는 와일드 카드를 사용할 수 있다. 예를 보자. 1 #!/bin/sh 2 3 p="/usr/X11R6/bin/startx" 4 5 unset p 6 a=${p:-"Variable p Not found"} 7 echo $a 8 9 p="/usr/X11R6/bin/startx" 10 a=${p:-"Variable parm Not found"} 11 echo $a 12 13 a=${#p} 14 echo $a 15 16 a=${p%/*} 17 echo $a 18 19 a=${p%%/*} 20 echo $a 21 22 a=${p#*/} 23 echo $a 24 25 a=${p##*/} 26 echo $a 27 위 스크립트의 결과는 다음과 같다. --------------------------------- Variable p Not found /usr/X11R6/bin/startx 21 /usr/X11R6/bin usr/X11R6/bin/startx startx ---------------------------------- 6행 : 변수 p 가 제거 되었으므로 "Variable p Not found" 가 a에 들어간다. 10행 : 변수 p 가 있으므로 그대로 a에 들어간다. 13행 : a에는 변수 p의 길이가 들어간다. 16행 : p 에서 가장 오른쪽의 "/"부터 끝까지 지우고 나머지를 a에 넣는다. 19행 : p 에서 가장 왼쪽의 "/" 부터 끝까지 지우고 나머지를 a에 넣는다. (아무것도 없다) 22행 : p 의 처음부터 가장왼쪽의 "/" 까지 지우고 나머지를 a에 넣는다. 25행 : p 의 처음부터 가장 오른쪽의 "/"까지 지우고 나머지를 a에 넣는다. 2. 조건 판단 쉘 스크립트에서 조건판단은 if 와 test 명령을 혼합하여 사용한다. 일반적인 예는 다음과 같다. if test -f test1 then ... fi -f 는 주어진 인자가 일반파일 일때 참이된다. test 명령은 [] 로 대체될 수 있다. if [ -f test1 ] then ... fi ----------------------------- if [ -f test1 ]; then ... fi 2.1 test 명령 test 명령의 조건은 다음과 같이 세 부류로 나누어진다. 문자열비교 [ string ] : string이 빈 문자열이 아니라면 참 [ string1 = string2 ] : 두 문자열이 같다면 참 [ string1 != string2 ] : 두 문자열이 다르면 참 [ -n string ] : 문자열이 null(빈 문자열) 이 아니라면 참 [ -z string ] : 문자열이 null(빈 문자열) 이라면 참 산술비교 [ expr1 -eq expr2 ] : 두 표현식 값이 같다면 참 ( EQual ) [ expr1 -ne expr2 ] : 두 표현식 갑이 같지 않다면 참 ( Not Equal ) [ expr1 -gt expr2 ] : expr1 > expr2 이면 참 ( Greater Then ) [ expr1 -ge expr2 ] : expr1 >= expr2 이면 참 ( Greater Equal ) [ expr1 -lt expr2 ] : expr1 < expr2 이면 참 ( Less Then ) [ expr1 -le expr2 ] : expr1 <= expr2 이면 참 ( Less Equal ) [ ! expr ] : expr 이 참이면 거짓, 거짓이면 참 [ expr1 -a expr2 ] : expr1 AND expr2 의 결과 ( 둘다 참이면 참 ) [ expr1 -o expr2 ] : expr1 OR expr2 의 결과 ( 둘중 하나만 참이면 참 ) 파일조건 [ -b FILE ] : FILE 이 블럭 디바이스 이면 참 [ -c FILE ] : FILE 이 문자 디바이스 이면 참. [ -d FILE ] : FILE 이 디렉토리이면 참 [ -e FILE ] : FILE 이 존재하면 참 [ -f FILE ] : FILE 이 존재하고 정규파일이면 참 [ -g FILE ] : FILE 이 set-group-id 파일이면 참 [ -h FILE ] : FILE 이 심볼릭 링크이면 참 [ -L FILE ] : FILE 이 심볼릭 링크이면 참 [ -k FILE ] : FILE 이 Sticky bit 가 셋팅되어 있으면 참 [ -p FILE ] : True if file is a named pipe. [ -r FILE ] : 현재 사용자가 읽을 수 있는 파일이면 참 [ -s FILE ] : 파일이 비어있지 않으면 참 [ -S FILE ] : 소켓 디바이스이면 참 [ -t FD ] : FD 가 열려진 터미널이면 참 [ -u FILE ] : FILE 이 set-user-id 파일이면 참 [ -w FILE ] : 현재 사용자가 쓸 수 있는 파일(writable file) 이면 참 [ -x FILE ] : 현재사용자가 실행할 수 있는 파일(Executable file) 이면 참 [ -O FILE ] : FILE 의 소유자가 현재 사용자이면 참 [ -G FILE ] : FILE 의 그룹이 현재 사용자의 그룹과 같으면 참 [ FILE1 -nt FILE2 ] : FILE1이 FILE2 보다 새로운 파일이면 ( 최근파일이면 ) 참 [ FILE1 -ot FILE2 ] : FILE1이 FILE2 보다 오래된 파일이면 참 [ FILE1 -ef FILE2 ] : FILE1 이 FILE2의 하드링크 파일이면 참 2.2 if 구문 if 문은 조건을 판단하여 주어진 문장을 수행한다. 1. 형식 1 ( 단일 if 문 ) 형식 : if [ 조건 ] then 문장1 문장2 fi 2. 형식 2 ( if~else 문 ) 형식 : if [ 조건 ] then 문장3 문장4 fi 3. 형식 3 ( if~elif 문 ) 형식 : if [ 조건 ] then 문장1 문장2 elif 문장3 문장4 else 문장5 문장6 fi 2.3 case 구문 ※ 패턴에는 * 문자, 즉 와일드카드를 사용할 수 있다. 형식 : case 변수 in 패턴 [ | 패턴 ] ... ) 문장 ;; 패턴 [ | 패턴 ] ... ) 문장 ;; .... * ) 문장 ;; easc 2.4 목록 여려명령을 실행할때 앞의 명령의 결과에 의해서 다음행동이 결정되어야 할 경우 가 있다. 이런경우에 AND나 OR조건을 사용해서 한번에 처리할 수 있다. 이것은 쉘 스크립트 뿐 아니라 명령행에서도 사용 가능하다. 물론 if 문을 이용해서 반환값 을 검사하여 처리할 수 있지만 문장이 길어지고 복잡해진다. AND 목록 statment1 && statment2 && statmentN && ..... 위의 명령들은 각 명령이 거짓이 될 때 까지 명령을 수행해 나간다. 수행도중 결과가 거짓이 되면 그이후의 명령은 수행되지 않는다. OR 목록 statment1 || statment2 || statmentN || ..... 위의 명령들은 각 명령이 거짓이 나오는 동안 계속된다. 즉 참이 나오면 실행 을 멈춘다. AND와 OR목록은 혼용이 가능하다. [ 조건 ] && 문장1 || 문장2 위의 예는 조건이 참이면 문장1을 수행하고 거짓이면 문장2를 수행한다. 또한 위의 문장1이나 문장2에서 여러개의 문장을 수행 하고 싶을 때는 {}를 사용하면 된다. [조건] && { 문장1 문장2 문장3 } || { 문장4 문장5 문장6 } 3. 제어문 3.1 for for 문은 지정된 범위안에서 루프를 수행한다. 범위는 어떤 집합도 가능하다. 형식 : for 변수 in 값1, 값2, ... do 문장 done 매 루프를 돌때마다 변수의 값은 in 이후의 값으로 대체된다. 예) for str in "test1", "test2", "test3", "test4" do echo @str done 출력 ) test1 test2 test3 test4 값에는 와일드 카드 확장을 사용할 수 있다. for file in $(ls -a | grep "^.") do echo "$file is Hidden File" done 위 예의 출력 결과는 현재디렉토리에서 처음이 "." 으로시작하는 파일(히든파일) 만 을 출력한다. for file in $(ls chap[345].txt); do echo "--- $file ---" >> Books.txt cat $file >> Books.txt done 위의예는 chap3.txt, chap4.txt, chap5.txt 파일을 Books.txt 라는 파일에 붙여 넣 는다. 다음의 예를 보고 결과를 예측해보자 echo "\$* output" for fvar in $* do echo $fvar done echo "\$@ output" for fvar in $@ do echo $fvar done 3.2 while for 명령의 경우는 횟수를 지정해서 루프를 수행하는데는 문제가 있다. while 문은 실행횟수가 지정되지 않았을때 편리하다. 형식 : while 조건문 do 문장 done 예제를 보자. 패스워드를 입력받고 맞는지 확인하는 프로그램이다. echo "Enter Password : " read password1 echo "Retype Password : " read password2 while [ "$password1" != "$password2" ] do echo "Password miss match Try again " echo "Retype Password : " read password2 done echo "OK Password Match complete" 어떻게 동작하는가 ? 3.3 until until은 while문과 동일한 효과를 내지만 조건이 반대이다. 즉, while문은 조건이 참 일동안 루프를 수행하지만 until은 조건이 거짓일 동안 루프를 수행한다. 형식 : until 조건문 do 문장 done 다음 예를 보자. 이 예는 지정한 유저가 로그인 하면 알려준다. #!/bin/sh until who | grep "$1" > /dev/null do sleep 10 done echo "User $1 just logged in ^_^" 3.4 select select 문은 원하는 리스트를 출력하고 그중 선택된것을 돌려주는 구문이다. 주의 할점은 select의 루프내에서는 자동적으로 루프를 벗어날 수 없다. 반드시 break 문을 사용해서 루프를 벗어나야 한다. 예) 간단한 퀴즈 ^_^ #!/bin/sh echo "다음중 스크립트언어 프로그래밍에 속하는 것은 ?" select var in "쉘 프로그래밍" "C 프로그래밍" "자바 프로그래밍" "Exit" do if [ "$var" = "쉘 프로그래밍" ] then echo "정답입니다." exit 0 elif [ "$var" = "Exit" ] then echo "종료합니다." exit 1 else echo "$var 을 선택하셨습니다. 오답입니다." echo "다음중 스크립트언어 프로그래밍에 속하는 것은 ?" fi done 4. 함수 쉘 스크립트 내부에 또는 다른 스크립트파일에 함수를 정의해 놓고 사용할 수 있다. 함수를 사용하면 코드를 최적화 할 수 있고, 코딩이 간결해지며,재사용이 가능하다. 그러나 다른 스크립트 파일을 호출해서 함수를 실행할 경우, 가능은 하지만 스크립 트의 실행시간이 길어지고, 함수의 결과를 전달하는 것이 까다롭기 때문에 가급적이 면 외부파일의 함수는 안쓰는 것이 좋다. 형식 : 정의 - 함수명 () { 문장 return 값 } 사용 함수명 인자1, 인자2, ... 함수는 독립적으로 $#, $*, $0 등의 인자변수를 사용한다. 즉 함수내의 $#과 본체 의 $#은 다를 수 있다는 것이다. 다음의 예를 보자 #!/bin/sh func() { echo ------ this is func -------- echo "This Script Executable File : $0" echo "Argument Count : $#" echo "Process ID : $$" echo "Argument List \$* : $*" echo "Argument List \$@ : $@" echo "Argument 1 : $1" echo "Argument 2 : $2" echo "Argument 3 : $3" } echo ------ this is main -------- echo "This Script Executable File : $0" echo "Argument Count : $#" echo "Process ID : $$" echo "Argument List \$* : $*" echo "Argument List \$@ : $@" echo "Argument 1 : $1" echo "Argument 2 : $2" echo "Argument 3 : $3" echo "Argument 4 : $4" func aa bb cc 본체와 함수에서 동일한 변수를 보여주지만 값은 틀린다는것을 알 수 있다. 함수에서 값을 반환하기 - 함수에서 반환값은 반드시 정수값만을 반환할 수 있다. 이 값을 if등으로 조건을 판단해서 사용할 수 있다. 반환값중 0은 참으로 나머지 숫자는 거짓으로 판별된다. 5. 명령어 쉘에서 쓸 수 있는 명령어는 두가지로 나누어진다. 명프롬프트 상에서 실행 시킬 수 있는 외부 명령어와 쉘 내부 명령이다. 내부명령은 보통 쉘 내부나 쉘 구문상에서 쓰인다. 외부명령은 쉘에 관계없이 사용이 가능하다. break 제어문이나 조건문의 루프를 빠져나갈때 사용한다. 예) while [ $a -eq 10 ] do if [ $a -eq 5 ]; then break fi done :명령 의미없는 명령. 논리값 true를 대신해 쓰기도 한다. continue 제어문이나 조건문의 처음으로 돌아가서 다시수행한다. 예) while [ $a -eq 10 ] do if [ $a -eq 5 ]; then continue fi done . 명령 . 명령을 사용하면 현재 쉘에서 명령을 실행시킨다 그러므로 실행된 명령의 결과 를 본 프로그램에서 사용할 수 있다. 예를 들면 A 라는 스크립트에서 B라는 스크립트를 그냥 실행할 경우 B에서의 변화 (환경변수 등)는 A에게 아무런 영향도 미치지 않는다. 그러나 . 명령을 사용해서 실행하면 B에서의 변화가 A에도 영향을 미친다. echo 문장을 출력한다. 자동으로 개행문자가 삽입된다. ( 다음줄로 넘어간다 ) eval 인자의 실제 값을 구하는데 사용한다. foo=10 x=foo y='$'$x echo $y 이 예를 실행해 보면 $foo가 출력된다 foo=10 x=foo eval y='$'$x echo $y 이 예에서는 $foo의 값 즉 10 이 출력된다. eval명령은 원하는 문자열들을 조합해 서 변수를 액세스 할 수 있다. exec 현재쉘을 다른 프로그램으로 대체한다. 예 ) exec csh exit n 현재 쉘을 종료한다. 종료시 n 값을 리턴한다. export 해당 쉘에서 파생된 자식 프로세스에서 export한 환경변수는 본래 쉘에서 관리한 다. expr 표현식의 값을 구한다. ( x=`expr 1 + 2` ) 요즘은 expr보다는 $((계산식)) 구문을 많이 사용한다. printf C 언어의 printf명령과 흡사하다. 형식 : printf "Format String" arg1 arg2 arg3 ... return 쉘함수에서 값을 반환 할 때 쓰인다. 0은 성공을 1~125까지는 쉘 에러코드를 나타낸다. set 쉘 내부에서 매개 인자를 설정한다. set의 인자로 쓰인 문자열은 공백에 의해 $1 부터 차례대로 대입된다. 예) #!/bin/sh echo $# set $(ls) echo $# 결과는 0 22 이다..( 22는 필자의 ls 결과의 갯수이다. ). 첫번째 0는 이 스크립트에 인수가 없으므로 0이고 set $(ls) 에 의해서 인수의 갯수가 22개로 늘었다. shift 쉘의 인자를 한자리씩 아래로( n -> 1 로 ) 이동시킨다. 예) #!/bin/sh echo $1 shift echo $1 shift 5 echo $1 #./myscript 1 2 3 4 5 6 7 8 9 0 1 2 7 trap 쉘의 실행도중 시그널을 처리하는 시그널 처리기를 만드는 역할을 한다. 형식 : trap command signal 쉘 스크립트는 위에서 아래로 실행되므로 보호하려는 부분 이전에 trap명령을 사 용해야 한다. trap조건을 기본으로 사용하려면 명령에 - 를 넣으면 된다. 신호를 무시하려면 '' 빈 문자열을 준다. unset 변수나 함수를 제거한다. 6. 명령실행 외부명령의 실행 결과를 변수에 집어넣어 변수의 값으로 사용할 수 있다. 형식 : x = $(명령) 이렇게 변수에 결과를 넣은 후에는 이 변수를 일반문자열로 생각하고 원하는 가공을 해서 결과를 얻어낼 수 있다. 위에서 보았던 매개변수 확장이나 set명령을 이용해서 원하는 부분을 추출해 내면 그만이다. 7. 쉘 스크립트 내부에서 명령에 입력 전달하기 ( Here Documents ) 이 기능은 쉘 내부에서 명령어에 입력을 전달하는 방법이다. 전달된 입력은 마치 키 보드에서 눌려진 것 처럼 반응한다. 형식 : 명령 << 종료문자열 입력값..... 종료문자열 예제 ) 자동으로 메일을 보내는 스크립트 #!/bin/sh mail $1 << myscript This is Header This is Body . myscript
 

이클립스 web Module 변경

카테고리 없음 2008. 7. 14. 12:30 Posted by 민수
출처: http://dev.eclipse.org/newslists/news.eclipse.webtools/msg14297.html

What I'm doing for that is as below:
1. Open .project file for the project to be converted to web project.
2. Insert the following to natures element.
  <nature>org.eclipse.wst.common.project.facet.core.nature</nature>
  <nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
3. Open the properties for the project and go to the page for Project Facets
4. Add Java and Dynamic Web Module facets to the project.
5. Done.