MySQL運営ガイド

MySQLユーティリティー

MySQLユーティリティー群

isamchk 
MySQLテーブルをチェック、最適化、修復します。
make_binary_release 
MySQLのバイナリリリースを作成します。
msql2mysql 
mSQLプログラムをMySQLに変換するシェルスクリプトです。
mysql 
mysqlはSQL用シェルです。
以下のように簡単にスクリプトを実行できます。

mysql database < script.sql > output.tab

クライアントのメモリが十分でないことによる問題がある場合は、 --quick スイッチを使用してください。

mysqlaccess 
ホスト、ユーザそしてデータベースの組合せで特権をチェックするためのスクリプトです。
mysqladmin 
管理ユーティリティ。データベースの作成/破棄。reload (新しいユーザの読み込み) と refresh (ディスクへのテーブルのフラッシュ、ログファイルの再オープン)。サーバのバージョンと処理と状態情報も与えます。
mysqlbug
MySQLバグレポートスクリプト。このスクリプトは MySQLメーリングリストにバグレポートを出す際、常に使用します。
mysqld
SQLデーモン。常に実行されます。
mysqldump
MySQL データベースの SQLステートメントまたはタブで区切られたテキストのファイルにダンプします。
mysqlimport
一つまたは複数のテキストファイルをそれぞれのテーブルに読み込む。LOAD DATA INFILEでサポートされる全ての形式を使用できます。
mysqlshow
データベース、テーブル、項目そしてインデックスについての情報を表示します。
mysql_install_db
MySQL承認テーブルをデフォルト特権で作成します。通常、最初の MySQLリリースを新しいシステム上にインストールする時に一回だけ実行されます。
replace
msql2mysqlで使用されます。ファイル内または標準入力上の文字列を変換するユーティリティプログラム。
safe_mysqld
mysqldデーモンを安全に開始させるためのユーティリティです。エラー時には再起動し、実行時情報をログファイルへ記入します。

mysqladmin:MySQLデータベース管理コマンド

mysqladminはデータベース管理操作を行うユーティリティーです。
主な使い方を下記の通りです。

mysqladmin [OPTIONS] command [command-option] command ...

mysqladmin --help で mysqladminがサポートするオプション一覧が出力されます。

mysqladmin がサポートするコマンド

コマンド名 説明
create [データベース名] データベース作成
drop [データベース名] データベース削除
extended-status  サーバーから拡張ステータスメッセージを得る
flush-hosts  全てのキャッシュしているホストをフラッシュ
lush-logs  全てのログをフラッシュ
flush-tables 全てのテーブルをフラッシュ 
kill id,id,... mysql スレッドをキル
password [パスワード] パスワードを変更
ping mysqld が生きているかチェック
processlist 実行中のスレッドを表示
reload 設定情報の再読み込み
refresh 全てのテーブルをフラッシュし、ログファイルを一度閉じて開く
shutdown mysqldの終了
status サーバーからステータスメッセージを得る
variables 可能な変数の表示
version バージョン情報の表示

全てのコマンドはそのコマンド固有の接頭部分で省略できます。

mysqladmin proc stat

mysqladmin statusコマンドが返す項目

  • Uptime
    MySQL サーバーが起動してからの秒数 
  • Threads
    実行中のスレッド (クライアント) 数
  • Questions
    mysqld 開始以降のクライアントからの問い合わせ数
  • Slow queries
    long_query_time 秒以上にかかったクエリの数
  • Opens
    mysqld が過去に開いたテーブルの数
  • Flush tables
    flush ..., refresh, reload コマンドの実行回数
  • Open tables
    現在開かれているテーブルの数
  • Memory in use
    mysqld によるメモリー割り当て (MySQL を --with-debug
    でコンパイルした場合だけに表示される)
  • Max memory used
    mysqld が割り当てたメモリーの最大数 (MySQL を --with-debug
    でコンパイルした場合だけに表示される) 

mysqldump:データベースやテーブルのバックアップ

mysqldumpはデータベースのバックアップに使用します。

mysqldumpを使った定期バックアップ

mysqldumpを使った簡単な定期バックアップ方法を紹介しましょう。まずシェルスクリプトを作成します。

