DBMS 2

DA, SQL, DB보안 등 실무자를 위한 위한 DB기술 바이블!

mysqlaccess, mysqladmin, mysqlbinlog, mysqlcheck, mysqldump

DBMS 2
MySQL 가이드
클라이언트 및 유틸리티 프로그램
mysqlaccess, mysqladmin, mysqlbinlog, mysqlcheck, mysqldump
작성자
admin
작성일
2021-02-19 10:59
조회
1605

mysqlaccess - 접속 권한 검사를 위한 클라이언트

mysqlaccess는 Yves Carlier가 MySQL 용으로 제공한 진단 프로그램이다. 이것은 호스트 이름, 사용자 이름, 그리고 데이터 베이스 컴비네이션 (combination)에 대한 접속 권한을 체크한다. Mysqlaccess는 user, db, 그리고 host 테이블만을 사용해서 접속을 체크한다는 점을 알아두자. 이것은 tables_priv, columns_priv, 또는 procs_priv 테이블에서 지정이 된 테이블, 컬럼, 또는 루틴 권한 등은 체크를 하지 않는다.

mysqlaccess을 다음과 같이 호출한다:



shell> mysqlaccess [host_name [user_name [db_name]]] [options]

mysqlaccess은 아래의 옵션을 지원한다:


  • --help, -?
    도움말 메시지를 출력하고 종료.
  • --brief, -b
    싱글-라인 표 형식으로 레포트를 생성한다.
  • --commit
    임시 테이블에서 원본 그랜트 테이블로 새로운 접속 권한을 복사한다. 새로운 권한이 효력을 갖도록 하기 위해서는 그랜트 테이블을 플러시 해야 한다. (예를 들면, mysqladmin reload 명령어를 실행한다.)
  • --copy
    원본 그랜트 테이블에서 임시 테이블을 다시 로드한다.
  • --db=db_name, -d db_name
    데이터베이스 이름을 지정한다.
  • --debug=N
    디버그 레벨을 지정한다. N 은 0에서 3 사이의 정수가 된다.
  • --host=host_name, -h host_name
    접속 권한에서 사용되는 호스트 이름.
  • --howto
    mysqlaccess를 사용하는 방법에 대한 예문을 보여준다
  • --old_server
    서버가 마치 전체적으로 WHERE 구문을 처리하는 방법을 모르는 구형 MySQL 서버(3.21 이전 버전)인 것으로 추정한다.
  • --password[=password], -p[password]
    서버에 접속을 할 때 사용할 패스워드. 명령문에서 --password 또는 -p 옵션 다음에 password를 생략하면, 프롬프트가 나오게 된다.
  • --plan
    향후에 발표될 버전에 대한 아이디어를 보여 준다.
  • --preview
    임시 그랜트 테이블을 변경 시킬 경우의 권한 변경 내역을 미리 보여준다.
  • --relnotes
    릴리즈 노트를 보여준다.
  • --rhost=host_name, -H host_name
    주어진 호스트 상의 MySQL 서버와 접속한다.
  • --rollback
    임시 그랜트 테이블에서 일어난 가장 최근의 변경을 복원(Undo) 시킨다.
  • --spassword[=password], -P[password]
    슈퍼 유저로 서버에 접속을 할 때 사용하는 패스워드. 명령문에서 --password 또는 -p 옵션 다음에 password를 생략하면, 프롬프트가 나오게 된다.
  • --superuser=user_name, -U user_name
    슈퍼 유저로 접속을 하기 위한 사용자 이름을 지정한다.
  • --table, -t
    테이블 포맷으로 레포트를 생성한다.
  • --user=user_name, -u user_name
    접속 권한에 사용할 사용자 이름.
  • --version, -v
    버전 정보를 출력하고 종료.

사용하고 있는 MySQL 배포판이 표준 설치 위치가 아닌 곳에 설치되어 있다면, 반드시 mysqlaccess이 mysql 클라이언트를 찾고자 하는 위치를 변경 시켜야 한다. 대략 18번째 라인에 있는 mysqlaccess 스크립트를 다음과 같이 편집한다:



$MYSQL     = '/usr/local/bin/mysql';    # path to mysql executable

mysql이 실제로 저장되어 있는 위치를 반영할 수 있도록 경로를 변경한다. 이렇게 변경하지 않고 mysqlaccess을 구동시키게 되면, Broken pipe 에러가 발생한다.


mysqladmin - MySQL 서버 관리를 위한 클라이언트

mysqladmin은 관리 연산을 수행하는 클라이언트이다. 이것을 사용해서 서버의 구성 및 현재의 상태를 체크할 수 있고, 데이터 베이스를 생성 및 제거할 수 있다.

mysqladmin은 다음과 같이 호출한다:



shell> mysqladmin [options] command [command-arg] [command [command-arg]] ...

mysqladmin은 다음 명령어들을 지원한다. 다음의 명령어 중에는 명령어 뒤에 인수를 가지는 것들도 있다.


  • create db_name
    db_name라는 이름의 새로운 데이터 베이스를 생성한다.
  • debug
    서버로 하여금 디버그 정보를 에러 로그에 기록하도록 한다.
  • drop db_name
    db_name 라는 이름의 데이터베이스와 여기에 있는 모든 테이블을 제거한다.
  • extended-status
    서버 상태 변수 및 그 값을 보여준다.
  • flush-hosts
    호스트 캐시에 있는 모든 정보를 플러시한다.
  • flush-logs
    모든 로그를 플러시한다.
  • flush-privileges
    그랜트 테이블을 다시 읽어 온다 (reload 와 동일함).
  • flush-status
    상태 변수를 비운다 (Clear).
  • flush-tables
    모든 테이블을 플러시한다.
  • flush-threads
    쓰레드 캐시를 플러시한다.
  • kill id,id,...
    서버 쓰레드를 죽인다 (Kill). 여러 개의 쓰레드 ID 값을 줄 경우에는, 리스트 중간에 스페이스가 없어야 한다.
  • old-password new-password
    이것은 password 명령어와 유사하지만, 구형 (4.1 이전 버전) 패스워드 해싱 포맷을 사용해서 패스워드를 저장한다. (Section 5.8.9, “Password Hashing as of MySQL 4.1”을 참조.)
  • password new-password
    새로운 패스워드를 설정한다. 이것은 서버에 접속하기 위해 mysqladmin과 함께 사용하는 계정용 패스워드를 new-password 로 변경 시킨다. 따라서, 동일한 계정을 사용해서 mysqladmin (또는 다른 클라이언트 프로그램)을 호출하는 다음 시점부터는 이 새로운 패스워드를 사용해야 한다. new-password 값이 스페이스 또는 사용하는 명령어 해석기에서 특별하게 취급되는 다른 문자를 가지고 있는 경우에는, 인용 부호를 사용해서 이것들을 지정해 주어야 한다. 윈도우에서는, 이중 인용 부호를 사용해야 한다; 단일 인용 부호는 패스워드의 일부분으로 간주된다. 예를 들면:
    shell> mysqladmin password "my new password"
  • ping
    서버가 제대로 동작 중인지를 체크한다. 서버가 구동 중에 있다면, mysqladmin 는 0을 리턴하고, 그렇지 않다면 1을 리턴한다. mysqladmin 은 Access denied 일 경우에도 0을 리턴하는데, 서버가 접속을 거부하기는 했지만 구동 중이기 때문이며, 이것은 서버가 구동을 하지 않는 상황과는 다른 것이다.
  • processlist
    액티브 서버 쓰레드의 리스트를 보여준다. 이것은 SHOW PROCESSLIST 명령문의 결과와 유사한 내용을 출력한다. 만일 --verbose 옵션을 주게 되면, 그 결과는 SHOW FULL PROCESSLIST와 비슷하게 나온다. (Section 13.5.4.19, “SHOW PROCESSLIST 신텍스”를 참조.)
  • reload
    그랜트 테이블을 다시 읽어 온다.
  • refresh
    모든 테이블을 플러시한 다음에 닫고 로그 파일을 연다.
  • shutdown
    서버를 종료 시킨다.
  • start-slave
    슬레이브 서버 상에서 리플리케이션을 시작한다.
  • status
    서버 상태 메시지를 짧게 보여준다.
  • stop-slave
    슬레이브 서버에서 리플리케이션을 종료 한다.
  • variables
    서버 시스템 변수 및 그 값을 보여 준다.
  • version
    서버로부터 버전 정보를 보여준다.

