GA

2016/12/03

mysqlコマンドラインクライアントのコマンド集

この記事は MySQL Casual Advent Calendar 2016 の3つ目の窓です。
昨日は kakuka4430 さんの CentOS6.8にtpcc-mysqlを入れようとして失敗した話 でした。

$ mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 8.0.0-labs-opt-log Source distribution

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

mysqlコマンドラインクライアントにはその中に更にコマンドを持っています。
helpを叩くと出てくる、\で始まるやつら(とそのロング形式)


mysql> help

For information about MySQL products and services, visit:
   http://www.mysql.com/
For developer information, including the MySQL Reference Manual, visit:
   http://dev.mysql.com/
To buy MySQL Enterprise support, training, or other products, visit:
   https://shop.mysql.com/

List of all MySQL commands:
Note that all text commands must be first on line and end with ';'
?         (\?) Synonym for `help'.
clear     (\c) Clear the current input statement.
connect   (\r) Reconnect to the server. Optional arguments are db and host.
delimiter (\d) Set statement delimiter.
edit      (\e) Edit command with $EDITOR.
ego       (\G) Send command to mysql server, display result vertically.
exit      (\q) Exit mysql. Same as quit.
go        (\g) Send command to mysql server.
help      (\h) Display this help.
nopager   (\n) Disable pager, print to stdout.
notee     (\t) Don't write into outfile.
pager     (\P) Set PAGER [to_pager]. Print the query results via PAGER.
print     (\p) Print current command.
prompt    (\R) Change your mysql prompt.
quit      (\q) Quit mysql.
rehash    (\#) Rebuild completion hash.
source    (\.) Execute an SQL script file. Takes a file name as an argument.
status    (\s) Get status information from the server.
system    (\!) Execute a system shell command.
tee       (\T) Set outfile [to_outfile]. Append everything into given outfile.
use       (\u) Use another database. Takes database name as argument.
charset   (\C) Switch to another charset. Might be needed for processing binlog with multi-byte charsets.
warnings  (\W) Show warnings after every statement.
nowarning (\w) Don't show warnings after every statement.
resetconnection(\x) Clean session context.

For server side help, type 'help contents'

…これは8.0.0でCTEが使える(labsの)コマンドラインクライアントなんですけど、なんか前に比べて増えてない?;


- \c なんかtypoした時とかよく使う。セミコロンが来る前であれば、入力中のSQLをなかったことに出来る。クォート閉じるの忘れた時とかは、閉じクォートを書いて\c(セミコロンがクォートの中に閉じ込められるから、セミコロンは認識されない)

mysql> INSERT INTO t1 VALUES (1, 'one'), (2, 'two), (3, 'three');
    '> '\c
mysql> 


- \G これ実はmysqlコマンドラインクライアントのコマンドなので、他のクライアントではできない(か、互換性のために実装してるものはあるかも)


MySQL Workbenchはそのまま\Gまでサーバーに投げつけちゃって、シンタックスエラーをもらってる(mysqlコマンドラインクライアントではサーバーに送り付ける前にこの\Gをゴニョってから投げてる)

- pagerの使い方は 第6回 mysqlコマンドラインクライアントにページャーを指定する:MySQL道普請便り|gihyo.jp … 技術評論社 に最近書いた

- useコマンドはコマンドで、USEステートメントもある話は前に 日々の覚書: mysqlコマンドラインクライアントでuseの代わりにcdを使う この辺でちょっとだけ

- editは(まだ空きがあるので)そのうちに。


こいつらを上手く使うとmysqlコマンドラインライフが豊かになるので機会があれば是非。

明日は zurazurataicho さんです。

2016/12/02

ペパボの中の人ではありませんがペパボとの2016年を振り返って

このエントリーは  pepabo Advent Calendar 2016 の2日目です。
ちなみに GMOペパボ の人間ではありません。

俺は2016/12/02現在 GMOペパボのものすごく近くの会社 に勤めているので、去年の 論理削除Casua Talks #1 (おや…? #1から1年たつのに#2がないぞ…?) でしゃべらせてもらったのを切っ掛けに、今年は2回、まとまった時間を作ってもらってペパボに(内部の勉強会で)遊びにいきました。






1回目の勉強会の 5.7 + 雑な方は「へぇー、その機能、2年くらい前に言ってたよね。2年くらい前に見たわ」的なマサカリで俺が死ぬんじゃないかとドキドキしていたんですが、

すっげえ楽しそうに話してて、「この人、ほんと MySQL のこと好きなんだなー」と思って。
今回 MySQL 5.7 導入しようとしたときにも顔が浮かんだし。つまり背中を押してもらえたということだ。


この記事を読んだ時にすごくうれしかったです。今もたまに読み返しています。



2回目のGaleraの方は資料無し、ホワイトボードにごりごり思いついたことを書くスタイルでやらせてもらいました。というか参加してくれた方みんなフツーのMySQLのレプリケーション詳しくてすんごい話がしやすかった。Dockerでサクッと上げたPXCに「つまりRBRなのでこういうことすると死にます、というか自殺してフル同期かかります」って言ってサクッと落としてみるとか。


Galera Cluster勉強会@ペパボ – inamuu.com

楽しんでいただけたようで何よりです。



物理的に近く に位置しているものの、「ペパボの人ってすげーなー」「あんちぽさんよくやるなー」「ペパボの常様が常様の中で一番好きだわー」とか思っていただけのパンピーなので、遊びに行かせてもらってすごく楽しかったです。

あんちぽさん と「俺の知ってるMySQLのことは何でも伝えられるので、ウチのWEBサーバー周りの人にバーターで色々教えてください」なんて話をして、来年はもっと行き来ができればいいなと思っています。







以上、GMOペパボの福利厚生からでした。来年もまたよろしくお願いします ;)

2016/12/01

MySQLのNOW関数はどのようにして安全にスレーブでリプレイされるのか

このエントリーは MySQL Casual Advent Calendar 2016 の1日目の記事です!

日々の覚書: 複数のテーブルのON UPDATE current_timestampなカラムの値を揃える方法を考える の派生形なんですが、 "CURRENT_TIMESTAMP および CURRENT_TIMESTAMP() は NOW() のシノニムです。" なので、ちょっとだけ篠田さんの「使い慣れたSQLに潜む実装依存」に対する補足でもあったりします。




NOW関数は デフォルトでは 「そのステートメントの開始時刻」を返します。
この動作の検証としては以下のステートメントが有名でしょう。

mysql57> SELECT NOW(6), SLEEP(1), NOW(6);
+----------------------------+----------+----------------------------+
| NOW(6)                     | SLEEP(1) | NOW(6)                     |
+----------------------------+----------+----------------------------+
| 2016-12-01 10:16:16.596803 |        0 | 2016-12-01 10:16:16.596803 |
+----------------------------+----------+----------------------------+
1 row in set (1.00 sec)

mysql57> SELECT SYSDATE(6), SLEEP(1), SYSDATE(6);
+----------------------------+----------+----------------------------+
| SYSDATE(6)                 | SLEEP(1) | SYSDATE(6)                 |
+----------------------------+----------+----------------------------+
| 2016-12-01 10:16:29.699001 |        0 | 2016-12-01 10:16:30.699117 |
+----------------------------+----------+----------------------------+
1 row in set (1.00 sec)

NOW関数はステートメントの中で2回呼ばれていますが、同じ値を返します。
それに対しSYSDATE関数は「関数が実行された時点の時刻」を返すため、SLEEP(1) をはさんでもう一度実行された時には違う結果を返します。

さてさて、これがレプリケーションをはさむとどうなるか。


master [localhost] {msandbox} (d1) > SELECT @@binlog_format;
+-----------------+
| @@binlog_format |
+-----------------+
| STATEMENT       |
+-----------------+
1 row in set (0.00 sec)

master [localhost] {msandbox} (d1) > INSERT INTO sbr VALUES ('NOW', NOW(6)), ('SYSDATE', SYSDATE(6));
Query OK, 2 rows affected, 1 warning (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 1

master [localhost] {msandbox} (d1) > SHOW WARNINGS;
+-------+------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Level | Code | Message                                                                                                                                                                                                  |
+-------+------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Note  | 1592 | Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it uses a system function that may return a different value on the slave. |
+-------+------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

master [localhost] {msandbox} (d1) > SELECT * FROM sbr;
+---------+----------------------------+
| func    | dt                         |
+---------+----------------------------+
| NOW     | 2016-12-01 11:35:23.865477 |
| SYSDATE | 2016-12-01 11:35:23.871343 |
+---------+----------------------------+
2 rows in set (0.00 sec)

slave1 [localhost] {msandbox} (d1) > SELECT * FROM sbr;
+---------+----------------------------+
| func    | dt                         |
+---------+----------------------------+
| NOW     | 2016-12-01 11:35:23.865477 |
| SYSDATE | 2016-12-01 11:35:23.874431 |
+---------+----------------------------+
2 rows in set (0.00 sec)

SBRの場合、NOW関数はマスターと同じ値が記録されるけれど、SYSDATE関数は同じ値が記録されない。「スレーブでSQLをリプレイした時の現在時刻」になってしまう。


master [localhost] {msandbox} (d1) > SELECT @@binlog_format;
+-----------------+
| @@binlog_format |
+-----------------+
| ROW             |
+-----------------+
1 row in set (0.00 sec)

master [localhost] {msandbox} (d1) > INSERT INTO rbr VALUES ('NOW', NOW(6)), ('SYSDATE', SYSDATE(6));
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

master [localhost] {msandbox} (d1) > SELECT * FROM rbr;
+---------+----------------------------+
| func    | dt                         |
+---------+----------------------------+
| NOW     | 2016-12-01 11:36:06.626105 |
| SYSDATE | 2016-12-01 11:36:06.626309 |
+---------+----------------------------+
2 rows in set (0.00 sec)

slave1 [localhost] {msandbox} (d1) > SELECT * FROM rbr;
+---------+----------------------------+
| func    | dt                         |
+---------+----------------------------+
| NOW     | 2016-12-01 11:36:06.626105 |
| SYSDATE | 2016-12-01 11:36:06.626309 |
+---------+----------------------------+
2 rows in set (0.00 sec)

それに対してRBRは関数をリプレイしないのでどちらでも問題なく動く(そもそも「関数の結果」をバイナリーログに書き込むため、スレーブではリプレイされない)
MIXEDの場合、SYSDATE関数がレプリケーションアンセーフな関数(非決定性関数)のためRBRにフォールバックする。


NOW関数の仕掛けはこうだ。

- クエリー開始時にTIMESTAMPセッション変数の中に値が入っているかどうかを探す
  - ちなみにTIMESTAMP変数は32ビット符号つきかつ負値をバリデーションではじいている、つまりunixtime
  - TIMESTAMP変数が0ならば、thd->query_start() を読んでTIMESTAMP変数に入れる
- TIMESTAMP変数をunixtimeからDATETIMEに変換して返す
  - クエリー終了まで、一度セットされたTIMESTAMP変数を使い続ける
- クエリー終了後、もとのTIMESTAMP変数が0だった場合は0に戻す


mysqlbinlogを出すと、しょっちゅう SET TIMESTAMP= .. で指定されているのを見ることができる。これは、そういう(NOW関数をスレーブでも決定性にするための)意味だったのだ。

# at 6439
#161201 11:35:23 server id 1  end_log_pos 6526 CRC32 0x2e37a667         Query   thread_id=9     exec_time=0     error_code=0
SET TIMESTAMP=1480559723.865477/*!*/;
BEGIN
/*!*/;
# at 6526
#161201 11:35:23 server id 1  end_log_pos 6671 CRC32 0xab51a6f0         Query   thread_id=9     exec_time=0     error_code=0
SET TIMESTAMP=1480559723.865477/*!*/;
INSERT INTO sbr VALUES ('NOW', NOW(6)), ('SYSDATE', SYSDATE(6))
/*!*/;
# at 6671
#161201 11:35:23 server id 1  end_log_pos 6702 CRC32 0xa975b625         Xid = 73
COMMIT/*!*/;


豆知識でした。


明日 12/2 は @kakuka4430 さんです!

2016/11/22

MySQL 5.7.16, 8.0.0現在、slave_skip_errorsはエラーコードの3000番台をスキップできない(MySQL 5.7.19, 8.0.2で修正)

日々の覚書: MySQL 5.7.6でエラーコードが変わった件 の時からMySQLのエラーコードに3000番台が加わった。

それまで1000番台はサーバーサイド、2000番台はクライアントサイドだけだったものが、3000番台もサーバーサイドのエラーコードとして設定されている(エラー番号はMySQL 5.7.16現在)



エラー番号 マクロ 備考
1000~1884 ER_*, WARN_* サーバーサイドエラー
2000~2062 CR_* クライアントサイドエラー(libmysqlclientの場合)
3000~3193 ER_* サーバーサイドエラー(5.7.6から)
例えばレプリケーションのI/OスレッドはMySQLサーバーの中にいるけれど実際はクライアントなので2000番台のエラーもハンドルする必要があったりして、ちょこちょこと"2000より小さければサーバーサイドエラー", "2000以上ならクライアントサイドエラー" みたいな判定があったりする。


もうお気付きだろう。3000番台のエラー番号は2000より大きい。

MAX_SLAVE_ERROR マクロは2000で、

https://github.com/mysql/mysql-server/blob/mysql-5.7.16/sql/rpl_slave.h#L66

ここ とか ここ とか ここ とかで err_code < MAX_SLAVE_ERROR で判定されている。


というわけでバグレポートしたのでしたん。

MySQL Bugs: #83184: Can't set slave_skip_errors > 3000


【2017/07/27 13:15】
MySQL 5.7.19, 8.0.2で修正されました!

https://bugs.mysql.com/bug.php?id=83184

2016/11/18

WindowsでもRabbitとRabbiterを使いたい

初めて成功したので忘れないうちにメモ。

0. CygwinのRubyにパスが通ってると、rabbitを起動した時にCygwinのRubyを掴もうとすることがあってダメぽになることがある。

1. RubyInstallerでRubyをインストール。取り敢えず2.3.1で上手く動いた。 Downloads

2. 対応したDevKitをダウンロードして適当な場所に展開(取り敢えず C:\Ruby23-x64\DevKit に展開して上手くいってる) Development Kit · oneclick/rubyinstaller Wiki によると "Download it, run it to extract it somewhere (permanent)." らしい。消しちゃダメなのか。

> ruby dk.rb init
> ruby dk.rb install


2-1. `ruby dk.rb install` で "Invalid configuration or no Rubies listed. Please fix 'config.yml'" と言われる。ruby.exeの場所が見付けられていないので、config.ymlを修正してもう一度。

3. これでやっと `gem install rabbit rabbiter` できるかと思いきや、SSLのエラーを食らう。

ERROR:  Could not find a valid gem 'rabbit' (>= 0), here is why:
          Unable to download data from https://rubygems.org/ - SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (https://api.rubygems.org/specs.4.8.gz)
ERROR:  Could not find a valid gem 'rabbiter' (>= 0), here is why:
          Unable to download data from https://rubygems.org/ - SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (https://api.rubygems.org/specs.4.8.gz)

bundle install がこけるようになった の "rubygems-updateをインストールする" で解決した。 bundle install がこけるようになった(改訂版) には "rubygems 2.4にはバグがあってこの方法はとってはいけない" みたいなことも書いてあるけれど、2016年10月現在の rubygems-update の最新版は2.6.7だったのでもういいかなと思ってやってみた。
取りあえず問題は出ていない。

> gem install --local rubygems-update-2.6.8.gem
> update_rubygems

4. ようやくRabbitとRabbiterが入った。後は楽しむだけ!

> gem install rabbit
> gem install rabbiter


( ´-`).oO(ところで、rabbitのsample.rdとかsample.mdとかを動かそうとするとrabbitがハングするの俺だけ…?

2016/10/19

MySQL 5.7, MySQL 8.0 でちょっとだけmysqladmin shutdownが変わる

日々の覚書: MySQL 5.7.9でSHUTDOWN *ステートメント* が実装されたよ! (我ながらなんて雑なエントリーなんだ。。)のタイミングで、mysqladmin shutdownの内部動作にも変更が入っていて、

A new SHUTDOWN SQL statement is available. This provides an SQL-level interface to the same functionality previously available using the mysqladmin shutdown command or the mysql_shutdown() C API function. See SHUTDOWN Syntax.
The mysql_shutdown() function and corresponding COM_SHUTDOWN client/server protocol command are deprecated and will be removed in a future version of MySQL. Instead, use mysql_query() to execute a SHUTDOWN statement.

MySQL :: MySQL 5.7 Release Notes :: Changes in MySQL 5.7.9 (2015-10-21, General Availability)


サーバーがMySQL 5.7.9よりも前のバージョンの場合は mysql_shutdown C API を、5.7.9とそれより後のバージョンの場合は SHUTDOWNステートメント を発行するようになっている。

https://github.com/mysql/mysql-server/blob/mysql-5.7.9/client/mysqladmin.cc#L713-L718


MySQL 5.7.8とそれより前のmysqladmin shutdownはこのmysql_shutdown C APIをずっと使っていたんだけれど、MySQL 8.0.0ではこのmysql_shutdown C APIが削除された。


The deprecated mysql_shutdown() C API function and corresponding COM_SHUTDOWN client/server protocol command have been removed. Instead, use mysql_query() to execute a SHUTDOWN statement.

MySQL :: MySQL 8.0 Release Notes :: Changes in MySQL 8.0.0 (2016-09-12, Development Milestone)


これによって、MySQL 5.7.8とそれ以前の mysqladmin shutdown はMySQL 8.0.0とそれ以降をシャットダウンできなくなっている。そして、MySQL 8.0.0の mysqladmin shutdown もMySQL 5.7.8とそれより前のバージョンのサーバーをシャットダウンできない。

$ /usr/mysql/5.6.34/bin/mysqladmin -S /usr/mysql/8.0.0/data/mysql.sock shutdown
/usr/mysql/5.6.34/bin/mysqladmin: shutdown failed; error: 'Unknown command'

5.6 mysqld 5.7 mysqld 8.0 mysqld
5.6 mysqladmin o o x
5.7 mysqladmin o o o
8.0 mysqladmin x o o
こんな感じ。好き好んで違うバージョンのmysqladminでmysqldをシャットダウンするとは思わないけれど、mysqld_multi使ってたらたまたま気が付きました。

2016/10/18

.mylogin.cnfはmysqldの設定に影響を及ぼすのか

なんかこう、如何にも `.my.login.cnf` が当たり前のように読み取られる前提でドキュメントに書いてあって、実際問題 `mysqld` も `~/.mylogin.cnf` をstatsしているので、MySQLサーバーも `.mylogin.cnf` を読むんじゃないかと思った次第。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.2.6 オプションファイルの使用


$ strace -f -e stat,open bin/mysqld_safe |& grep "cnf"
[pid 10841] stat("/etc/my.cnf", {st_mode=S_IFREG|0644, st_size=4317, ...}) = 0
[pid 10841] open("/etc/my.cnf", O_RDONLY) = 3
[pid 10841] stat("/etc/mysql/my.cnf", 0x7ffd4860c300) = -1 ENOENT (No such file or directory)
[pid 10841] stat("/usr/local/mysql/etc/my.cnf", 0x7ffd4860c300) = -1 ENOENT (No such file or directory)
[pid 10841] stat("/usr/mysql/5.7.16/my.cnf", 0x7ffd4860c300) = -1 ENOENT (No such file or directory)
[pid 10841] stat("/home/yoku0825/.my.cnf", 0x7ffd4860c300) = -1 ENOENT (No such file or directory)
[pid 10841] stat("/home/yoku0825/.mylogin.cnf", {st_mode=S_IFREG|0600, st_size=24, ...}) = 0
[pid 10841] open("/home/yoku0825/.mylogin.cnf", O_RDONLY) = 3
[pid 11202] stat("/etc/my.cnf", {st_mode=S_IFREG|0644, st_size=4317, ...}) = 0
[pid 11202] open("/etc/my.cnf", O_RDONLY) = 3
[pid 11202] stat("/etc/mysql/my.cnf", 0x7fffcf68d980) = -1 ENOENT (No such file or directory)
[pid 11202] stat("/usr/local/mysql/etc/my.cnf", 0x7fffcf68d980) = -1 ENOENT (No such file or directory)
[pid 11202] stat("/usr/mysql/5.7.16/my.cnf", 0x7fffcf68d980) = -1 ENOENT (No such file or directory)
[pid 11202] stat("/home/yoku0825/.my.cnf", 0x7fffcf68d980) = -1 ENOENT (No such file or directory)
[pid 11202] stat("/home/yoku0825/.mylogin.cnf", {st_mode=S_IFREG|0600, st_size=24, ...}) = 0
[pid 11202] open("/home/yoku0825/.mylogin.cnf", O_RDONLY) = 3

しっかり開いてしっかり読んでる。
とはいえ、 `.mylogin.cnf` を作る `mysql_config_editor` は変な書式をしていて、


$ mysql_config_editor --help
mysql_config_editor Ver 1.0 Distrib 5.7.16, for Linux on x86_64
Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

MySQL Configuration Utility.
Usage: mysql_config_editor [program options] [command [command options]]
  -#, --debug[=#]     This is a non-debug version. Catch this and exit.
  -?, --help          Display this help and exit.
  -v, --verbose       Write more information.
  -V, --version       Output version information and exit.

Variables (--variable-name=value)
and boolean options {FALSE|TRUE}  Value (after reading options)
--------------------------------- ----------------------------------------
verbose                           FALSE

Where command can be any one of the following :
       set [command options]     Sets user name/password/host name/socket/port
                                 for a given login path (section).
       remove [command options]  Remove a login path from the login file.
       print [command options]   Print all the options for a specified
                                 login path.
       reset [command options]   Deletes the contents of the login file.
       help                      Display this usage/help information.


`mysql_config_editor set --help` とサブコマンドで `--help` しないと全然わからない。。


$ mysql_config_editor set --help
mysql_config_editor Ver 1.0 Distrib 5.7.16, for Linux on x86_64
Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

MySQL Configuration Utility.

Description: Write a login path to the login file.
Usage: mysql_config_editor [program options] [set [command options]]
  -?, --help          Display this help and exit.
  -h, --host=name     Host name to be entered into the login file.
  -G, --login-path=name
                      Name of the login path to use in the login file. (Default
                      : client)
  -p, --password      Prompt for password to be entered into the login file.
  -u, --user=name     User name to be entered into the login file.
  -S, --socket=name   Socket path to be entered into login file.
  -P, --port=name     Port number to be entered into login file.
  -w, --warn          Warn and ask for confirmation if set command attempts to
                      overwrite an existing login path (enabled by default).
                      (Defaults to on; use --skip-warn to disable.)

Variables (--variable-name=value)
and boolean options {FALSE|TRUE}  Value (after reading options)
--------------------------------- ----------------------------------------
host                              (No default value)
login-path                        client
user                              (No default value)
socket                            (No default value)
port                              (No default value)
warn                              TRUE

`.mylogin.cnf` に書き込む内容を指定するには何故かオプション形式で指定しないといけない(思うに、難読化しちゃって部分修正が面倒なので、入力の段階でバリデーションをかける意図なのかしらん)ので、ソースをゴニョらない限りは `host`, `user`, `socket`, `port` 以外のオプションは埋め込めない。

が、セクションの名前を決める `--login-path` は好きに埋め込めそうだし、 `user`, `socket`, `port` は `[mysqld]` セクションにも同じ名前のオプションがあるので案外埋め込めるんじゃないかと思って埋め込んでみた。


$ mysql_config_editor set --login-path=mysqld --socket=/home/yoku0825/percona-xtrabackup-2.4.4/mysql.sock --port=11111

$ mysql_config_editor print --all
[mysqld]
socket = /home/yoku0825/percona-xtrabackup-2.4.4/mysql.sock
port = 11111

$ bin/mysqld_safe &
[1] 13416
2016-10-18T01:52:25.335653Z mysqld_safe Logging to '/usr/mysql/5.7.16/data/error.log'.
2016-10-18T01:52:25.374749Z mysqld_safe Starting mysqld daemon with databases from /usr/mysql/5.7.16/data

$ bin/mysql -S /home/yoku0825/percona-xtrabackup-2.4.4/mysql.sock -uroot
mysql> SELECT @@socket;
+----------------------------------------------------+
| @@socket                                           |
+----------------------------------------------------+
| /home/yoku0825/percona-xtrabackup-2.4.4/mysql.sock |
+----------------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT @@port;
+--------+
| @@port |
+--------+
|  11111 |
+--------+
1 row in set (0.00 sec)

うん、しっかりがっつり `.mylogin.cnf` 読んでやがる。

ところで読んでるってことは…


$ mysql_config_editor reset
$ mysql_config_editor set --login-path=mysqld --socket="$(echo '/home/yoku0825/percona-xtrabackup-2.4.4/mysql.sock' ; echo 'skip-grant-tables')"
$ mysql_config_editor print --all
[mysqld]
socket = /home/yoku0825/percona-xtrabackup-2.4.4/mysql.sock
skip-grant-tables

( ゚д゚) あっ


mysql> SHOW GRANTS;
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement

( ゚д゚) あっ、あっ。


嫌がらせくらいにしか使えなさそうだけれども。


【2016/10/18 19:14】
Verifiedいただきました。

MySQL Bugs: #83420: mysql_config_editor should validate parameters