最近、AWSからIT分野に触れだしました。そのため、問題が発生した際など、どのようにトラブルシュートを行えばよいかわからず、大苦戦しながらも、自己学習に励んでおります。
DBに触れた経験が乏しく、理解が甘いですが、
同じ過ちを起こさないように、同じ問題が発生した際に、素早く対応できるように覚書程度に記録を残しておきます。
INSERTした際に下記のエラーが発生してしまいました。
ERROR: 2019/08/02 10:41:31 Error on MySQL INSERT Exec: Error 1467: Failed to read auto-increment value from storage engine
Amazon RDSを利用しておりますので、最終的には、パラメータグループを変更することにより解決できました。
mysql> show table status;
+----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------------+---------------------+---------------------+------------+-------------------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------------+---------------------+---------------------+------------+-------------------+----------+----------------+---------+
| unicorn | InnoDB | 10 | Dynamic | 0 | 0 | 16384 | 0 | 16384 | 0 | 1 | 2019-08-02 07:05:21 | NULL | NULL | latin1_swedish_ci | NULL | | |
| unicorns | InnoDB | 10 | Dynamic | 113 | 144 | 16384 | 0 | 16384 | 0 | 18446744073709551615 | 2019-08-02 07:23:37 | 2019-08-02 10:11:02 | NULL | latin1_swedish_ci | NULL | | |
+----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------------+---------------------+---------------------+------------+-------------------+----------+----------------+---------+
2 rows in set (0.00 sec)
Auto_incrementの値が18446744073709551615で最大値に達しており、割り当てる値がないことによりエラーが発生しておりました。
idを確認してみると,idが歯抜けになってます。
mysql> select * from unicorns;
+----------------------+----------------------------------------------+--------------+
| id | location | requestvalue |
+----------------------+----------------------------------------------+--------------+
| 1 | UNICORNNAMEDBINSERTTEST | NULL |
| 2 | UNICORNNAMEDBINSERTTEST | NULL |
| 3 | UNICORNNAMEDBINSERTTEST | NULL |
| 4 | UNICORNNAMEDBINSERTTEST | NULL |
| 67810132 | UNICORNNAMEDBINSERTTEST | NULL |
| 95487191 | UNICORNNAMEDBINSERTTEST | NULL |
| 683000000 | UNICORNNAMEDBINSERTTEST | NULL |
| 46279800000 | UNICORNNAMEDBINSERTTEST | NULL |
| 18446744073709551615 | UNICORNNAMEDBINSERTTEST | NULL |
問題点
mysql> SELECT @@innodb_autoinc_lock_mode;
+----------------------------+
| @@innodb_autoinc_lock_mode |
+----------------------------+
| 1 |
+----------------------------+
innodb_autoinc_lock_mode = 1 になっているため、高速化のために、歯抜けになっていしますらしい。
「--innodb_autoinc_lock_mode=0」オプションを付けて起動することで解決する。
解決策、参考
innodb_autoinc_lock_mode <> 0 でINSERT .. SELECT .. をかけた時にauto_incrementなカラムが歯抜けになる理由を調べてみる
innodb_autoinc_lock_mode <> 0 でINSERT .. SELECT .. をかけた時にauto_incrementなカラムが歯抜けになる理由を調べてみる
では、RDSのパラメータの変更方法について。
Amazon RDS→パラメータグループ→パラメータグループの作成→任意の名前(unicorn)を付けて作成
RDS→パラメータフループ→unicorn→パラメータ[innodb_autoinc_lock_mode]→値[0]→変更の保存
RDS→データベース→unicorndb→変更→データベースの設定→DBパラメータグループ作成したもの(unicorn)を選択→変更をすぐに適応→再起動
再起動後に確認
mysql> SELECT @@innodb_autoinc_lock_mode;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 5
Current database: unicorndb
+----------------------------+
| @@innodb_autoinc_lock_mode |
+----------------------------+
| 0 |
+----------------------------+
1 row in set (0.06 sec)
無事にパラメータを変更することができました。