모든 명령어는 각각의 고유 접두사를 사용해서 축약할 수가 있다. 예를 들면:



shell> mysqladmin proc stat
+----+-------+-----------+----+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-------+-----------+----+---------+------+-------+------------------+
| 51 | monty | localhost | | Query | 0 | | show processlist |
+----+-------+-----------+----+---------+------+-------+------------------+
Uptime: 1473624 Threads: 1 Questions: 39487
Slow queries: 0 Opens: 541 Flush tables: 1
Open tables: 19 Queries per second avg: 0.0268


mysqladmin status 명령어 결과는 아래의 값을 표시한다:


  • Uptime MySQL 서버가 구동을 한 시간(초 단위).
  • Threads
    액티브 쓰레드의 숫자(클라이언트).
  • Questions
    서버가 시작된 이후 클라이언트에서 보내진 문의 (쿼리) 숫자.
  • Slow queries
    long_query_time 시간 보다 길게 걸린 쿼리의 숫자. Section 5.12.4, “슬로우 쿼리 로그”를 참조.
  • Opens
    서버가 연 테이블의 숫자.
  • Flush tables
    서버가 실행한 flush-*, refresh, 그리고 reload 명령어의 숫자.
  • Open tables
    현재 열려 있는 테이블의 숫자.
  • Memory in use
    mysqld가 직접 할당한 메모리 크기. MySQL이 --with-debug=full와 함께 컴파일 된 경우에만 이 값이 출력된다.
  • Maximum memory used
    mysqld가 직접 할당한 메모리 최대 값. MySQL이 --with-debug=full와 함께 컴파일 된 경우에만 이 값이 출력된다.

유닉스 소켓 파일을 사용해서 로컬 서버에 접속을 할 때 mysqladmin shutdown을 실행하게 되면, mysqladmin은 서버가 올바르게 종료 되었다는 것을 확인하기 위해 서버의 프로세스 ID 파일이 제거될 때까지 대기를 하게 된다.

mysqladmin는 다음 옵션을 지원한다:


  • --help, -?
    도움말 메시지를 출력하고 종료
  • --character-sets-dir=path
    문자 셋이 설치되어 있는 디렉토리. Section 5.11.1, “데이터 및 정렬을 위해 사용되는 문자 셋”를 참조.
  • --compress, -C
    서버 및 클라이언트가 압축을 지원할 경우, 두 서버간에 전달된 모든 정보를 압축한다.
  • --count=N, -c N
    반복된 명령어 실행을 위한 반복 횟수. 이것은 --sleep 옵션과 함께 동작을 한다.
  • --debug[=debug_options], -# [debug_options]
    디버깅 로그를 작성. debug_options 스트링은 종종 'd:t:o,file_name'이 되기도 한다. 디폴트는 'd:t:o,/tmp/mysqladmin.trace'.
  • --default-character-set=charset_name
    디폴트 문자 셋으로 charset_name 를 사용한다. Section 5.11.1, “데이터 및 정렬을 위해 사용되는 문자 셋”을 참조.
  • --force, -f
    drop db_name 명령어에 대해 확인을 요청하지 않게 한다. 여러 개의 명령어를 사용하면, 에러가 발생하더라도 계속 진행을 한다.
  • --host=host_name, -h host_name
    주어진 호스트에서 MySQL 서버에 접속을 한다.
  • --password[=password], -p[password]
    서버에 접속을 할 때 사용하는 패스워드. 축약 폼 (-p)을 사용한다면, 이 옵션과 패스워드 사이에는 스페이스를 두면 안 된다. 명령어 라인에서 --password 또는 -p 옵션 뒤에 패스워드를 지정하지 않으면, 프롬프트가 나오게 된다.
  • --port=port_num, -P port_num
    접속할 때 사용하는 TCP/IP 포트 번호.
  • --protocol={TCP|SOCKET|PIPE|MEMORY}
    사용할 접속 프로토콜.
  • --relative, -r
    --sleep 옵션을 함께 사용했을 때의 값과 현재의 값을 비교해 준다. 현재 버전까지 이 옵션은 extended-status 명령어에서만 동작을 한다.
  • --silent, -s
    서버와의 접속이 이루어지지 않을 경우에 조용히 (에러 없이) 종료 한다.
  • --sleep=delay, -i delay
    delay 시간 동안 슬리핑(sleeping)한 후에 명령어를 반복 실행한다. --count 옵션은 반복 횟수를 결정한다.
  • --socket=path, -S path
    localhost에 접속을 할 경우, 사용할 유닉스 소켓 파일, 또는 윈도우에서 사용할 지명된 파이프 이름.
  • --user=user_name, -u user_name
    서버에 접속을 할 때 사용하는 MySQL 사용자 이름.
  • --verbose, -v
    버보스 모드(Verbose mode). 프로그램이 실행한 사항에 대해 보다 자세한 정보를 출력한다.
  • --version, -V
    버전 정보를 보여 주고 종료한다.
  • --vertical, -E
    결과를 수직으로 출력한다. 이것은 -relative와 유사하지만, 이 옵션은 결과를 수직으로 출력한다.
  • --wait[=count], -w[count]
    접속을 하지 못하는 경우, 종료를 하는 대신에 대기를 하고 다시 접속을 시도한다. count 값이 주어지면, 이 값은 재 시도 횟수를 나타내는 것이다. 디폴트는 한 번이다.

또한, --var_name=value 신텍스를 사용해서 아래의 변수를 설정할 수 있다:


  • connect_timeout
    접속 타임 아웃 이전의 최대 시간. 디폴트 값은 43200 (12 시간)이다.
  • shutdown_timeout
    서버 셧 다운용 최대 대기 시간. 디폴트는 3600 (1 시간)이다.

mysqlbinlog - 바이너리 로그 파일 처리를 위한 유틸리티

서버가 생성하는 바이너리 로그 파일은 바이너리 포맷으로 작성된다. 이 파일을 텍스트 포맷으로 체크를 하려면, mysqlbinlog 유틸리티를 사용하면 된다. 리플리케이션 셋업에서 슬레이브가 작성한 릴레이 로그 파일을 읽기 위해서도 mysqlbinlog를 사용할 수 있다. 릴레이 로그는 바이너리 로그 파일과 같은 포맷을 가지고 있다.

mysqlbinlog은 다음과 같이 호출한다:



shell> mysqlbinlog [options] log_file ...


예를 들면, binlog.000003라는 이름의 바이너리 로그 파일의 내용물을 보여 주기 위해서 다음 명령어를 사용한다:



shell> mysqlbinlog binlog.0000003

이 명령어를 실행하면 binlog.000003에 포함되어 있는 모든 이벤트가 나오게 된다. 이벤트 정보는 실행된 명령문, 명령문 실행 시간, 명령문을 입력한 클라이언트의 쓰레드 ID, 실행된 타임 스탬프 등등의 정보가 포함되어 있다.

mysqlbinlog를 통해 얻게 되는 결과는 로그에 있는 명령문을 재 적용하기 위해 다시 실행 시킬 수 있다 (예를 들면, 이것을 mysql의 입력 값으로 사용할 수 있다). 이 값은 서버가 크래시(crash)가 난 후에 복구를 할 때 유용하게 사용할 수 있다.

일반적으로 바이너리 로그 파일을 직접 읽고 이것을 로컬 MySQL 서버에 적용하기 위해 mysqlbinlog를 사용하게 된다. 또한, 이것을 --read-from-remote-server 옵션과 함께 사용해서 원격 서버로부터 바이어리 로그를 읽는 것도 가능하다. 원격 바이너리 로그를 읽을 경우, 접속 파라미터 옵션을 지정해서 서버와의 접속 방법을 지시할 수 있다. 이렇게 할 수 있는 옵션으로는 --host, --password, --port, --protocol, --socket, 그리고 -user가 있다; 이 옵션들은 --read-from-remote-server 옵션을 함께 지정해야만 기능을 발휘한다.

바이너리 로그 및 릴레이 로그는 Section 5.12.3, “바이너리 로그”, 그리고 Section 6.3.4, “리플리케이션 릴레이 및 상태 파일”을 참조할 것.