vi mysqldump.sh

mysqldump.sh の内容は以下のとおりです。ユーザ名 myuser、パスワード mypass、バックアップディレクトリは /home/dumpとします。

mysqldump.sh のソース

#! /bin/sh

mysqldump --all-databases > /home/dump/db.txt -u myuser
--password=mypass --opt

毎日1時に /home/sh ディレクトリにある mysqldump.shを実行するようにcronへ登録します。

crontab -e
0 1 * * * * /home/sh/mysqldump.sh

mysqldumpの使い方

mysqldumpはデータベースをダンプするためのユーティリティです。

サーバでバックアップを行なう場合、mysqlhotcopy を代わりに使用することを考慮すべきです。

mysqldump [OPTIONS] データベース名 [テーブル名]

もしくは

mysqldump [OPTIONS] --databases [OPTIONS] データベース名 [データベース名 データベース名...]

もしくは

mysqldump [OPTIONS] --all-databases [OPTIONS]

もしテーブルを指定せず、--databases や --all-databasesを使用しなかったなら、データベースの全てのテーブルがダンプされます。

mysqldump --help によって、オプションの一覧を手にいれることができます。

もし mysqldump を --quick や --opt なしで実行すると、 mysqldumpは結果を表示する前に、結果をメモリに全てロードしてしまいます。これは大きなデータベースをダンプする際に問題になるでしょう。

mysqldump のオプション

--add-locks
テーブルのダンプの前に LOCK TABLES文を追加し、テーブルのダンプ後に UNLOCK TABLE 文を追加します( あとでMySQL に挿入するときに速くなります)。
--add-drop-table
テーブル作成の前にテーブルを削除します
-A, --all-databases
全てのデータベースをダンプします。
-a, --all
全てを含むオプションを作成します。
--allow-keywords
予約語と同じ名前をもつフィールドの作成を許可します。これは、それぞれのフィールド名の前に、テーブル名を付け足します。
-c, --complete-insert
完全な INSERT 文(フィールド名を書いた文)を使用します。
-C, --compress
サーバーとクライアントの両方が圧縮をサポートしている場合は、その間でやりとりされる通信を圧縮します。
-B, --databases
ダンプするデータベースを指定できます。
例:--databases db1 db2 ...
--delayed
INSERT DELAYED
コマンドを使用してレコードを挿入します。
-e, --extended-insert
新しいマルチライン INSERT構文を使用します。(あとで挿入する際、よりコンパクトかつ速くなります。)
-#, --debug[=option_string]
Trace usage of the program (for debugging).
--help
Display a help message and exit.
--fields-terminated-by=...
--fields-enclosed-by=...
--fields-optionally-enclosed-by=...
--fields-escaped-by=...
--lines-terminated-by=...

これらのオプションは -T とともに使用され、LOAD DATA INFILE と同様の意味をなします。

