2016年9月13日火曜日

MySQL 8.0.0でSET PERSIST構文が出来て、my.cnfへの反映忘れが防げそう

MySQL 8.0.0時代のmy.cnfの探り方 の続き。

ここに /etc/my.cnf から読み込まれた innodb_buffer_pool_size = 128MB があるじゃろ? (AA略)


mysql80> SELECT variable_name, variable_source, variable_path, variable_value FROM performance_schema.variables_info JOIN performance_schema.global_variables USING(variable_name) WHERE variable_name = 'innodb_buffer_pool_size';
+-------------------------+-----------------+---------------+----------------+
| variable_name           | variable_source | variable_path | variable_value |
+-------------------------+-----------------+---------------+----------------+
| innodb_buffer_pool_size | GLOBAL          | /etc/my.cnf   | 134217728      |
+-------------------------+-----------------+---------------+----------------+
1 row in set (0.01 sec)

これを


mysql80> SET PERSIST innodb_buffer_pool_size = 256 * 1024 * 1024;
Query OK, 0 rows affected (0.00 sec)

mysql80> SELECT variable_name, variable_source, variable_path, variable_value FROM performance_schema.variables_info JOIN performance_schema.global_variables USING(variable_name) WHERE variable_name = 'innodb_buffer_pool_size';
+-------------------------+-----------------+---------------+----------------+
| variable_name           | variable_source | variable_path | variable_value |
+-------------------------+-----------------+---------------+----------------+
| innodb_buffer_pool_size | DYNAMIC         |               | 268435456      |
+-------------------------+-----------------+---------------+----------------+
1 row in set (0.00 sec)

こうじゃ。

( ゚д゚) ・・・

(つд⊂)ゴシゴシ

(;゚д゚) ・・・

(つд⊂)ゴシゴシゴシ
_, ._
(;゚ Д゚) …!?


_人人人人人人人_
> SET PERSIST <
 ̄Y^Y^Y^Y^Y^Y^Y^ ̄


ではmysqldを再起動して、


mysql80> SELECT variable_name, variable_source, variable_path, variable_value FROM performance_schema.variables_info JOIN performance_schema.global_variables USING(variable_name) WHERE variable_name = 'innodb_buffer_pool_size';
+-------------------------+-----------------+---------------------------------------+----------------+
| variable_name           | variable_source | variable_path                         | variable_value |
+-------------------------+-----------------+---------------------------------------+----------------+
| innodb_buffer_pool_size | PERSISTED       | /usr/mysql/8.0.0/data/mysqld-auto.cnf | 134217728      |
+-------------------------+-----------------+---------------------------------------+----------------+
1 row in set (0.00 sec)

$ cat /usr/mysql/8.0.0/data/mysqld-auto.cnf
{ "mysql_server": {"innodb_buffer_pool_size": "134217728" } }

え…書き換わってないじゃんダメじゃん。。

バグ(だと思う)で、innodb_buffer_pool_sizeだけはSET PERSISTで指定した値じゃなくて、SET PERSISTで指定する **前の** 値が保存されちゃってるぽい。
他のサーバー変数はイケた。

MySQL Bugs: #82905: SET PERSIST stores previous value of innodb_buffer_pool_size to mysqld-auto.cnf


innodb_io_capacity_maxとかならこの通り。

mysql80> SET PERSIST innodb_io_capacity_max = 8000;
Query OK, 0 rows affected (0.00 sec)

$ cat /usr/mysql/8.0.0/data/mysqld-auto.cnf
{ "mysql_server": {"innodb_io_capacity_max": "8000" } }


なお、SET PERSISTできるのは当然ながら SET GLOBAL 可能なオプションだけ。

mysql80> SET PERSIST last_insert_id = 2;
ERROR 1228 (HY000): Variable 'last_insert_id' is a SESSION variable and can't be used with SET GLOBAL


ところで、セッションスコープしかない変数をを手でmysqld-auto.cnfに書いたら、mysqldが異常終了じゃなくてクラッシュなさるようになった。。
(存在しない変数ならワーニングで無視してくれるんだけど、存在してかつセッションスコープしかないやつだと落ちる。。)

0 件のコメント :

コメントを投稿