mysqlbinlog는 다음 옵션을 지원한다:


  • --help, -?
    도움말 메시지를 출력하고 종료.
  • --character-sets-dir=path
    문자 셋이 설치되어 있는 디렉토리. Section 5.11.1, “데이터 및 정렬을 위해 사용되는 문자 셋”를 참조할 것.
  • --database=db_name, -d db_name
    지정된 데이터 베이스용 엔트리만을 보여준다 (로컬 로그만 해당).
  • --debug[=debug_options], -# [debug_options]
    디버깅 로그를 작성한다. 전형적인 debug_options 스트링은 'd:t:o,file_name'.
  • --disable-log-bin, -D
    바이너리 로깅을 비 활성화 시킨다. 이것은 --to-last-log 옵션을 사용하고 그 결과를 동일한 MySQL 서버에 보내는 경우에 무한 루프를 피하기 위해서 유용하게 사용할 수 있다. 또한, 이 옵션은 서버 크래시 이후에 사용자가 로그한 명령문이 중복되는 것을 피하기 위해서도 유용하게 사용된다.
    이 옵션은 SUPER 권한을 가지고 있어야 한다. 이것은 mysqlbinlog로 하여금 남아있는 결과의 바이너리 로깅을 비 활성화 시키기 위해 자신의 결과에 있는 SET SQL_LOG_BIN=0 명령문을 비 활성화 시키도록 만든다. SET 명령문은 사용자가 SUPER 권한을 가지고 있지 않는 한 효력을 갖지 못한다.
  • --force-read, -f
    이 옵션을 사용하면, mysqlbinlog가 인식하지 못하는 바이너리 로그 이벤트를 읽는 경우, 서버는 경고를 출력하고, 이벤트를 무시하고 계속 진행한다. 이 옵션을 사용하지 않으면, mysqlbinlog이 이와 같은 이벤트를 읽는 경우 멈추게 된다.
  • --hexdump, -H
    코멘트에 있는 로그의 헥스(hex)덤프를 출력한다. 이로 인한 결과는 리플리케이션 디버깅에 유용하게 사용될 수 있다. 헥스 덤프는 나중에 설명하기로 한다. 이 옵션은 5.0.16에서 추가 되었다.
  • --host=host_name, -h host_name
    주어진 호스트 상에 있는 MySQL 서버로부터 바이너리 로그를 가져온다.
  • --local-load=path, -l path
    지정된 디렉토리에 있는 LOAD DATA INFILE을 위한 로컬 임시 파일을 준비한다.
  • --offset=N, -o N
    로그에 있는 첫 번째 N 엔트리를 무시 한다(skip).
  • --password[=password], -p[password]
    서버에 접속을 할 때 사용하는 패스워드. 축약형 옵션 (-p)을 사용할 경우에는, 이 옵션과 패스워드 사이에는 스페이스를 사용하지 않는다. 만일 --password 또는 -p 옵션 다음에 패스워드를 지정하지 않으면, 프롬프트가 나오게 된다.
  • --port=port_num, -P port_num
    원격 서버에 접속을 하기 위해 사용되는 TCP/IP 포트 번호.
  • --position=N, -j N
    사용 중지됨. 대신에 --start-position을 사용한다.
  • --protocol={TCP|SOCKET|PIPE|MEMORY}
    사용할 접속 프로토콜.
  • --read-from-remote-server, -R
    로컬 로그 파일을 읽는 대신에 MySQL 서버에서 바이너리 로그를 읽는다. 모든 접속 파라미터 옵션은 이 옵션을 같이 지정하지 않는 한 무시된다. 이러한 파라미터 옵션에는 --host, --password, --port, --protocol, --socket, 그리고 -user가 있다.
  • --result-file=name, -r name
    주어진 파일에 직접 결과를 출력한다.
  • --short-form, -s
    로그에 포함되어 있는 명령문만을 다른 정보 없이 표시한다.
  • --socket=path, -S path
    localhost에 접속하는 경우, 사용하게 될 유닉스 소켓 파일, 또는 윈도우에서의 지명된 파이프 이름?일하거나 느린 타임 스탬프를 가지고 있는 첫 번째 이벤트에서 바이너리 로그를 읽기 시작한다. datetime 값은 mysqlbinlog를 구동 시키는 시스템의 로컬 타임 존과 관련 있다. 이 값은 DATETIME 또는 TIMESTAMP 데이터 타입에 적합한 포맷 형태를 가져야 한다. 예를 들면:
    shell> mysqlbinlog --start-datetime="2005-12-25 11:25:56" binlog.000003
    이 옵션은 포인트-인-타입(point-in-time) 복구 시에 유용하다. Section 5.10.2, “백업 및 복구 전략의 예”를 참조할 것.
  • --stop-datetime=datetime
    datetime 인수와 동일하거나 빠른 타임 스탬프를 가지고 있는 이벤트가 처음으로 발생할 때 바이너리 로그를 읽기를 종료한다. 이 옵션은 포인트-인-타입(point-in-time) 복구 시에 유용하다. datetime 값에 대한 정보는 --start-datetime 옵션에 대한 설명을 참조하기 바란다.
  • --start-position=N
    N 인수와 동일한 위치를 가지고 있는 이벤트가 처음 발생할 때 바이너리 로그를 읽기 시작한다.
  • --stop-position=N
    N 인수와 동일하거나 보다 큰 위치를 가지고 있는 첫 번째 이벤트 시점에 바이너리 로그를 읽기를 멈춘다.
  • --to-last-log, -t
    MySQL 서버로부터 요청 받은 바이너리 로그의 끝에서 멈추는 대신에, 마지막 바이너리 로그의 끝이 될 때까지 프린트를 계속한다. 이 결과를 동일한 MySQL 서버에 보낸다면, 무한 루프가 발생할 수도 있다. 이 옵션은 --read-from-remote-server를 필요로 한다.
  • --user=user_name, -u user_name
    원격 서버에 접속을 할 때 사용하는 MySQL 사용자 이름.
  • --version, -V
    버전 정보를 출력하고 종료.

또한, --var_name=value 신텍스를 사용해서 아래의 변수를 지정할 수 있다:


  • open_files_limit
    보관해야 할 오픈 파일 디스크립터의 숫자를 지정한다.

바이너리 로그에 포함되어 있는 명령문을 실행하기 위해서, mysqlbinlog의 결과를 mysql 클라이언트에 전달할 수 있다. 이것은 여러분이 오래된 백업을 가지고 있을 때 크래시를 복구하기 위해서 사용할 수가 있다 (Section 5.10.1, “데이터 베이스 백업”을 참조). 예를 들면:



shell> mysqlbinlog binlog.000001 | mysql
또는:

shell> mysqlbinlog binlog.[0-9]* | mysql


명령문의 로그를 우선 수정할 필요가 있다면, mysqlbinlog의 결과를 텍스트 파일로 보낼 수가 있다 (예를 들면, 실행되지 않기를 원하는 명령문을 제거하기 위해). 이 파일을 수정한 다음에, 이것을 mysql 프로그램의 입력 값으로 사용해서 그 명령문을 실행 시킨다.

mysqlbinlog은 --start-position 옵션을 가지고 있는데, 이것은 바이너리 로그 안에서 주어진 위치와 동일하거나 보다 큰 오프셋을 가지고 있는 명령문만을 출력한다 (주어진 위치는 반드시 하나의 이벤트 시점과 매치가 되어야 한다). 또한, 이것은 주어진 날짜 및 시간을 가지고 있는 이벤트를 발견할 때 종료하고 시작하는 옵션을 가지기도 한다. 이것을 사용하면 --stop-datetime 옵션을 사용해서 포인트-인-타입 복구를 실행할 수 있다.

MySQL 서버에서 하나 이상의 바이너리 로그를 가지고 있다면, 이 모든 것을 한번에 서버에 연결해서 처리하는 것이 안전한 방법이다. 아래에서 보여주는 것은 안전하지 못한 예이다:



shell> mysqlbinlog binlog.000001 | mysql # DANGER!!
shell> mysqlbinlog binlog.000002 | mysql # DANGER!!