-F, --flush-logs
ダンプする前に、MySQLのログファイルをフラッシュします。
-f, --force,
ダンプの途中で SQLエラーが発生しても、ダンプを続けます。
-h, --host=..
指定されたホストの MySQLからダンプします。デフォルトのホストは localhostです。
-l, --lock-tables.
ダンプを開始する前に全てのテーブルをロックします。The
tables are locked with READ LOCAL to allow
concurrent inserts in the case of MyISAM
tables.
-n, --no-create-db
'CREATE DATABASE /*!32312
IF NOT EXISTS*/ db_name;' will not be put in
the output. The above line will be added
otherwise, if --databases or --all-databases
option was given.
-t, --no-create-info
テーブルの作成情報( CREATE TABLE 文)を書き出しません。
-d, --no-data
テーブルの構造だけを書き出し、テーブル内のレコードを書き出しません。
--opt
--quick --add-drop-table
--add-locks --extended-insert --lock-tables と同じです。MySQL から読み出す時間を可能な限り速くします。
-pyour_pass, --password[=your_pass]
サーバーに接続する際のパスワードを指定します。もし 「=your_pass」部分を与えなかった場合は、mysqldump はパスワードのプロンプトをだします。
-P port_num, --port=port_num
サーバーに接続する際に使用する TCP/IPポート番号です。 (これは localhost 以外のホストへの接続に使用されます。localhost の場合は、Unixソケットが使用されます。)
-q, --quick
クエリをバッファにため込みません。stdoutに直接出します。 mysql_use_result() をこれに使用しています。
-r, --result-file=...
Direct output to a given
file. This option should be used in MSDOS,
because it prevents new line '\n' from being
converted to '\n\r' (new line + carriage
return).
-S /path/to/socket, --socket=/path/to/socket
localhostに接続する際のソケットファイルを指定します。デフォルトは /tmp/mysql.sock です。
--tables
Overrides option
--databases (-B).
-T, --tab=path-to-some-directory
Creates a table_name.sql
file, that contains the SQL CREATE commands,
and a table_name.txt file, that contains the
data, for each give table. NOTE: This only
works if mysqldump is run on the same
machine as the mysqld daemon. The format of
the .txt file is made according to the
--fields-xxx and --lines--xxx options.
与えられたテーブル毎に、 SQL CREATE 文を含む table_name.sql ファイル、データを含む table_name.txt ファイルを作成します。これは mysqld デーモンが走っているマシン上で mysqldumpを実行する場合にだけ、動作します。 .txt ファイルのフォーマットは、--fields-xxx と --lines--xxx オプションに従います。
-u user_name, --user=user_name
サーバーに接続する際の MySQLユーザー名を指定します。デフォルトは Unix のログイン名です。
-O var=option, --set-variable var=option
変数の値をセットします。可能な変数は後述します。
-v, --verbose
冗長モード。プログラムが何を行っているかより表示します。
-V, --version
バージョンを表示します。
-w, --where='where-condition'
選択されたレコードのみをダンプ(クオートは必須)します。
"--where=user='jimf'" "-wuserid>1" "-wuserid<1"
-O net_buffer_length=#, where # < 16M
複数レコード挿入ステートメントを作成したときに(--extended-insert オプションまたは --opt オプションと同様)、mysqldump は net_buffer_length までの長さのレコードを作成します。この変数を大きくする場合には、MySQL サーバの max_allowed_packet 変数が net_buffer_length よりも大きいことを確認してください。

mysqldump の活用

データベースをファイルにバックアップする場合は以下のとおりです。

mysqldump --opt データベース名 > ファイル名

バックアップファイルをデータベースに戻す場合は次のとおりです。

mysql データベース名 < ファイル名

もしくは、下記の方法があります。

mysql -e "source ファイル名" データベース名

他の MySQL にデータベースをコピーするのにも使えます。

mysqldump --opt データベース名 | mysql --host=リモートホスト名 -C データベース名

複数のデータベースを指定してダンプします。

mysqldump --databases database1 [database2 database3...] > my_databases.sql

すべてのデータベースをダンプします。

mysqldump --all-databases > all_databases.sql


mysqlimport テキストファイルからデータを読み込む

mysqlimport は、LOAD DATA INFILE SQL構文を、コマンドラインインターフェースで提供します。 mysqlimport のオプションのほとんどが、
LOAD DATA INFILE への同じオプションに対応します。

mysqlimport の実行は以下のようにします:

shell> mysqlimport [options] database
textfile1 [textfile2....]

mysqlimportは、コマンドラインの引数に与えられたファイル名の拡張子を取り、拡張子を取った後の名前を、ファイルの内容を取り込むテーブルの名前とします。例えば、patient.txt、patient.text、patientというファイルは全て、patientという名前のテーブルに取り込まれます。

mysqlimport は以下のオプションをサポートします

