そろばんのしょ(第3版第2刷)

日々学んだことや、どーでもいいことを。基本は自分の備忘録

MySQLでユーザーを作ったときのハッシュ値から同じ`PASSWORD`でユーザーを生成する

MySQL5.7の話。本日隣の人から教えてもらった事。

ユーザーを作るとき等でAPサーバーのIPが追加や変更されるときにハッシュ値から同じパスワードを設定することができる。

例えば、

fuki [(none)]> create user 'fuki'@'127.0.0.1' identified by 'Abc123';
Query OK, 0 rows affected (0.07 sec)

fuki [(none)]> SELECT user,host,authentication_string FROM mysql.user WHERE user='fuki' ORDER BY 1,2;
+------+-----------+-------------------------------------------+
| user | host      | authentication_string                     |
+------+-----------+-------------------------------------------+
| fuki | 127.0.0.1  | *7A8BBCB18A250055A6BB98ECFA33A8174D219504 |
+------+-----------+-------------------------------------------+
1 rows in set (0.00 sec)

上記のようなfukiを作るとパスワードはauthentication_stringにあるようなハッシュ値になる。 このハッシュ値を利用してユーザーを再作成するときはIDENTIFIED BYのあとにPASSWORDをつける。

mysql [(none)]> create user 'fuki'@'localhost' identified by password '*7A8BBCB18A250055A6BB98ECFA33A8174D219504';
Query OK, 0 rows affected, 1 warning (0.00 sec)

Warning (Code 1287): 'IDENTIFIED BY PASSWORD' is deprecated and will be removed in a future release. Please use IDENTIFIED WITH <plugin> AS <hash> instead
mysql [(none)]> SELECT user,host,authentication_string FROM mysql.user WHERE user='fuki' ORDER BY 1,2;
+------+-----------+-------------------------------------------+
| user | host      | authentication_string                     |
+------+-----------+-------------------------------------------+
| fuki | 127.0.0.1 | *7A8BBCB18A250055A6BB98ECFA33A8174D219504 |
| fuki | localhost | *7A8BBCB18A250055A6BB98ECFA33A8174D219504 |
+------+-----------+-------------------------------------------+
2 rows in set (0.00 sec)

同じハッシュ値になっている。

しかし、Warningにもあるようにいずれなくなる機能のようである。 まあ、普通に作成しろってことですよね。

MySQLのbinlogを見る方法

MySQLで生成されるbinログはlessでみてもバイナリログなので自分では解読できない なのでmysqlbinlogコマンドで見る。 下記は自分の環境5.7.18で試した結果

$ /usr/local/mysql5718/bin/mysqlbinlog mysql-bin.000004
SET @@SESSION.GTID_NEXT= '627024f4-2645-11e7-b811-001a4a5718c0:12'/*!*/;
# at 1538
#170530  0:50:09 server id 33083  end_log_pos 1680 CRC32 0x4ec4a13b     Query   thread_id=18    exec_time=0 error_code=0
use `fuki`/*!*/;
SET TIMESTAMP=1496073009/*!*/;
create table fuki.user_master (
user_id int, user_name varchar(256))
/*!*/;
# at 1680
#170530  0:50:47 server id 33083  end_log_pos 1745 CRC32 0x04caa6e8     GTID    last_committed=6    sequence_number=7
SET @@SESSION.GTID_NEXT= '627024f4-2645-11e7-b811-001a4a5718c0:13'/*!*/;
# at 1745
#170530  0:50:44 server id 33083  end_log_pos 1824 CRC32 0xd6d6771f     Query   thread_id=18    exec_time=0 error_code=0
SET TIMESTAMP=1496073044/*!*/;
BEGIN
/*!*/;
# at 1824
#170530  0:50:44 server id 33083  end_log_pos 1939 CRC32 0xf4184acd     Query   thread_id=18    exec_time=0 error_code=0
SET TIMESTAMP=1496073044/*!*/;
insert into user_master values (1,'fuki')
/*!*/;
# at 1939
#170530  0:50:47 server id 33083  end_log_pos 1970 CRC32 0x37fe8db8     Xid = 1775
COMMIT/*!*/

よく使いそうなオプションとしては--start-datetime=<datetime>'`--stop-datetime=<datetime> で時間を区切るとかかな。 とりあえず困ったら--helpでhelpを見る。