서버에 서로 다르게 접속을 해서 바이너리 로그를 처리하게 되면, 맨 처음의 로그 파일이 CREATE TEMPORARY TABLE 명령문을 가지고 있고 두 번째 로그가 임시 테이블을 사용하는 명령문을 가지고 있는 경우에는 문제가 발생하게 된다. 맨 처음의 mysql 프로세스가 종료될 때, 서버는 임시 테이블을 제거한다. 두 번째 mysql 프로세스가 이 테이블을 사용하고자 시도하면, 서버는 “unknown table.”이라고 알려주게 된다.

이와 같은 문제를 없애기 위해서는, 처리하고자 하는 모든 바이너리 로그 컨텐츠에 대해서 싱글 접속을 사용하도록 한다. 다음은 그 방법이다:



shell> mysqlbinlog binlog.000001 binlog.000002 | mysql
또 다른 방식은 모든 로그를 하나의 파일에 작성을 하고 이 파일을 처리하는 것이다:

shell> mysqlbinlog binlog.000001 > /tmp/statements.sql
shell> mysqlbinlog binlog.000002 >> /tmp/statements.sql
shell> mysql -e "source /tmp/statements.sql"


mysqlbinlog는 원본 데이터 파일을 사용하지 않고 LOAD DATA INFILE 연산을 재 실행하는 결과를 만들어 낸다. mysqlbinlog은 그 데이터를 임시 파일에 복사를 하고 이 파일을 참조하는 LOAD DATA LOCAL INFILE 명령문을 작성한다. 이 파일이 작성되는 디폴트 디렉토리의 위치는 시스템에 따라 달라진다. 이 디렉토리를 명확히 지정하기 위해서는 --local-load 옵션을 사용한다.

mysqlbinlog이 DATA LOCAL INFILE 명령문을 LOAD DATA LOCAL INFILE 명령문으로 변환 시키기 때문에 (즉, LOCAL을 추가 함), 이 명령문을 처리하는 클라이언트 및 서버 모두는 반드시 LOCAL 기능을 처리할 수 있도록 구성되어야 한다. Section 5.7.4, “LOAD DATA LOCAL을 사용한 보안 이슈”를 참조.

Warning: LOAD DATA LOCAL 명령문용으로 생성된 임시 파일은 실제로 이 명령문을 실행할 때까지 필요한 것이기 때문에 자동으로 삭제가 되지 않는다. 더 이상 이 명령문의 로그가 필요하지 않게 되면 그 때에 임시 파일을 삭제 하도록 한다. 이 파일은 임시 파일 디렉토리에서 찾을 수 있으며 original_file_name-#-#와 같은 이름을 가지고 있다.

--hexdump 옵션은 코멘트에서 로그 컨텐츠에 대한 헥스(hex) 덤프를 만든다:



shell> mysqlbinlog --hexdump master-bin.000001

위의 명령어를 사용하면, 다음과 같은 결과가 만들어진다:



/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
# at 4
#051024 17:24:13 server id 1 end_log_pos 98
# Position Timestamp Type Master ID Size Master Pos Flags
# 00000004 9d fc 5c 43 0f 01 00 00 00 5e 00 00 00 62 00 00 00 00 00
# 00000017 04 00 35 2e 30 2e 31 35 2d 64 65 62 75 67 2d 6c |..5.0.15.debug.l|
# 00000027 6f 67 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |og..............|
# 00000037 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
# 00000047 00 00 00 00 9d fc 5c 43 13 38 0d 00 08 00 12 00 |.......C.8......|
# 00000057 04 04 04 04 12 00 00 4b 00 04 1a |.......K...|
# Start: binlog v 4, server v 5.0.15-debug-log created 051024 17:24:13
# at startup
ROLLBACK;


헥스 덤프로 만들어지는 결과에는 다음과 같은 것들이 포함된다. 이 포맷은 향후 변경될 것이다.


  • Position: 로그 파일 안에 있는 바이트 위치.
  • Timestamp: 이벤트 타임 스탬프. 위의 예문에서 보면, '9d fc 5c 43'은 16진 법(hexadecimal) '051024 17:24:13' 의 다른 표현식이다.
  • Type: 로그 이벤트의 타입. 위의 예문에서 보면, '0f'는 예문의 이벤트가 FORMAT_DESCRIPTION_EVENT 라는 것을 의미한다. 아래에서는 가능한 타입을 열거하고 있다.

Type Name Meaning
00 UNKNOWN_EVENT This event should never be present in the log.
01 START_EVENT_V3 This indicates the start of a log file written by MySQL 4 or earlier.
02 QUERY_EVENT The most common type of events. These contain statements executed on the master.
03 STOP_EVENT Indicates that master has stopped.
04 ROTATE_EVENT Written when the master switches to a new log file.
05 INTVAR_EVENT Used mainly for AUTO_INCREMENT values and when the LAST_INSERT_ID() function is used in the statement.
06 LOAD_EVENT Used for LOAD DATA INFILE in MySQL 3.23.
07 SLAVE_EVENT Reserved for future use.
08 CREATE_FILE_EVENT Used for LOAD DATA INFILE statements. This indicates the start of execution of such a statement. A temporary file is created on the slave. Used in MySQL 4 only.
09 APPEND_BLOCK_EVENT Contains data for use in a LOAD DATA INFILE statement. The data is stored in the temporary file on the slave.
0a EXEC_LOAD_EVENT Used for LOAD DATA INFILE statements. The contents of the temporary file is stored in the table on the slave. Used in MySQL 4 only.
0b DELETE_FILE_EVENT Rollback of a LOAD DATA INFILE statement. The temporary file should be deleted on slave.
0c NEW_LOAD_EVENT Used for LOAD DATA INFILE in MySQL 4 and earlier.
0d RAND_EVENT Used to send information about random values if the RAND() function is used in the statement.
0e USER_VAR_EVENT Used to replicate user variables.
0f FORMAT_DESCRIPTION_EVENT This indicates the start of a log file written by MySQL 5 or later.
10 XID_EVENT Event indicating commit of an XA transaction.
11 BEGIN_LOAD_QUERY_EVENT Used for LOAD DATA INFILE statements in MySQL 5 and later.
12 EXECUTE_LOAD_QUERY_EVENT Used for LOAD DATA INFILE statements in MySQL 5 and later.
13 TABLE_MAP_EVENT Reserved for future use.
14 WRITE_ROWS_EVENT Reserved for future use.
15 UPDATE_ROWS_EVENT Reserved for future use.
16 DELETE_ROWS_EVENT Reserved for future use.

  • Master ID: 이벤트를 생성한 마스터의 서버 ID.
  • Size: 이벤트의 바이트 단위 크기.
  • Master Pos: 원본 마스터 로그 파일에 있는 이벤트의 위치.
  • Flags: 16 플래그. 현재까지는, 아래의 플래그들이 사용된다. 나머지들은 향후에 사용될 예정이다.

Flag Name Meaning
01 LOG_EVENT_BINLOG_IN_USE_F Log file correctly closed. (Used only in FORMAT_DESCRIPTION_EVENT.) If this flag is set (if the flags are, for example, '01 00') in a FORMAT_DESCRIPTION_EVENT, the log file has not been properly closed. Most probably this is because of a master crash (for example, due to power failure).
02 Reserved for future use.
04 LOG_EVENT_THREAD_SPECIFIC_F Set if the event is dependent on the connection it was executed in (for example, '04 00'), for example, if the event uses temporary tables.
08 LOG_EVENT_SUPPRESS_USE_F Set in some circumstances when the event is not dependent on the default database.

mysqlcheck - 테이블 관리 및 복구 프로그램

mysqlcheck 클라이언트는 테이블을 체크, 복구, 최적화, 그리고 분석을 한다.

mysqlcheck는 myisamchk과 유사한 기능을 구현하지만, 전혀 다른 방식으로 동작을 한다. 가장 주된 차이점은, mysqlcheck는 mysqld 서버가 구동될 때만 사용될 수 있는데 비해서, myisamchk는 이 서버가 없는 경우에도 사용될 수 있다는 점이다. mysqlcheck를 사용할 때 얻을 수 있는 장점으로는 사용자가 테이블을 체크하기 위해서 서버를 종료할 필요가 없다는 것이다.

