今回は、MySQLのバッファプールを設定するメモです。
具体的には、以下の設定方法をメモしたいと思います。
- swap領域の設定
- バッファプールサイズ増強
前置き
以前、AWS LightsailでAmazonLinux2に、
MySQLをインストールして起動しようとしたところ、以下の様なエラーに遭遇しました。
ec2-user@ip-172-26-0-220 ~]$ sudo cat /var/log/mysqld.log
2024-01-07T07:51:52.474820Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.35) initializing of server in progress as process 2900
2024-01-07T07:51:52.503901Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2024-01-07T07:51:53.026747Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2024-01-07T07:51:57.851209Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2024-01-07T07:51:57.859705Z 0 [Warning] [MY-012681] [InnoDB] page_aligned_alloc mmap(137236480 bytes) failed; errno 12
2024-01-07T07:51:57.859760Z 1 [ERROR] [MY-012956] [InnoDB] Cannot allocate memory for the buffer pool
2024-01-07T07:51:57.859781Z 1 [ERROR] [MY-012930] [InnoDB] Plugin initialization aborted with error Generic error.
2024-01-07T07:51:57.859802Z 1 [ERROR] [MY-010334] [Server] Failed to initialize DD Storage Engine
2024-01-07T07:51:57.859896Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
2024-01-07T07:51:57.859922Z 0 [ERROR] [MY-010119] [Server] Aborting
2024-01-07T07:51:57.861440Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.35) MySQL Community Server - GPL.
ログの内容を確認すると、
Cannot allocate memory for the buffer pool
とあり、
メモリ割り当て不足が原因で正常に起動できなかった様です。
※少なくともこちらに表示されている数値以上は割り当てが必要
page_aligned_alloc mmap(137236480 bytes) failed; errno 12
こういったケースもスペック増強する前に、
割り当てを正しく行えば、エラー解消できます。
swap領域作成
まずは、swap領域の作成についてです。
ddコマンドを利用して、swap領域に設定する空ファイルを作成します。
sudo dd if=/dev/zero of=/swapfile bs=1M count=256
続けて、mkswapコマンドでswap領域を設定します。
sudo mkswap /swapfile
その後、メッセージで促された通り、swap領域のパーミッションを調整します。
sudo chmod 600 /swapfile
以下のコマンドなどで、割り当て状況を確認して、
指定した数値分割り当てられていれば、設定できています。
free
設定をMySQLに反映させるために、MySQLを再起動します。
sudo service mysqld restart
バッファプールサイズ増強
次に、バッファプールサイズの設定方法です。
ここでのメモは、innodb_buffer_pool_sizeの割り当てを増やす方法となります。
通常、innodb_buffer_pool_sizeは、my.cnfというMySQLの設定ファイルで定義されているため、
my.cnfの設定値を変更することで変更可能です。
現状のバッファプールサイズ確認方法
現在のプールサイズは、my.cnfの内容で確認できますが、
現状のサービスが認識しているサイズは、SQLコマンドで確認できます。
SHOW VARIABLES LIKE 'innodb_buffer_pool_size'
バッファプールサイズ変更
my.cnfの内容を変更して、サイズを変更します。
ただし、my.cnfは複数配置が可能なため、
事前作業として、配置されているmy.cnfを確認します。
mysql --help | grep my.cnf
優先順位が高いファイル順に左から表示されます。
my.cnfを確認できたら、innodb_buffer_pool_size
の数値を任意の数値に変更します。
[mysqld]
innodb_buffer_pool_size = 256M
その後、MySQLを再起動して設定を反映させます。
systemctl restart mysqld
今回のメモは以上となります。
個人開発や演習目的でスペックの低いサーバーに、
MySQLを立てようとすると、起きやすい問題かと思います。
ある程度余裕のある数値を設定しておきたいところです。