2015年3月10日火曜日

MySQL 5.7.6ではSET PASSWORD = PASSWORD(..) するとSyntax Errorと言われる(5.7.7でワーニング扱いに変更になった)

MySQL::Sandboxを使ってレプリケーションをセットアップしようと思ったらふと気付いた。


[mysql@v157-7-154-209 ~]$ make_replication_sandbox 5.7.6 --how_many_slaves=2
installing and starting master
ERROR 1064 (42000) at line 3: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'password('msandbox')' at line 1
mysqldump: Got error: 1045: Access denied for user 'msandbox'@'localhost' (using password: YES) when trying to connect
can't load grants
error installing the master

(512 )

Syntax Error…?
手で打ってみた。


mysql> SET PASSWORD= PASSWORD('root_password');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'PASSWORD('root_password')' at line 1

( ゚д゚) ファッ!?


なんか変だと思ってmysql.userテーブルを探してみたら、passwordカラムがなくなっていたことに気付いたがそれは別のエントリーに置いておいて、
日々の覚書: MySQL 5.7.6でmysql.userテーブルのパスワードのカラム名がなんか変わった

SET PASSWORDステートメントはPASSWORD関数を通さなくても勝手にハッシュするようになったぽい。
(なので、変にPASSWORD関数の戻り値を渡してしまうと、ハッシュ後の値が元のパスワード値と認識されちゃうから敢えてエラーになっている…?)

mysql> SET PASSWORD= 'root_password';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT user, host, authentication_string FROM mysql.user;
+------+-----------+-------------------------------------------+
| user | host      | authentication_string                     |
+------+-----------+-------------------------------------------+
| root | localhost | *2AF14BD74D8A4FDB580D3208C0092BE75EE95B75 |
+------+-----------+-------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT PASSWORD('root_password');
+-------------------------------------------+
| PASSWORD('root_password')                 |
+-------------------------------------------+
| *2AF14BD74D8A4FDB580D3208C0092BE75EE95B75 |
+-------------------------------------------+
1 row in set (0.00 sec)

ちゃんと合ってる。
敢えてエラーにするのはいいことだと思うけど、Syntax Errorは違うだろう。。

ちなみに5.7.5以前のバージョンでやると、5.6までの挙動と同じで


mysql57> SET PASSWORD = 'root_password';
ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal number

こうなる。


うわー、非互換かぁ。。これいろいろつらい気がする(自動セットアップ系の何かで)

MySQL :: MySQL 5.7 Release Notes :: Changes in MySQL 5.7.6 (2015-03-09, Milestone 16) に Incompatible Changeとして載っているので、バグではないぽい(ばぐれぽ上がってたけど)


【2015/06/01 18:54】

In MySQL 5.7.6, the PASSWORD() function was deprecated, but no warning was produced when it was invoked. Similarly, the old_passwords system variable was deprecated, but no warning was produced when it was set. (Bug #20545464)
MySQL :: MySQL 5.7 Release Notes :: Changes in MySQL 5.7.7 (2015-04-08, Release Candidate)

ということで、ちゃんと(?)ワーニングで返してくれる猶予期間が設けられたようなのでした。よかった。


mysql> SELECT @@version;
+-----------+
| @@version |
+-----------+
| 5.7.6-m16 |
+-----------+
1 row in set (0.00 sec)

mysql> SET PASSWORD = PASSWORD('abc');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'PASSWORD('abc')' at line 1

mysql> SELECT @@version;
+-----------+
| @@version |
+-----------+
| 5.7.7-rc  |
+-----------+
1 row in set (0.00 sec)

mysql> SET PASSWORD= PASSWORD('abc');
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> SHOW WARNINGS;
+---------+------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Level   | Code | Message                                                                                                                                                           |
+---------+------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Warning | 1287 | 'SET PASSWORD = PASSWORD('')' is deprecated and will be removed in a future release. Please use SET PASSWORD = '' instead |
+---------+------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

Bug #20552143 SET PASSWORD=PASSWORD(...) SHOULD BE SUPPORTED, BUT DEP… · mysql/mysql-server@a14f794

0 件のコメント :

コメントを投稿