mysqlcheck은 SQL 명령문인 CHECK TABLE, REPAIR TABLE, ANALYZE TABLE, 그리고 OPTIMIZE TABLE을 사용자 입장에서 편리하게 사용한다. 이것은 사용자가 원하는 연산을 위해서 어떤 명령문을 사용할 것인지를 판단하고, 서버에게 이 명령문을 전달해서 실행을 하도록 만든다. 각각의 명령문이 함께 실행하는 스토리지 엔진에 대해서는 Chapter 13, SQL 명령문 신텍스를 참조하면 된다.

MyISAM 스토리지 엔진은 위의 4 가지 명령문을 모두 지원하며, 따라서 mysqlcheck는 MyISAM 테이블에서 위의 4 가지 연산을 모두 실행할 수가 있다. 다른 스토리지 엔진은 이것들을 모두 지원하지는 않는다. 이와 같은 명령문 처리를 위해 다른 엔진을 사용하는 경우에는, 에러 메시지가 나타나게 된다. 예를 들면, 만일 test.t 이 하나의 MEMORY 테이블이라면, 이것을 체크하고자 하는 시도는 아래와 같은 결과를 만들게 된다:



shell> mysqlcheck test t
test.t
note : The storage engine for the table doesn't support check
mysqlcheck를 호출하는 방법에는 일반적으로 3 가지가 있다:

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


db_name 다음에 어떠한 테이블 이름도 지정하지 않거나 또는 --databases 또는 --all-databases 옵션을 사용하는 경우에는, 전체 데이터베이스가 체크된다.

mysqlcheck는 다른 클라이언트 프로그램과 비교해서 특별한 특성이 하나 있다. 테이블 체크에 대한 디폴트 동작 (--check)은 바이너리의 이름을 재 지정함으로써 변경 시킬 수 있다. 디폴트로 테이블을 복구하는 툴을 가지고자 한다면, 간단히 mysqlcheck를 mysqlrepair이름으로 복사를 하거나, 또는 mysqlcheck를 mysqlrepair라는 이름으로 심볼릭 링크를 만들기만 하면 된다. mysqlrepair를 호출한다면, 이것은 테이블을 복구하게 된다.

다음은 mysqlcheck의 디폴트 동작을 변경 시킬 때 사용할 수 있는 것들이다:



mysqlrepair The default option is --repair
mysqlanalyze The default option is --analyze
mysqloptimize The default option is --optimize

mysqlcheck는 다음 옵션을 지원한다:


  • --help, -?
    도움말을 출력하고 종료.
  • --all-databases, -A
    모든 데이터 베이스에 있는 모든 테이블을 체크한다. 이것은 --databases 옵션을 사용하고 명령어 라인에서 모든 데이터 베이스 이름을 지정하는 것과 동일한 기능을 한다.
  • --all-in-1, -1
    각 테이블에 대해서 명령문을 하나씩 입력하는 대신에, 실행 시키고자 하는 데이터 베이스에 있는 모든 테이블 이름을 가지고 있는 각 데이터 베이스에 대해서 하나의 명령문을 실행 시킨다.
  • --analyze, -a
    테이블을 분석한다.
  • --auto-repair
    체크를 한 테이블이 깨졌다면, 자동으로 이것을 복구 시킨다. 모든 테이블을 체크한 후에 필요한 모든 복구를 실행한다.
  • --character-sets-dir=path
    문자 셋이 설치되어 있는 디렉토리. Section 5.11.1, “데이터 및 정렬을 위해 사용되는 문자 셋”을 참조할 것.
  • --check, -c
    테이블 에러를 체크한다. 이것은 디폴트 연산이다.
  • --check-only-changed, -C
    마지막 체크를 한 후에 변경된 테이블 또는 올바르게 닫히지 않은 테이블만 체크한다.
  • --check-upgrade, -g
    서버의 현재 버전과 호환성이 없는 테이블을 체크하기 위해서 CHECK TABLE를 FOR UPGRADE 옵션과 함께 호출한다. 이 옵션은 MySQL 5.0.19 에서 추가 되었다.
  • --compress
    클라이언트 및 서버가 모두 압축을 지원한다면, 이 두 서버간의 전달되는 모든 정보를 압축시킨다.
  • --databases, -B
    네임드 데이터 베이스에 있는 모든 테이블을 처리한다. 일반적인 경우, mysqlcheck는 명령어라인에 있는 첫 번째 이름을 데이터베이스 이름을 간주하고 그 다음의 이름을 테이블 이름으로 간주한다. 이 옵션을 사용하면, 모든 이름 인수를 데이터베이스 이름으로 간주하게 된다.
  • --debug[=debug_options], -# [debug_options]
    디버깅 로그를 작성한다. 전형적인 debug_options 스트링은 'd:t:o,file_name'.
  • --default-character-set=charset_name
    charset_name를 디폴트 문자 셋으로 사용한다. Section 5.11.1, “데이터 및 정렬을 위해 사용되는 문자 셋”을 참조할 것.
  • --extended, -e
    이 옵션을 사용해서 테이블을 체크한다면, 시간은 오래 걸리지만 100%의 일관성을 보장받을 수 있다. 이 옵션을 테이블 복구용으로 사용한다면, 복구하는데 시간이 오래 걸릴 뿐만 아니라 필요 없는 열도 많이 생성되게 된다!
  • --fast, -F
    올바르게 종료되지 않은 테이블만 체크한다.
  • --force, -f
    SQL 에러가 발생하더라도 계속 진행한다.
  • --host=host_name, -h host_name
    주어진 호스트에 있는 MySQL 서버에 접속을 한다.
  • --medium-check, -m
    --extended 연산 보다는 빠른 체크를 실행한다. 이것은 모든 에러에 대해서 99.99%의 신뢰도를 보장하는데, 대부분의 경우 이 정도면 충분하다.
  • --optimize, -o
    테이블을 최적화 시킨다.
  • --password[=password], -p[password]
    서버에 접속을 할 때 사용할 패스워드. 축약형 옵션(-p)을 사용할 경우에는, 이 옵션과 패스워드 사이에는 스페이스를 두지 말도록 한다. --password 또는 -p 옵션 다음에 패스워드를 지정하지 않으면, 프롬프트가 나오게 된다.
  • --port=port_num, -P port_num
    접속용으로 사용하는 TCP/IP 포트 번호.
  • --protocol={TCP|SOCKET|PIPE|MEMORY}
    사용할 접속 프로토콜.
  • --quick, -q
    이 옵션을 사용해서 테이블을 체크한다면, 잘못된 링크를 체크하기 위한 열 스캐닝을 체크하지 못하도록 한다. 이 방법이 가장 빠른 체크 방법이다.
    이 옵션을 사용해서 테이블을 복구한다면, 이것은 인덱스 트리만을 복구하려고 할 것이다. 가장 빠른 복구 방법이다.
  • --repair, -r
    유니크(unique)하지 않은 유니크 키를 제외하고 거의 모든 것을 복구시킨다.
  • --silent, -s
    침묵 모드(Silent mode). 에러 메시지만을 출력한다.
  • --socket=path, -S path
    localhost 에 접속하는 경우, 사용할 유닉스 소켓 파일, 또는 윈도우 네임드 파이프 이름.
  • --tables
    --databases 또는 -B 옵션을 무력화 시킨다(override). 이 옵션 다음에 나오는 모든 이름 인수는 테이블 이름으로 간주된다.
  • --use-frm
    MyISAM 테이블에서의 복구 연산의 경우, 테이블의 .MYI 헤더가 깨졌다고 하더라도 테이블 복구를 실행하기 위해서 .frm 파일로부터 테이블 구조를 가져온다.
  • --user=user_name, -u user_name
    서버에 접속을 할 때 사용하는 MySQL 사용자 이름.
  • --verbose, -v
    버보스 모드(Verbose mode). 프로그램 연산의 다양한 단계 정보를 출력한다.
  • --version, -V
    버전 정보를 출력하고 종료.

mysqldump - 데이터 베이스 백업 프로그램

mysqldump 클라이언트는 이고르 로마넨코(Igor Romanenko)가 작성한 백업 프로그램이다. 이것은 데이터베이스를 덤프하거나 또는 백업 또는 데이터를 다른 SQL 서버(MySQL서버가 아닌)에 전달하기 위해서 데이터 베이스를 모을 때 사용하는 프로그램이다. 덤프에는 테이블을 생성하거나 또는 안주(populate)시키기 위한 SQL명령문이 포함되어 있다.

