2016年9月13日火曜日

MySQL 8.0.0時代のmy.cnfの探り方

以前、straceで開いてるmy.cnfを調べて…とかやってたけど、それももう過去の話。

日々の覚書: ラッパーも含めて mysqldが起動するときにどのmy.cnfを舐めてるのか知りたいとき


MySQL 8.0.0では performance_schema.variables_info という便利なテーブルができた。


mysql80> SELECT * FROM performance_schema.variables_info LIMIT 10;
+--------------------------+-----------------+---------------+-----------+----------------------+
| VARIABLE_NAME            | VARIABLE_SOURCE | VARIABLE_PATH | MIN_VALUE | MAX_VALUE            |
+--------------------------+-----------------+---------------+-----------+----------------------+
| auto_increment_increment | COMPILED        |               | 1         | 65535                |
| auto_increment_offset    | COMPILED        |               | 1         | 65535                |
| autocommit               | COMPILED        |               | 0         | 0                    |
| automatic_sp_privileges  | COMPILED        |               | 0         | 0                    |
| avoid_temporal_upgrade   | COMPILED        |               | 0         | 0                    |
| back_log                 | COMPILED        |               | 0         | 65535                |
| basedir                  | COMMAND_LINE    |               | 0         | 0                    |
| big_tables               | COMPILED        |               | 0         | 0                    |
| bind_address             | COMPILED        |               | 0         | 0                    |
| binlog_cache_size        | COMPILED        |               | 4096      | 18446744073709551615 |
+--------------------------+-----------------+---------------+-----------+----------------------+
10 rows in set (0.00 sec)

パラメーターの名前と最小値、最大値を表示してくれるのはいいんだけど、それなら現在の値も一緒に出してほしいところ。
performance_schema.global_variablesあたりとJOINすればいいだけだから、sysに入ってくるかしら。

まあ、そんなことよりこれの凄そうなところは(取り敢えず、このクエリーはJOINしてある)


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


variable_pathにどのmy.cnfから読んできたか書いてくれるところ…なんだけど、残念ながらこれ、 "!include" に対応していないぽい。


$ cat /etc/my.cnf
[mysqld]
innodb_buffer_pool_size= 1G

!include /usr/mysql/8.0.0/test.cnf


$ cat /usr/mysql/8.0.0/test.cnf
[mysqld]
innodb_buffer_pool_size= 256M

こう設定した場合、設定が後勝ちするため innodb_buffer_pool_sizeは256MBで起動してくる。( 日々の覚書: my.cnfのパラメータ優先順位 )
しかしこう、


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

/etc/my.cnfが見えちゃうという(´・ω・`)
(どうやら仕様らしい。 MySQL Bugs: #82861: performance_schema.variable_info.variable_path doesn't reflect config-including でFeature Requestとして出し直す、みたいな話になった)

variable_sourceの値はこのあたりをとることまでは確かめた。



パラメーターを設定した場所 variable_source
/etc/my.cnf GLOBAL
$basedir/my.cnf SERVER
—defaults-file=/etc/my.cnf EXPLICIT
—defaults-extra-file=/etc/my.cnf EXTRA
—innodb-buffer-pool-size=256M COMMAND_LINE
SET GLOBAL innodb_buffer_pool_size= 256M DYNAMIC


mysql> SHOW CREATE TABLE performance_schema.variables_info\G
*************************** 1. row ***************************
       Table: variables_info
Create Table: CREATE TABLE `variables_info` (
  `VARIABLE_NAME` varchar(64) NOT NULL,
  `VARIABLE_SOURCE` enum('COMPILED','GLOBAL','SERVER','EXPLICIT','EXTRA','USER','LOGIN','COMMAND_LINE','PERSISTED','DYNAMIC') DEFAULT NULL,
  `VARIABLE_PATH` varchar(1024) DEFAULT NULL,
  `MIN_VALUE` varchar(64) DEFAULT NULL,
  `MAX_VALUE` varchar(64) DEFAULT NULL
) ENGINE=PERFORMANCE_SCHEMA DEFAULT CHARSET=utf8
1 row in set (0.01 sec)

ほとんどのパラメーターがCOMPILEDになってるから、COMPILEDはコンパイル時に設定したデフォルトで、あと謎いのは USER, LOGIN くらいですかね。PERSISTED はまたあとで。

0 件のコメント :

コメントを投稿