2013年7月2日火曜日

MySQL Utilitiesのmysqlusercloneを試す

先日rpmで突っ込んだMySQL Utilitiesのmysqlusercloneを試してみる。

http://dev.mysql.com/doc/workbench/en/mysqluserclone.html

やってくれることは、既存のユーザー情報をコピーして新しいユーザーを作ってくれる。
CREATE USER .. LIKE ..(こんな構文ないけど、ニュアンスで感じて下さい)みたいな感じ。

取り敢えず、--sourceでユーザーのコピー元MySQLに`ログインするためのDSN'、--destinationでユーザーのコピー先MySQLに`ログインするためのDSN'を指定する。

ドキュメントには特に書いてないけど、--sourceの暗黙のデフォルトはroot@localhost:3306、--destinationを省略すると--sourceと同じコネクションの中でGRANTを叩く。

my.cnfの[client]セクションは読んでる。他のところはよく判らない。

基本的な動作。

$ mysqluserclone --source root@localhost:/usr/mysql/5.6.12/data/mysql.sock tpcc@% tpcc2@localhost
# Source on localhost: ... connected.
# Cloning 1 users...
# Cloning tpcc@% to user tpcc2@localhost
# ...done.

/usr/mysql/5.6.12/data/mysql.sockを使ってroot@localhostでログインして、tpcc@%というユーザーの情報をコピーして、tpcc2@localhostというユーザーを作る。
ジェネラルログはこんな感じ。

$ less general.log
130702 13:00:30    17 Connect   root@localhost on
                   17 Query     SET NAMES 'latin1' COLLATE 'latin1_swedish_ci'
                   17 Query     SET @@session.autocommit = OFF
                   17 Query     SHOW VARIABLES LIKE 'READ_ONLY'
                   17 Query     COMMIT
                   17 Query     SHOW VARIABLES LIKE 'VERSION'
                   17 Query     COMMIT
                   17 Query     SELECT * FROM mysql.user WHERE user = 'tpcc' and host = '%'
                   17 Query     COMMIT
                   17 Query     SELECT * FROM mysql.user WHERE user = 'tpcc2' and host = 'localhost'
                   17 Query     COMMIT
                   17 Query     SELECT * FROM mysql.user WHERE user = 'tpcc2' and host = 'localhost'
                   17 Query     COMMIT
                   17 Query     SELECT CURRENT_USER()
                   17 Query     COMMIT
                   17 Query     SHOW GRANTS FOR 'tpcc'@'%'
                   17 Query     COMMIT
                   17 Query     SELECT * FROM mysql.user WHERE user = 'tpcc2' and host = 'localhost'
                   17 Query     COMMIT
                   17 Query     CREATE USER 'tpcc2'@'localhost'
                   17 Query     GRANT USAGE ON *.* TO 'tpcc2'@'localhost'
                   17 Query     SELECT * FROM mysql.user WHERE user = 'tpcc2' and host = 'localhost'
                   17 Query     COMMIT
                   17 Query     GRANT ALL PRIVILEGES ON `tpcc`.* TO 'tpcc2'@'localhost'

ユーザー情報。

mysql> SHOW GRANTS FOR tpcc@'%';
+-----------------------------------------------------------------------------------------------------+
| Grants for tpcc@%                                                                                   |
+-----------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'tpcc'@'%' IDENTIFIED BY PASSWORD '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29' |
| GRANT ALL PRIVILEGES ON `tpcc`.* TO 'tpcc'@'%'                                                      |
+-----------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> SHOW GRANTS FOR tpcc2@localhost;
+---------------------------------------------------------+
| Grants for tpcc2@localhost                              |
+---------------------------------------------------------+
| GRANT USAGE ON *.* TO 'tpcc2'@'localhost'               |
| GRANT ALL PRIVILEGES ON `tpcc`.* TO 'tpcc2'@'localhost' |
+---------------------------------------------------------+
2 rows in set (0.00 sec)

おっとっと。。パスワードは指定しないとコピーしてくれないのね。
黙って同じものにしてくれて良いのに(´・ω・`)


$ mysqluserclone --source root@127.0.0.1:3306 tpcc@% tpcc3:<password>@'127.0.0.1'
# Source on 127.0.0.1: ... connected.
# Cloning 1 users...
# Cloning tpcc@% to user tpcc3:test@127.0.0.1
# ...done.

$ less general.log
130702 13:05:16    21 Connect   root@localhost on
                   21 Query     SET NAMES 'latin1' COLLATE 'latin1_swedish_ci'
                   21 Query     SET @@session.autocommit = OFF
                   21 Query     SHOW VARIABLES LIKE 'READ_ONLY'
                   21 Query     COMMIT
                   21 Query     SHOW VARIABLES LIKE 'VERSION'
                   21 Query     COMMIT
                   21 Query     SELECT * FROM mysql.user WHERE user = 'tpcc' and host = '%'
                   21 Query     COMMIT
                   21 Query     SELECT * FROM mysql.user WHERE user = 'tpcc3' and host = '127.0.0.1'
                   21 Query     COMMIT
                   21 Query     SELECT * FROM mysql.user WHERE user = 'tpcc3' and host = '127.0.0.1'
                   21 Query     COMMIT
                   21 Query     SELECT CURRENT_USER()
                   21 Query     COMMIT
                   21 Query     SHOW GRANTS FOR 'tpcc'@'%'
                   21 Query     COMMIT
                   21 Query     SELECT * FROM mysql.user WHERE user = 'tpcc3' and host = '127.0.0.1'
                   21 Query     COMMIT
                   21 Query     CREATE USER 'tpcc3'@'127.0.0.1' IDENTIFIED BY PASSWORD '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29'
                   21 Query     GRANT USAGE ON *.* TO 'tpcc3'@'127.0.0.1'
                   21 Query     SELECT * FROM mysql.user WHERE user = 'tpcc3' and host = '127.0.0.1'
                   21 Query     COMMIT
                   21 Query     GRANT ALL PRIVILEGES ON `tpcc`.* TO 'tpcc3'@'127.0.0.1'

mysql> SHOW GRANTS FOR tpcc3@127.0.0.1;
+--------------------------------------------------------------------------------------------------------------+
| Grants for tpcc3@127.0.0.1                                                                                   |
+--------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'tpcc3'@'127.0.0.1' IDENTIFIED BY PASSWORD '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29' |
| GRANT ALL PRIVILEGES ON `tpcc`.* TO 'tpcc3'@'127.0.0.1'                                                      |
+--------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

どうせもとのパスワードが分からなくてもIDENTIFIED BY PASSWORD '*..'で同じパスワードはコピーできるんだから、クローン元ユーザーと同じパスワードを設定するようなオプションが欲しいなぁ。
取り敢えずこれを使って、スキーマ名のtypoでサービスを止めかけるという惨事は二度と起こさないで済むようにしたい。。orz

ちなみに量産もできるぽい。

$ mysqluserclone --source root@127.0.0.1:3306 tpcc@% tpcc10@'127.0.0.1' tpcc11@'127.0.1.1' tpcc12@'127.0.2.1'
# Source on 127.0.0.1: ... connected.
# Cloning 3 users...
# Cloning tpcc@% to user tpcc10@127.0.0.1
# Cloning tpcc@% to user tpcc11@127.0.1.1
# Cloning tpcc@% to user tpcc12@127.0.2.1
# ...done.

ますますパスワードのコピーが欲しい。。

0 件のコメント :

コメントを投稿