서버에서 백업을 진행하고 있고, 또한 사용하는 테이블이 MyISAM테이블이라면, mysqlhotcopy를 대신 사용하는 것이 좋은데, 그 이유는 이것이 보다 빠른 백업과 복원을 실행하기 때문이다. Section 8.11, “mysqlhotcopy - 데이터 베이스 백업 프로그램”을 참조할 것.

mysqldump를 호출하는 데에는 일반적으로 세 가지 방법이 있다:



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


db_name 다음에 테이블을 지명하지 않았거나 --databases 또는 --all-databases 옵션을 사용한다면, 전체 데이터베이스가 덤프된다.

Mysqldump를 지원하는 옵션 리스트를 얻으려면, mysqldump -help를 실행하라

mysqldump를 --quick 또는 --opt 옵션이 없이 사용한다면, mysqldum는 결과를 덤프하기 전에 전체 결과 셋을 메모리로 읽어오게 된다. 대형 데이터베이스를 덤프할 경우에 이것이 문제가 된다. --opt 옵션은 디폴트로 활성화 되어 있으나, --skip-opt로 비활성화 시킬 수 있다.

현재 mysqldump 버전을 사용해서 구형 MySQL 서버로 덤프를 실행하고자 한다면, --opt 또는 --extended-insert 옵션을 사용하지 말도록 한다. 대신에 --skip-opt 옵션을 사용한다.

