b.l0g.jp     About     Archive     Feed

MySQLコマンドラインツールで使えるコマンド小ネタ

知らなくても何とかなるけど、知っておくと役に立つmysqlシェルから使えるコマンド。

systemコマンド

MySQLのプロンプトを開いたままで、ロードアベレージを見たいとか、SQLを書いておいたファイル名を見たい、という時は、OSのシェルで実行できるコマンドをMySQLシェルから実行するsystemコマンドを使えばよい。

  
mysql> system uptime
  
10:47:48 up 24 min, 5 users, load average: 3.94, 3.68, 2.57

mysql> system ls
  
test.sh sample01.sql
  

teeコマンド

実行結果をターミナルにも表示するがファイルにも保存しておきたい時はteeコマンド。ファイルへの書き出しをやめる時はnotee。ファイルには、プロンプトから入力した文字列なども全部追記されていく。

  
mysql> tee output.txt
  
mysql> show tables;
  
+-------------+
  
| Tables\_in\_test |
  
+-------------+
  
| TABLE01 |
  
| TABLE02 |
  
| TABLE03 |
  
+-------------+
  
3 rows in set (0.00 sec)
  
mysql> notee
  
Outfile disabled.
  
mysql> quit

$ cat output.txt
  
mysql> show tables;
  
+-------------+
  
| Tables\_in\_test |
  
+-------------+
  
| TABLE01 |
  
| TABLE02 |
  
| TABLE03 |
  
+-------------+
  
3 rows in set (0.00 sec)
  
3 rows in set (0.00 sec)
  
mysql> notee
  
$
  

pagerコマンド

  
mysql> pager less;
  

で、ページャをlessにできるので、実行結果が長い時などに重宝する。これは結構有名な気がするが、それだけではなく、grepなどのコマンドをセットすることもできるので、いろんなことができる。ちなみにlessの -S オプションをつけると、カラムが多くて横に広がってしまう結果も横スクロールできるようになる。

  
mysql> pager grep Behind
  
PAGER set to 'grep Behind'
  
mysql> show slave status\G
  
Seconds\_Behind\_Master: 3133
  
1 row in set (0.00 sec)
  

こんな感じで必要な行だけを取り出すこともできる。また、パイプも使うことができるので、以下のように組み合わせることも可能。あんまりいい例が考え付かなくて微妙w

  
mysql> select * from test;
  
+--+--+--+--+--+--+--+--+
  
| a | b | c | d | e | f | g | h |
  
+--+--+--+--+--+--+--+--+
  
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
  
+--+--+--+--+--+--+--+--+
  
1 row in set (0.01 sec)

mysql> pager grep -v '-' | tr -d '|'
  
PAGER set to 'grep -v '-' | tr -d '|"
  
mysql> select * from test;
  
a b c d e f g h
  
1 2 3 4 5 6 7 8
  
1 row in set (0.00 sec)
  

ページャを元に(標準出力に)戻すには

  
mysql> nopager;
  
PAGER set to stdout
  

MySQLスローログの手動ローテート

MySQLのスローログは、通常それほど大量に出るものではないからか、自動でローテートされるような設定は特にない。しかし、負荷が上がったりしてスローログが大量に出てしまい、ローテートしたい場合はよくあるだろう。手動でローテートする場合は以下のように行う。

この例は、MySQLのデータディレクトリ(datadir)が /var/lib/mysql で、スローログファイル名(slow_query_log_file)がmysql-slow.logの場合。

  
$ cd /var/lib/mysql
  
$ mv mysql-slow.log mysql-slow.log.old
  
$ mysqladmin flush-logs
  
または
  
mysql> flush logs;
  

mysqladmin flush-logs あるいは flush logs で、ログファイルを開き直すことができる。

なお、5.1.12以降だとログ出力をコンソールからオフにできるので、オフにしてからflush-logsし、その後オンに戻すとよいだろう。

  
mysql> set global slow\_query\_log = 'OFF';
  
mysql> set global slow\_query\_log = 'ON';
  

ここで、MySQL5.1以前のバージョンでは「mysqladmin flush-logs」を実行すると、バイナリログや一般クエリログも全部まとめてローテートされてしまう。binlogを有効にしているサーバ(レプリケーションしている構成のマスタなど)では注意した方がいいかもしれない。

なお、5.5からは、


# スローログだけ開き直す

