2019年11月9日土曜日

MySQL の 巨大な core ファイル 対策(MySQL 8.0〜)

昨日の記事 では core ファイルを圧縮する方法を紹介しました。 昨日の記事では、OSの機能(kernel.core_pattern)を使って対応する方法を紹介しました。

MySQL 8.0からは、MySQLの機能(設定)を利用して、巨大なcoreファイルを抑制することができます。
https://dev.mysql.com/doc/refman/8.0/en/innodb-buffer-pool-in-core-file.html

一般的な運用では、MySQLのメモリのうち大半、InnoDBバッファプールが占めます。 MySQL 8.0.14 から InnoDB バッファプールをcoreファイルに含めるかどうかを指定するパラメータ innodb_buffer_pool_in_core_file が追加されました。

デフォルトはONで、これまで同様バッファプールを含めた、(大きな) coreファイルが出力されます。

--

試してみます。

mysql> show global variables like '%innodb_buffer_pool_in_core_file%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| innodb_buffer_pool_in_core_file | ON    |
+---------------------------------+-------+
1 row in set (0.00 sec)


$ sudo kill -SIGSEGV $(pidof mysqld)
$ ls -alh *core*
-rw------- 1 mysql mysql 5.0G Nov  4 15:19 mysqld.core.4947
 


5Gのcoreが生成されました。次に、OFFにして試してみます。
このパラメータはオンラインで変更することが出来ます(意外でした) 。

mysql> set global innodb_buffer_pool_in_core_file=off;
Query OK, 0 rows affected (0.00 sec)

mysql> show global variables like '%innodb_buffer_pool_in_core_file%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| innodb_buffer_pool_in_core_file | OFF   |
+---------------------------------+-------+
1 row in set (0.00 sec)


5Gだったcoreファイルが892Mと大幅にコンパクトになっています。

$ sudo kill -SIGSEGV $(pidof mysqld)
$ ls -alh *core*
-rw------- 1 mysql mysql 892M Nov  4 15:22 mysqld.core.5218


良いですね。デフォルトはONですが、自分はOFFにしておいて、万が一、バッファプールをcoreにふくめないといけないようなバグにヒットしたら、ONにしていく運用しようと思ってます。

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。