리눅스 상에서 MySQL을 DBM으로 사용한다면 mysqlcheck를 사용해서 최적화 및 복구를 할 수 있다. 이것은 myisamchk와 비슷한데 myisamchk는 mysqld 데몬이 구동되지 않았을 때 사용할 수 있고, mysqlcheck는 mysqld 데몬이 구동되고 있을 때 사용한다는 점에서 다르다.

mysqlcheck는 콘솔 상에서 CHECK TABLE, REPAIR TABLE, ANALYZE TABLE, OPTIMIZE TABLE 명령을 실행시켜주므로 이를 스크립트로 만들어서 cron에 등록해 주기적으로 사용하면 좋을 것이다.

mysqlcheck의 사용법은 다음과 같다.

shell> mysqlcheck [options] db_name [tables]
shell> mysqlcheck [options] --databases db_name1 [db_name2 db_name3...]
shell> mysqlcheck [options] --all-databases

mysqlcheck의 유용한 옵션으로는 다음과 같은 것들이 있다.
  • --all-databases, -A
    모든 데이터베이스에 대해 검사한다.
  • --analyze, -a
    테이블을 분석한다.
  • --auto-repair
    테이블을 복구한다
  • --fast, -F
    테이블이 정상적으로 닫히지 않은 경우에 대해서만 검사한다.
  • --force, -f
    SQL 에러가 발생하더라도 계속 수행한다.
  • --optimize, -o
    테이블을 최적화시킨다.
  • --repair, -r
    테이블을 복구한다.
  • --silent, -s
    에러 메시지 외의 다른 메시지는 출력하지 않는다.
  • --host=host_name, -h host_name
    MySQL 서버가 구동하고 있는 호스트 이름을 지정한다.
  • --user=user_name, -u user_name
    MySQL 서버에 접속한 사용자 이름을 지정한다.
  • --password[=password], -p[password]
    MySQL 서버에 접속할 사용자의 암호를 지정한다.
  • --port=port_num, -P port_num
    MySQL 서버에 접속한 포트를 지정한다.

위의 옵션을 적절히 조합해서 mysqlcheck를 실행하면 된다. 일반적으로 mysqlcheck를 실행할 때는 아래와 같은 형태로 사용한다.

shell> mysqlcheck -Aao --auto-repair -u root -ppassword

이렇게 실행시키면 아래와 같은 결과를 볼 수 있다.

mooo.xe_action_forward                           Table is already up to date
mooo.xe_addons                                   Table is already up to date
mooo.xe_admin_shortcut                           Table is already up to date
mooo.xe_comment_declared                         Table is already up to date
mooo.xe_comment_declared_log                     Table is already up to date
mooo.xe_comment_voted_log                        Table is already up to date
mooo.xe_comments                                 OK
mooo.xe_comments_list                            OK
mooo.xe_counter_log                              OK
mooo.xe_counter_status                           OK
...

이제 주기적으로 검사해주기 위해 /etc/cron.d 에 등록해주도록 하자.

# /etc/cron.d/mysqlcheck

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
#MAILTO=root

45 4 * * *   root  /usr/bin/mysqlcheck -Aaos --auto-repair -u root -ppassword

# EOF

위 예에서는 매일 새벽 4시 45분에 myslqcheck를 실행하도록 했다. 이 시간은 적절히 수정하면 될 것이다.