Мы недавно пытались перенести наши юнит-тесты на Аврору с Mysql. Нам пришлось откатить его назад, потому что некоторые тесты неожиданно начали давать сбои из-за сложных составных индексов. Мы проследили его до первичного ключа нашей таблицы пользователей, который автоматически увеличивается.
Если пользователь добавляется в таблицу пользователей, ему выдается идентификатор с автоматическим увеличением. Поэтому, если пользователь будет добавлен с id = 7, мы ожидаем, что следующий пользователь будет добавлен с id = 8. Это не так. Если мы удалили пользователя 7, следующий пользователь не всегда добавляется с id = 8. Скорее, они иногда добавляются с id = 7 снова, в зависимости от того, когда добавляется пользователь.
Мы запустили тест, чтобы увидеть, как Aurora db обрабатывает первичные ключи, и получили странные результаты:
mysql> select max(id) from testtable;
+---------+
| max(id) |
+---------+
| 22 |
+---------+
1 row in set (0.03 sec)
mysql> select * from testtable;
+----+--------+
| id | name |
+----+--------+
| 1 | value1 |
| 2 | value2 |
| 4 | value4 |
| 6 | value5 |
| 7 | value6 |
| 8 | value7 |
| 22 | value8 |
+----+--------+
7 rows in set (0.00 sec)
mysql> delete from testtable where id = 22;
Query OK, 1 row affected (0.01 sec)
mysql> show table status where name = 'testtable'; +-----------+--------+-----------------+
| Name | Engine | Auto_increment |
+-----------+--------+-----------------+
| testtable | InnoDB | 23 |
1 row in set (0.01 sec)
Затем мы подождали 15 минут и выполнили тот же запрос
mysql> show table status where name = 'testtable';
+-----------+--------+-----------------+
| Name | Engine | Auto_increment |
+-----------+--------+-----------------+
| testtable | InnoDB | 9 |
+-----------+--------+-----------------+
1 row in set (0.01 sec)
Похоже, что через некоторое время после того, как Aurora db бездействует, происходит некоторое событие, которое заставляет aurora рассматривать его так, как если бы произошел перезапуск сервера, и оно сбрасывает значение автоинкремента на MAX (id ) + 1, это поведение таблицы innodb.
Мне это кажется безумным, и, конечно же, это не то, что мы бы использовали в производственной среде, если бы не было невероятно катастрофических c последствий, особенно для наследства база данных с ошибочной схемой БД и плохим отношением внешнего ключа.
Кто-нибудь сталкивался с этой проблемой раньше? Это просто случай настройки конфигурации?