mysqldump는 아래의 옵션을 지원한다:


  • --help, -?
    도움말을 출력하고 종료.
  • --add-drop-database
    DROP DATABASE 명령문은 각각의 CREATE DATABASE 명령문 전에 추가 한다.
  • --add-drop-table
    DROP TABLE 명령문을 각각의 CREATE TABLE 명령문 전에 추가한다.
  • --add-locks
    LOCK TABLES 과 UNLOCK TABLES 명령문을 사용해서 각각의 테이블 덤프를 둘러 싼다(surround). 이렇게 하면 덤프 파일을 다시 읽어올 때 보다 빠른 삽입을 실행할 수가 있다. Section 7.2.16, “INSERT 명령문의 속도”를 참조.
  • --all-databases, -A
    모든 데이터 베이스에 있는 모든 테이블을 덤프한다. 이것은 --databases 옵션을 사용해서 명령어 라인에서 모든 데이터 베이스 이름을 입력하는 것과 동일한 기능을 실행한다.
  • --allow-keywords
    키 워드 이름을 사용해서 컬럼을 생성하는 것을 허용한다.
  • --character-sets-dir=path
    문자 셋이 설치되어 있는 디렉토리. Section 5.11.1, “데이터 및 정렬을 위해 사용되는 문자 셋”를 참조할 것.
  • --comments, -i
    프로그램 버전, 서버 버전, 그리고 호스트와 같은 추가적인 정보를 덤프 파일에 기록한다. 이 옵션은 디폴트로 활성화 된다. --skip-comments를 사용하면, 디폴트 활성화를 없앨 수 있다.
  • --compact
    간략한 결과를 만들게 한다. 이 옵션은 코맨트를 없애주며 --skip-add-drop-table, --no-set-names, --skip-disable-keys, 그리고 --skip-add-locks 옵션을 활성화 시킨다.
  • --compatible=name
    다른 데이터 시스템 또는 구형 MySQL 서버와의 호환성을 보다 많이 갖도록 결과를 만든다. name의 값은 ansi, mysql323, mysql40, postgresql, oracle, mssql, db2, maxdb, no_key_options, no_table_options, 또는 no_field_options가 될 수 있다. 여러 개의 값을 사용하기 위해서는, 각각을 콤마로 구분시킨다. 이러한 값들은 서버 SQL 모드를 설정하기 위한 대응 값들과 동일한 의미를 갖게 된다. Section 5.2.5, “서버 SQL 모드”를 참조할 것.
    이 옵션은 다른 서버와의 호환성을 보장하지는 않는다. 단지 덤프를 한 결과가 다른 SQL 서버와 호환성을 보다 많이 가지도록 만들어줄 뿐이다. 예를 들면, --compatible=oracle는 오라클 타입의 데이터 또는 코멘트 신텍스와 매핑되는 것은 아니다.
  • --complete-insert, -c
    컬럼 이름을 가지고 있는 완벽한 INSERT 명령문을 사용한다.
  • --compress, -C
    클라이언트 및 서버가 압축을 지원할 경우, 두 서버간에 전달되는 정보를 압축한다.
  • --create-options
    CREATE TABLE 명령문에 모든 MySQL 관련 테이블 옵션을 포함시킨다.
  • --databases, -B
    여러 개의 데이터 베이스를 덤프한다. 일반적으로, mysqldump는 명령어라인에 있는 첫 번째 이름을 데이터 베이스 이름을 간주하고 그 다음의 이름을 테이블 이름으로 간주한다. 이 옵션을 사용하면, 모든 이름 인수를 데이터 베이스 이름으로 간주하게 된다. CREATE DATABASE 및 USE 명령문은 각각의 새로운 데이터 베이스 전에 결과에 포함된다.
  • --debug[=debug_options], -# [debug_options]
    디버깅 로그를 작성한다. debug_options 스트링은 종종 'd:t:o,file_name'가 된다. 디폴트는 'd:t:o,/tmp/mysqldump.trace'.
  • --default-character-set=charset_name
    charset_name를 디폴트 문자 셋으로 사용한다. Section 5.11.1, “데이터 및 정렬을 위해 사용되는 문자 셋”을 참조. 만일 지정하지 않으면, mysqldump은 utf8를 사용한다.
  • --delayed-insert
    INSERT DELAYED 명령문을 INSERT 명령문 대신에 작성한다.
  • --delete-master-logs
    마스터 리플리케이션 서버에서, 덤프 연산을 실행한 후에 바이너리 로그를 삭제한다. 이 옵션은 자동으로 --master-data를 활성화 시킨다.
  • --disable-keys, -K
    각각의 테이블에 대해서, INSERT 명령문을 /*!40000 ALTER TABLE tbl_name DISABLE KEYS */; 그리고 /*!40000 ALTER TABLE tbl_name ENABLE KEYS */; 명령문을 사용해서 둘러싼다(surround). 이것은 모든 열이 삽입된 후에 인덱스가 생성되기 때문에 덤프 파일을 읽어 오는데 보다 빠른 속도가 나오게 된다. 이 옵션은 MyISAM 테이블에 대해서만 효과가 있다.
  • --extended-insert, -e
    여러 개의 VALUES 리스트를 가지고 있는 다중-열 INSERT 신텍스를 사용한다.이렇게 하면 덤프 파일이 작아지고 파일을 다시 읽어 올 때 삽입 속도를 빠르게 할 수가 있다.
  • --fields-terminated-by=..., --fields-enclosed-by=..., --fields-optionally-enclosed-by=..., --fields-escaped-by=..., --lines-terminated-by=...
    이들 옵션은 -T 옵션과 함께 사용되며 LOAD DATA INFILE에 대한 대응 구문과 같은 의미를 가진다. Section 13.2.5, “LOAD DATA INFILE 신텍스”를 참조.
  • --first-slave, -x
    기능 삭제됨. 현재는 --lock-all-tables로 바뀌었음.
  • --flush-logs, -F
    덤프를 시작하기 전에 MySQL 서버 로그 파일을 플러시한다. 이 옵션은 RELOAD 권한을 필요로 한다. 만일 여러분이 이 옵션을 --all-databases (또는 -A) 옵션과 함께 결합해서 사용한다면, 로그는 각각의 덤프된 데이터 베이스에 대해서 플러시 된다는 점을 알아야 한다. 한가지 예외는 --lock-all-tables 또는 --master-data를 사용하는 경우이다: 이와 같은 경우, 로그는 모든 테이블이 잠기는 시점에 오직 한번만 플러시된다. 만일 동일한 시점에 덤프 및 로그 플러시가 일어나도록 하기 위해서는, --flush-logs를 --lock-all-tables 또는 --master-data와 함께 사용하도록 한다.
  • --force, -f
    테이블 덤프를 하는 동안 SQL 에러가 발생하더라도 계속 진행 시킨다.
  • --host=host_name, -h host_name
    주어진 호스트에 있는 MySQL 서버에서 데이터를 덤프한다. 디폴트 호스트는 localhost.
  • --hex-blob
    16진법(hexadecimal)을 사용해서 바이너리 컬럼을 덤프한다 (예를 들면, 'abc'는 0x616263가 된다). 이렇게 할 수 있는 데이터 타입은 BINARY, VARBINARY, 그리고 BLOB가 된다. MySQL 5.0.13까지는, BIT 컬럼도 해당된다.
  • --ignore-table=db_name.tbl_name
    주어진 테이블을 덤프하지 않는데, 이것은 데이터 베이스 및 테이블 이름을 사용해서 지정해야 한다. 여러 개의 테이블을 무시하기 위해서는, 이 옵션을 여러 번 사용한다.
  • --insert-ignore
    INSERT 명령문을 IGNORE 옵션과 함께 작성한다.
  • --lock-all-tables, -x
    모든 데이터 베이스에 걸쳐서 모든 테이블을 잠근다. 이것은 전체 덤프 주기에 대한 글로벌읽기 잠금을 통해 얻을 수 있다. 이 옵션은 자동으로 --single-transaction --lock-tables를 오프(Off)시킨다.
  • --lock-tables, -l
    덤프를 하기 전에 모든 테이블을 잠근다. MyISAM 테이블의 경우에는 동시 삽입을 허용하기 위해서 테이블을 READ LOCAL로 잠근다. InnoDB 및 BDB와 같은 트랜젝션이 되는 테이블의 경우, --single-transaction이 보다 좋은 옵션이 되는데, 그 이유는 이것은 테이블을 전혀 잠글 필요가 없기 때문이다.
    여러 개의 데이터 베이스를 덤프할 때에는, --lock-tables은 각각의 데이터 베이스에 대해서 테이블을 개별적으로 잠근다는 점을 알아두기 바란다. 따라서, 이 옵션은 덤프 파일에 있는 테이블이 데이터 베이스간에 논리적으로 일관성을 가지는 것에 대해서는 보장을 하지 않는다. 서로 다른 데이터 베이스에 있는 테이블들은 완벽하게 틀린 상태에서 덤프가 된다.
  • --master-data[=value]
    바이너리 로그 파일 이름과 위치(position)을 결과에 작성한다. 이 옵션은 RELOAD 권한이 필요하고 바이너리 로그는 반드시 활성화 되어야 한다. 만일 이 옵션 값이 1 이면, 그 위치 및 파일 이름은 CHANGE MASTER 명령문 형태로 덤프 결과에 작성되는데, 이것은 여러분이 슬레이브를 설정하기 위해 이 SQL 덤프를 사용하는 경우에 슬레이브 서버로 하여금 마스터의 바이너리 로그에 있는 올바른 위치에서 시작을 하도록 만든다. 만일 이 옵션 값이 2와 같다면, CHANGE MASTER 명령문은 SQL 코멘트처럼 작성된다. 만일 값이 생략되면, 이것이 디폴트 동작이 된다.
    --master-data 옵션은 --single-transaction을 함께 지정하지 않는 한, --lock-all-tables를 온(ON) 시킨다 (이와 같은 경우, 글로벌 읽기 잠금은 덤프가 시작되는 짧은 시점에만 얻을 수 있다). --single-transaction에 대한 설명을 함께 참조한다. 모든 경우에, 로그 상의 모든 동작은 정확히 덤프가 일어나는 시점에 발생을 한다. 이 옵션은 자동으로 --lock-tables를 오프(Off) 시킨다.
  • --no-autocommit
    각각의 덤프된 테이블에 대한 INSERT 명령문을 SET AUTOCOMMIT=0 과COMMIT 명령문안에 넣는다.
  • --no-create-db, -n
    이 옵션은 --databases 또는 --all-databases 옵션이 주어질 경우에 결과에 포함되는 CREATE DATABASE 명령문을 무력화 시킨다.
  • --no-create-info, -t
    각각의 덤프된 테이블을 다시 생성하는 CREATE TABLE 명령문을 작성하지 않는다.
  • --no-data, -d
    테이블에 대한 어떠한 열 정보도 작성하지 않는다. 이것은 테이블에 대해서 CREATE TABLE 명령문만을 덤프하고자 할 경우에 매우 유용하다.
  • --opt
    이 옵션은 축약형이다; 이것은 --add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset를 지정하는 것과 같다. 이 옵션은 빠른 덤프 연산을 실행하며 MySQL 서버로 빠르게 다시 읽혀지는 덤프 파일을 만들어 낸다.
    이 옵션은 디폴트로 활성화 되어 있지만, --skip-opt를 사용해서 비 활성화 시킬 수가 있다. -opt에 의해서 활성화된 특정 옵션만을 비활성화 시키기 위해서는, 해당 옵션의 --skip 형태를 사용한다; 예를 들면, --skip-add-drop-table 또는 --skip-quick.
  • --order-by-primary
    주요(primary) 키 또는 맨 처음의 유니크 인덱스(만일 인덱스가 존재한다면)를 사용해서 각각의 테이블 열을 정렬한다. 이것은 InnoDB 테이블 안으로 집어넣을 MyISAM 테이블을 덤프할 때 유용하게 사용되지만, 덤프 자체를 매우 오래 걸리게 한다.
  • --password[=password], -p[password]
    서버에 접속을 할 때 사용하는 패스워드.
  • --port=port_num, -P port_num
    접속용으로 사용할 TCP/IP 포트 번호.
  • --protocol={TCP|SOCKET|PIPE|MEMORY}
    접속용 프로토콜.
  • --quick, -q
    이 옵션은 대형 테이블을 덤프할 때 유용하다. 이것은 mysqldump로 하여금 테이블에 대한 열을 서버에서 한번에 한 열씩 추축하도록 만들고 추출한 열을 쓰기 전에 메모리에 버퍼링 하도록 만든다.
  • --quote-names, -Q
    인용 부호를 사용해서 데이터 베이스, 테이블, 그리고 컬럼 이름을 둘러 쌓도록 한다. 만일 ANSI_QUOTES SQL 모드가 활성화 되어 있다면, 그 이름도 인용 부호화 시킨다. 이 옵션은 디폴트로 활성화 되어 있다. 이것은 --skip-quote-names으로 비 활성화 시킬 수 있으나, 이 옵션은 --quote-names을 활성화 시킬 수 있는 --compatible과 같은 옵션 다음에 주어져야 한다.
  • --result-file=file, -r file
    주어진 파일로 결과를 직접 넣는다. 이 옵션은 윈도우에서 새 라인 문자 ‘\n’가 ‘\r\n’ 캐리지 리턴/새 라인 시퀀스로 변환되지 못하도록 하기 위해서 사용된다.
  • --routines, -R
    덤프된 데이터 베이스에서 스토어드 루틴(함수 및 프로시저)를 덤프한다. --routines을 사용해서 만들어지는 결과는 CREATE PROCEDURE 루틴을 재 생성하기 위한 CREATE FUNCTION 명령문을 갖게 된다. 하지만, 이러한 명령문들은 루틴 생성 및 수정 타임 스탬프와 같은 속성을 가지지 않는다. 이것은 루틴이 리로드(reload)될 때, 리로드 시간과 동일한 타임 스탬프를 가지고서 생성된다는 것을 의미한다.
    만일 여러분이 재 생성될 루틴이 원래의 타임 스탬프 속성을 가지도록 하기 위해서는, --routines를 사용하지 말도록 한다. 대신에, mysql 데이터 베이스에 대해 적절한 권한을 가지고 있는 MySQL 계정을 사용해서 mysql.proc 테이블의 내용물을 직접 덤프 및 리로드 하도록 한다.
    이 옵션은 MySQL 5.0.13 에 추가되었다. 이 버전 이전에는 스토어드 루틴을 덤프할 수가 없었다. 루틴 DEFINER 값은 5.0.20 이후에 덤프가 되었다. 이것은 5.0.20 이전에는, 루틴이 리로드될 때, 리로딩 사용자에 대해서 디파이너(definer) 셋을 가지고 생성된다는 것을 의미하는 것이다. 만일 루틴이 원래의 디파이너를 가지고 재 생성되도록 하고자 한다면, 앞에서 설명한 방식으로 mysql.proc 테이블의 내용물을 직접 덤프 및 로드한다.
  • --set-charset
    SET NAMES default_character_set를 결과에 추가한다. 이 옵션은 디폴트로 활성화 된다. SET NAMES 명령문을 무시하기 위해서는, --skip-set-charset를 사용한다.
  • --single-transaction
    이 옵션은 서버에서 데이터를 덤프하기 전에 BEGIN SQL 명령문을 실행한다. 이것은 InnoDB 및 BDB와 같은 트랜젝션이 되는 테이블에서만 유용한데, 그 이유는 이것이 BEGIN이 다른 어플리케이션을 블러킹하지 않은 채로 입력될 때 데이터 베이스를 일관성 있게 담프하기 때문이다. 이 옵션을 사용할 때, 여러분은 InnoDB 테이블만이 일관성 있게 덤프된다는 점을 알고 있어야 한다. 예를 들면, 이 옵션을 사용할 때 덤프되는 MyISAM 또는 MEMORY 테이블은 상태가 변경될 수도 있다.
    --single-transaction 옵션과 --lock-tables 옵션은 상호 배타적인데(mutually exclusive), 그 이유는 LOCK TABLES이 암묵적으로 실행되는 트랜젝션을 연기 시키기 때문이다.
    대형 테이블을 덤프하기 위해서는, 이 옵션을 -quick과 결합해서 사용한다.
  • --socket=path, -S path
    localhost에 접속하는 경우, 유닉스 소켓 파일 또는, 윈도우의 네임드 파이프 이름.
  • --skip-comments
    --comments 옵션에 대한 설명을 참조한다.
  • --tab=path, -T path
    탭으로 구분된 데이터 파일을 만든다. 각가의 덤프 테이블의 경우, mysqldump은 테이블을 생성하는 CREATE TABLE 명령문을 갖는 tbl_name.sql 파일과, 그것의 데이터를 가지고 있는 tbl_name.txt 파일을 생성한다. 이 옵션 값은 파일을 작성하는 디렉토리가 된다.
    디폴트로는t, .txt 데이터 파일이 컬럼 값과 각 라인의 끝에 있는 새 라인(newline) 값 사이에 탭 문자를 사용해서 포맷된다. 이 포맷은 --fields-xxx 및 --lines--xxx 옵션을 사용해서 명확하게 지정될 수 있다.
    Note: 이 옵션은 mysqldump가 mysqld 서버가 구동되는 서버에서 실행될 때에만 사용될 수 있다. 여러분은 반드시 FILE 권한이 있어야 하고, 또한 서버는 반드시 여러분이 지정하는 디렉토리에 파일을 작성할 수 있어야 한다.
  • --tables
    --databases 또는 -B 옵션을 무력화 시킨다. 이 옵션 다음에 나오는 모든 이름 인수는 테이블 이름으로 간주된다.
  • --triggers
    각각의 덤프 테이블에 대한 트리거를 덤프한다. 이 옵션은 디폴트로 활성화 되어 있다; --skip-triggers로 비 활성화 시킬 수 있다.이 옵션은 MySQL 5.0.11 에 추가 되었다. 이전에는, 트리거를 덤프할 수 없었다.
  • --tz-utc
    SET TIME_ZONE='+00:00'를 덤프 파일에 추가해서 TIMESTAMP 컬럼이 서로 다른 타임 존에 있는 서버간에 덤프되고 리로드될 수 있도록 한다. 이 옵션을 사용하지 않으면, TIMESTAMP 컬럼은 로컬 및 목적 서버의 타임 존에 덤프 및 리로드 되고, 이 결과로 인해 값이 변하게 된다. --tz-utc는 디폴트로 활성화 되어 있고, --skip-tz-utc를 사용해서 비활성화 시킬 수가 있다. 이 옵션은 MySQL 5.0.15 에서 추가 되었다.
  • --user=user_name, -u user_name
    서버에 접속할 때 사용되는 MySQL 사용자 이름.
  • --verbose, -v
    버보스 모드 (Verbose mode). 프로그램이 실행하는 정보를 보다 자세히 출력한다.
  • --version, -V
    버전 정보를 출력하고 빠져 나온다.
  • --where='where_condition', -w 'where_condition'
    주어진 WHERE 조건문에 의해 선택된 열만을 덤프한다. 만일 스페이스 또는 다른 문자가 여러분이 사용하는 명령어 해석기에서 특별하게 인식되는 경우에는 인용부호를 사용해야 한다.
    Examples: 

    --where="user='jimf'"
    -w"userid>1"
    -w"userid<1"
    --xml, -X
    덤프 결과를 XML 형태로 출력한다.

