MySQL道普請便り

第51回MySQLのクライアントプログラムいろいろ[その1]

MySQLのクライアントプログラム

MySQLのパッケージにはMySQLサーバーであるmysqldの他に、いくつかのクライアントプログラムが付いてき(依存関係でインストールされ)ます。

今回はついに50回を超えたにもかかわらずなかなか触れることのなかった、標準でついてくるクライアントプログラムの紹介をします。

デモ用の環境はCentOS 7.3のサーバー上に以下のコマンドで作成しました。

$ yum install https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
$ yum install mysql-community-server
$ rpm -qa | grep mysql
mysql57-community-release-el7-11.noarch
mysql-community-common-5.7.19-1.el7.x86_64
mysql-community-client-5.7.19-1.el7.x86_64
mysql-community-server-5.7.19-1.el7.x86_64
mysql-community-libs-5.7.19-1.el7.x86_64

これらのパッケージによってインストールされたファイルの一覧は、以下のコマンドで確認できます。

$ rpm -ql $(rpm -qa | grep mysql)

クライアントプログラム群は、/usr/binにインストールされています。

mysql

まずはmysqlコマンドラインクライアントです。いわゆるmysqlコマンドはこれのことを指します。

ちょっと通なユーザーであれば、MySQLと大文字小文字混じりで書く時は製品名としての「MySQL」または「MySQLサーバー」の省略であり、全て小文字でmysqlと書く場合はこのmysqlコマンドラインクライアントのことを指す場合もあります。

対話式のコマンドラインクライアントとして利用する他、-eオプションや標準入力からSQLを与えることでシェルスクリプトの良いおともになります。

対話式コマンドラインクライアントとして利用
$ mysql -uroot
mysql>
-eオプションでSQLを実行
$ mysql -uroot -e "SELECT COUNT(*) FROM mysql.user"
+----------+
| COUNT(*) |
+----------+
|        4 |
+----------+

シェルスクリプトなどでSQLの結果を更に再利用する場合には、-sオプションや-nオプションが便利です。

-sseオプションを利用してSQLの結果を再利用する
$ mysql -uroot -sse "SHOW DATABASES" | egrep -v "performance_schema|information_schema|sys|mysql" | while read db ; do mysql -uroot -e "SHOW CREATE DATABASE $db" ; done
d1      CREATE DATABASE `d1` /*!40100 DEFAULT CHARACTER SET utf8mb4 */

mysqladmin

mysqladminはMySQLサーバーの管理を行うためのクライアントです。管理を行うためにいくつかのサブコマンドが用意されています。

以下の表ではその一部を紹介しています。サブコマンドの完全なリストはmysqladminのリファレンスマニュアルに載っています。

サブコマンド用途対応するSQL
createスキーマの作成CREATE DATABASE
debugデバッグ情報をエラーログに出力なし
dropスキーマの削除DROP DATABASE
extended-statusステータス変数の表示SHOW GLOBAL STATUS
flush-hostsホストキャッシュのフラッシュFLUSH HOSTS
flush-logsログファイルのフラッシュFLUSH LOGS
pingMySQLサーバーの起動確認なし
shutdownMySQLサーバーのシャットダウンSHUTDOWN ⁠※)

※)SHUTDOWNステートメントはMySQL 5.7で追加されました

mysqladmin ping第12回 MySQLのヘルスチェックをする[死活監視の基礎編]で初歩的な死活監視方法として紹介しました。

mysqladminのサブコマンドはSQLで代替が効くものがほとんどでありSHUTDOWNステートメントも実装されました⁠⁠、対応するSQLのないもの以外はmysql -eに置き換えることが可能です。

しかしながら、-iオプション、-rオプションと組み合わせたextended-statusサブコマンドは、SHOW GLOBAL STATUSの差分を出力してくれるため、コマンドだけで簡単なモニタリングをすることができます。

-iオプションで1秒間隔、-rオプションで繰り返し差分表示を指定した例
$ mysqladmin -uroot -i 1 -r extended-status | grep "Com_update "
| Com_update                                    | 47993676                           |
| Com_update                                    | 2                                  |
| Com_update                                    | 6                                  |
| Com_update                                    | 1                                  |
| Com_update                                    | 2                                  |

最初の出力は累計値がそのまま出力されますが、それ以降は-iオプションで指定した秒数だけスリープして前回値との差分のみを出力してくれます。

mysqlbinlog

mysqlbnlogはバイナリーログファイルをパースしてSQLを表示するための独立したプログラムであると同時に、MySQLプロトコルでMySQLサーバーに接続しバイナリーログをストリームで受け取るためのクライアントプログラムでもあります。

MySQLサーバーに接続しtail -fのようにイベントを確認する場合
$ mysqlbinlog -uroot -R --stop-never バイナリーログファイル名
MySQLサーバーに接続しバイナリーログをストリームバックアップする場合(GTIDが有効な場合)
$ mysqlbinlog -uroot --read-from-remote-master=BINLOG-DUMP-GTIDS --stop-never --raw バイナリーログファイル名

mysqlbinlogがクライアントプログラムとして振る舞う場合、接続先のMySQLサーバーからはあたかもスレーブのI/Oスレッドであるかのように振る舞います(つまり、接続に使用するアカウントにはREPLICATION SLAVE権限が必要です⁠⁠。

また、バイナリーログファイルをパースする際には「バイナリーログファイル名」は現在のディレクトリーから見たファイルのパスになりますが、クライアントプログラムとして振る舞う場合には「MySQLサーバーが認識しているバイナリーログファイル名」となり、ディレクトリー指定は不要ですCHANGE MASTER TOステートメントのmaster_log_fileにパスが不要であるのと同じです⁠⁠。

mysqlslap

mysqlslapはMySQLの簡易ベンチマークプログラムです。

オールインワンで綺麗に負荷をかけられるわけでもなく、少し凝ったことをしようとすると独特のオプションに苦しめられることが多いmysqlslapですが、詳細については第23回 mysqlslapを使って負荷テストをしてみようで説明されているのでここでは割愛します。

mysqlcheck

mysqlcheckはテーブルに異常がないかを確認するためのクライアントです。内部的にCHECK TABLEステートメントにマップされています。そのためmysqlコマンドラインクライアントで代替することも可能ですが、mysqlcheckには--all-databasesオプションがあり便利です。

稼働中のMySQLサーバーの全てのテーブルをチェックする例
$ mysqlcheck -uroot --all-databases

mysqlcheckには--analyze--repair--optimizeオプションがあり、それぞれANALYZE TABLEREPAIR TABLEOPTIMIZE TABLEにマップされています。

まとめ

今回はmysqlmysqladminmysqlbinlogmysqlslapmysqlcheckの紹介をしました。

あれ? みなさんの良く知っているあのクライアントプログラムがありませんね? それについては次回解説しますmysqldumpのことです!⁠⁠。

おすすめ記事

記事・ニュース一覧