mysql> flush slow logs;

# 一般クエリログだけ開き直す

mysql> flush general logs;

# バイナリログだけローテート

mysql> flush binary logs;

# エラーログだけローテート

mysql> flush error logs;
  

というように、種類を指定できるようになっている。

(2014/12/17 エラーログについてコメントで指摘いただいたので追加。情報提供ありがとうございます)

ちなみにlogrotateで定期的にローテートする場合はこうやるそうだ。

[MySQL の slowlog を logrotate する方法 Carpe Diem](http://www.sssg.org/blogs/naoya/archives/1251)

定期的にローテートする必要があるほどスローログが出るままにするってのはどうかと思うが、そういうこともあるかもw

Cactiで一定値以上になるとグラフが正常に描画されない時

Cactiを使っていると、下の画像のように、ある一定の値以上をグラフに描画できない時がある。この例の場合、青い線であらわされたout-boundのトラフィックが80Mbpsを超えるとグラフが描画されていない。

このような場合は、以下を確認する。

トラフィックの場合、値を32ビットカウンタで取得していないか。

64ビットカウンタで値を取得しないと、桁あふれが起きてグラフが正常に描画されない。ホストの編集画面(Console → Devices → ホストをクリック)のAssociated Data Queriesで「SNMP - Interface Statistics 64bit only」を選ぶ。

そのグラフの扱える最大値を超えていないか。

グラフの編集画面(Console → Data Source → ホスト名 - 分類 - 項目(たとえば hogehoge-db01 - Traffic - eth0 のような)) のMaximum Valueの値が、小さく設定されているようなら、これを大きくしてみる。

RRDファイルに設定されている最大値を超えていないか。

RRDファイルにも各値の最大値が設定されている。これを無限大に設定してやる。以下は、上の画像のようにトラフィックが途切れる場合の対策の例。

  
$ rrdtool info hogehoge-db01\_traffic\_in_200.rrd

filename = "mwap-r10\_traffic\_in_200.rrd"
  
rrd_version = "0003"
  
step = 300
  
last_update = 1352714073
  
ds[traffic_in].type = "COUNTER"
  
ds[traffic\_in].minimal\_heartbeat = 600
  
ds[traffic_in].min = 0.0000000000e+00
  
ds[traffic_in].max = 1.0000000000e+07 ← ここが最大値
  
ds[traffic\_in].last\_ds = "3293068416"
  
ds[traffic_in].value = 1.2345678909e+08
  
ds[traffic\_in].unknown\_sec = 0
  
ds[traffic_out].type = "COUNTER"
  
ds[traffic\_out].minimal\_heartbeat = 600
  
ds[traffic_out].min = 0.0000000000e+00
  
ds[traffic_out].max = 1.0000000000e+07 ← ここが最大値
  
ds[traffic\_out].last\_ds = "2054038296"
  
ds[traffic_out].value = 1.2345678909e+08
  
ds[traffic\_out].unknown\_sec = 0
  
(後略)
  

rrdtool tuneコマンドで変更

  
$ sudo rrdtool tune hogehoge-db01\_traffic\_in\_200.rrd -a traffic\_in:U
  
$ sudo rrdtool tune hogehoge-db01\_traffic\_in\_200.rrd -a traffic\_out:U
  
  
$ rrdtool info hogehoge-db01\_traffic\_in_200.rrd

filename = "mwap-r10\_traffic\_in_200.rrd"
  
rrd_version = "0003"
  
step = 300
  
last_update = 1352714073
  
ds[traffic_in].type = "COUNTER"
  
ds[traffic\_in].minimal\_heartbeat = 600
  
ds[traffic_in].min = 0.0000000000e+00
  
ds[traffic_in].max = NaN ← 無限大に変わってる
  
ds[traffic\_in].last\_ds = "3293068416"
  
ds[traffic_in].value = 1.2345678909e+08
  
ds[traffic\_in].unknown\_sec = 0
  
ds[traffic_out].type = "COUNTER"
  
ds[traffic\_out].minimal\_heartbeat = 600
  
ds[traffic_out].min = 0.0000000000e+00
  
ds[traffic_out].max = NaN ← 無限大に変わってる
  
ds[traffic\_out].last\_ds = "2054038296"
  
ds[traffic_out].value = 1.2345678909e+08
  
ds[traffic\_out].unknown\_sec = 0
  
(後略)