또한, --var_name=value 신텍스를 사용해서 아래의 변수를 지정할 수도 있다:


  • max_allowed_packet
    클라이언트/서버 통신용 버퍼의 최대 크기. 최대 크기는 1GB.
  • net_buffer_length
    클라이언트/서버 통신용 버퍼의 초기 크기. 다중-열-삽입 명령문을 생성할 때 (--extended-insert or -opt 옵션을 사용하는 것과 같이), mysqldump는 열을 최대 net_buffer_length 길이 만큼 만든다. 만일 여러분이 이 변수의 값을 늘린다면, MySQL 서버에 있는 net_buffer_length 변수가 최소한 이 만큼의 크기가 되는지를 확인해야 한다.

mysqldump의 가장 일반적인 사용은 아마도 전체 데이터 베이스에 대한 백업용일 것이다:



shell> mysqldump --opt db_name > backup-file.sql

또한 덤프 받은 파일을 아래와 같이 서버로 다시 읽어 올 수도 있다:



shell> mysql db_name < backup-file.sql

또는 아래와 같이 한다:



shell> mysql -e "source /path-to-backup/backup-file.sql" db_name

mysqldump는 또한 하나의 MySQL 서버에서 다른 MySQL 서버로 데이터를 복사해서 데이터 베이스를 안주 시키기 위한 용도로 매우 유용하게 사용할 수가 있다:



shell> mysqldump --opt db_name | mysql --host=remote_host -C db_name

하나의 명령어를 사용해서 여러 개의 데이터 베이스를 덤프하는 것도 가능하다:



shell> mysqldump --databases db_name1 [db_name2 ...] > my_databases.sql

모드 데이터 베이스를 덤프하기 위해서는, --all-databases 옵션을 사용하면 된다:



shell> mysqldump --all-databases > all_databases.sql

InnoDB 테이블의 경우, mysqldump는 온라인 백업이 가능하도록 한다:



shell> mysqldump --all-databases --single-transaction > all_databases.sql

이 백업은 덤프가 시작되는 시점에 모든 테이블에서 글로벌 읽기 잠금만 있으면 된다 (FLUSH TABLES WITH READ LOCK). 이 잠금이 이루어지면 즉시, 바이너리 로그는 읽혀지고 잠금이 릴리즈 된다. 만일 FLUSH 명령문이 실행될 때 하나의 기다란 업데이트 명령문이 구동된다면, MySQL 서버는 이 명령문이 종료할 때까지 기다리게 되고, 덤프 연산은 잠금을 풀어 버린다. 만일 MySQL 서버가 받은 업데이트 명령문이 짧은 실행을 하는 것이라면, 초기의 잠금 기간(period)은 크게 중요하지 않게 된다.

포인트-인-타임 복구(point-in-time recovery) ( “롤-포워드(roll-forward)”라고도 알려짐)에 대해서는, 바이너리 로그를 순환(rotate)시키거나, 또는 최소한 덤프가 대응하는 바이너리 로그 코디네이트(coordinate)를 아는 것이 유용하다:



shell> mysqldump --all-databases --master-data=2 > all_databases.sql
또는:

shell> mysqldump --all-databases --flush-logs --master-data=2
> all_databases.sql


--master-data 와 --single-transaction를 동시에 사용하면 테이블이 InnoDB 스토리지 엔진에 저장되어 있는 경우에 포인트-인-타임 복구에 대해서 적절한 온라인 백업을 만들 수가 있게 된다.

백업 만들기에 대한 보다 자세한 정보는 Section 5.10.1, “데이터 베이스 백업”, 그리고 Section 5.10.2, “백업과 복구 전략에 대한 예제”를 참조하기 바란다.

출처 : MySQL 코리아