勉強のためにMySQLをインストールしてデータを投入してみたはいいものの…バンドルされている標準のmysqlコマンドラインクライアントは,
今回はそんな悩みを解決するためのmysqlコマンドラインクライアントのTIPSとして,pagerサブコマンドを紹介します。この機能はmysqlコマンドラインクライアントの機能であるため,mysqlコマンドラインクライアント(サーバはWindows版のものでも構いません。クライアントです)はページャーに対応していないのでごめんなさい。
デモンストレーション環境について
去る2015/
が,mysql-community-release-*.rpmだったファイル名が,mysql57-community-release-*.rpmに変わっています)が,
なお,mysqlコマンドラインクライアントのバージョンを確認するには,--versionオプションを利用します(例として,
$ /usr/mysql/5.7.9/bin/mysql --version ### MySQL 5.7のコマンドラインクライアント /usr/mysql/5.7.9/bin/mysql Ver 14.14 Distrib 5.7.9, for Linux (x86_64) using EditLine wrapper $ /usr/mysql/5.6.27/bin/mysql --version ### MySQL 5.6のコマンドラインクライアント /usr/mysql/5.6.27/bin/mysql Ver 14.14 Distrib 5.6.27, for Linux (x86_64) using EditLine wrapper $ /usr/mysql/5.5.46/bin/mysql --version ### MySQL 5.5のコマンドラインクライアント /usr/mysql/5.5.46/bin/mysql Ver 14.14 Distrib 5.5.46, for Linux (x86_64) using EditLine wrapper
オプション記法の約束事
本題に入る前に,mysqlコマンド(に限らず,mysqlコマンドやmysqldumpコマンドなどのクライアント,mysqldコマンドも同様です)の解釈するオプションの記法について記載しておきます。
mysqlコマンドの解釈する,-u(--user)オプションを与える方法は以下の4通りです。
mysql -u root(ショートオプション 空白文字 値)mysql -uroot(ショートオプション 値)mysql --user root(ロングオプション 空白文字 値)mysql --user=root(ロングオプション イコール 値)
ただし,-pまたは--password)オプションのみ例外となっていて,
これは,-pオプションは「値を指定された場合はそれをパスワードとして扱う」「値が指定されずオプションのみ指定された場合はパスワードプロンプトを表示する」という2通りの動作があるためこのような制約になっています。空白文字を許して値を解釈しようとすると,-pに空白値のパターンが許されたとすると,mysql -p database1は「database1というパスワードを指定し,-p'your_password'もしくは--password='your_password'の形式しか取れないことを憶えておいてください。
pagerオプション
mysqlコマンドにページャーを指定するには,--pagerオプションを指定するか,pagerサブコマンドを利用します。百聞は一見に如かずと言います。まずは--pagerオプションにlessコマンドを指定して試してみましょう。
$ mysql --pager=less mysql> SELECT NOW();
おわかりいただけたでしょうか。SELECT NOW()ステートメントの結果がいつも通りターミナルに流れるのではなく,lessコマンドに渡されたかのように振る舞います。このステートメントでは1行しか結果が返らないので感慨が薄いのですが…そうですね,
mysql> SHOW TABLES FROM information_schema;
information_schemaデータベースに含まれるテーブルを一覧するためのSQLですが,lessコマンドの意味があるのではないでしょうか。さてこの出力結果を見ていると,INNODB_*というテーブルがいくつかあるのが目につきました。lessコマンドにつなぐことができるのであれば,grepコマンドにつなぐことも簡単です。出力結果からINNODB_*にマッチしそうなテーブルだけをページャーを使ってフィルタリングしてみます。
$ mysql --pager="grep 'INNODB_'" mysql> SHOW TABLES FROM information_schema;
想像した通りに出力されたでしょうか? カラム名の表示やASCIIで引かれた罫線だけの行は出力されませんでした。
これは,mysqlコマンドの出力結果をそのまま全てgrepコマンドに渡したため,grepコマンドによってフィルタリングされてしまったからです。またその一方で,61 rows in set (x.xx sec)の行は"INNODB_"を含まないにも関わらずフィルタリングされることなく出力されています。これはこの行を出力する部分だけがページャーを通さずに直接sprintfでバッファに書き込まれているためなのですが,
さて,pagerオプションには「パイプを含めた複数のコマンド」を指定することもできます。たとえばさっきのgrepコマンドでフィルタリングをしつつ,lessコマンドに渡す,
$ mysql --pager="grep 'INNODB_' | less" mysql> SHOW TABLES FROM information_schema;
とても簡単ですね。しかし,mysqlコマンドを一度終了してpagerオプションをセットするのは少し面倒です。mysqlコマンドで接続したままページャーを切り替えるためのサブコマンド(ドキュメントなどでは単に「コマンド」とされていますが,mysqlコマンド以外のシェルから起動するコマンドと混同を避けるため,mysqlコマンド内の「サブコマンド」というスタンスを取って記述しています)がpagerサブコマンドです。そのまんまですね。