先日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 件のコメント :
コメントを投稿