-c, --columns=...
This option takes a comma-separated list of field names as an
argument. The field list is used to create a proper LOAD DATA INFILE
command, which is then passed to MySQL.
-C, --compress
クライアントとサーバーの両方が圧縮をサポートしているなら、クライアント・サーバー間でやり取りされる全ての情報を圧縮します。
-#, --debug[=option_string]
プログラムのトレース(デバッグ)
-d, --delete
テキストファイルを取り込む前にテーブルを空にします。
--fields-terminated-by=...
--fields-enclosed-by=...
--fields-optionally-enclosed-by=...
--fields-escaped-by=...
--lines-terminated-by=...
これらのオプションは、LOAD DATA INFILE の対応する文節と同じ意味になります。
-f, --force
エラーを無視します。例えば、テキストファイルを取り込むテーブルがない場合、残りのファイルの処理に移ります。
--force がなければ、テーブルがなければ mysqlimport は終了します。
--help
ヘルプを表示して終了。
-h host_name, --host=host_name
名前を指定された MySQL サーバーにデータを取り入れます。デフォルトでは localhost.
-i, --ignore
--replace オプションの説明を見てください。
-l, --lock-tables
それぞれのテキストファイルを処理する前に、書き込まれる
全てのテーブルをロックします。これは確実に、すべてのテーブルをサーバ上で同期させます。
-L, --local
クライアントからの入力ファイルを読みます。デフォルトでは、localhost
に接続した場合、テキストファイルはサーバー上にあると仮定されます。(localhost はデフォルト値)
-pyour_pass, --password[=your_pass]
サーバーに接続するときに使用するパスワード。もし `=your_pass'
のところにパスワードを書かなければ、 mysqlimport はパスワードのためのプロンプトをだします。
-P port_num, --port=port_num
ホストに接続するための TCP/IP ポート番号。 (これは localhost
を除くホストへの接続に使用します。 localhost へは、UNIX ソケットを使用します。)
-r, --replace
--replace と --ignore
オプションは、入力されているレコードのユニークキーの値が、既に存在しているレコードのユニークキーの値と同じ場合、その入力されているデータの取り扱いを決定します。もし
--replace
が指定されているなら、既にあるレコードは新しく読まれたレコードに置き換えられます。もし --ignore
が指定されているなら、入力された物は無視されます。どちらのオプションも指定していない場合、キーの値が重なっているとエラーを発し、テキストファイルの残りの部分は無視されます。
-s, --silent
静粛モード。エラーだけ出力します。
-S /path/to/socket, --socket=/path/to/socket
localhost への接続時に使用するソケットファイルを指定します。
-u user_name, --user=user_name
サーバーの接続に使用する MySQL ユーザー名の指定。デフォルトは、Unix のログイン名。
-v, --verbose
冗長モード。プログラムがしている事について多く出力します。
-V, --version
バージョンを表示して終了。

mysqlhotcopy, Copying MySQL Databases and Tables

mysqlhotcopy は、データベースのバックアップを迅速に作るために LOCK TABLES 、
FLUSH TABLES 、および、 cp 、または、 scp を使う perl スクリプトです。1
つのテーブルのデータベースのバックアップを作るのが最も速い方法です。ただし、データベースディレクトリがある同じマシン上でしか実行できません。 

mysqlhotcopy db_name [/path/to/new_directory]
mysqlhotcopy db_name_1 ... db_name_n /path/to/new_directory
mysqlhotcopy db_name./regex/

mysqlhotcopy のオプション

-?, --help
ヘルプを表示
-u, --user=#
ユーザ名を指定してデータベースにログインする
-p, --password=#
パスワードを指定してデータベースにログインする
-P, --port=#
ポートを指定してデータベースにログインする
-S, --socket=#
ソケットを指定してデータベースにログインする
--allowold
Don't abort if
target already exists (rename it _old)
--keepold
Don't delete
previous (now renamed) target when done
--noindices
Don't include
full index files in copy to make the backup
smaller and faster The indexes can later be
reconstructed with myisamchk -rq..
--method=#
Method for copy
(cp or scp).
-q, --quiet
エラーメッセージを表示しない
--debug
デバックをオンにする
-n, --dryrun
Report actions
without doing them
--regexp=#
Copy all
databases with names matching regexp
--suffix=#
Suffix for
names of copied databases
--checkpoint=#
Insert
checkpoint entry into specified db.table
--flushlog
Flush logs once
all tables are locked.
--tmpdir=#
Temporary
directory (instead of /tmp).
 

You can use perldoc mysqlhotcopy to get a more
complete documentation for mysqlhotcopy.

mysqlhotcopy reads the groups [client] and [mysqlhotcopy]
from the option files.

To be able to execute mysqlhotcopy you need write access
to the backup directory, SELECT privilege to the tables
you are about to copy and the MySQL Reload privilege (to
be able to execute FLUSH TABLES).
 

関連記事