3
votes

L'incrémentation automatique a été réinitialisée automatiquement à 1

Je viens de rencontrer un problème que je ne parviens pas à résoudre.

J'ai une table de base de données project_queues qui est utilisée comme file d'attente, où je stocke certains enregistrements. Lorsque les enregistrements sont traités, ils sont supprimés. La suppression est invoquée par la construction de rails record.destroy dans une boucle qui déclenche DELETE record FROM table sur la base de données MySql.

Mais maintenant j'ai remarqué, que dans le tableau project_queues , l ' autoIncrement Id (clé primaire) a été rétabli à 1 . (Ce qui a endommagé mes références dans la table d'audit. Le même enregistrement pointe maintenant vers plusieurs files d'attente de projets différentes)

show create table project_queues;

CREATE TABLE `project_queues` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
   ...
   ...
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=1 

Je n'utilise pas TRUNCATE project_queues ou supprimez la construction de la table et créez-la à nouveau dans le code.

Quelqu'un a-t-il rencontré un problème similaire comme moi? Je ne trouve aucune anomalie dans le journal non plus.

J'utilise Rails 5.2.3 , MariaDB 10.1 .

La connexion de l'application à la base de données applique ces modes SQL:

  • NO_AUTO_VALUE_ON_ZERO
  • STRICT_ALL_TABLES
  • NO_AUTO_CREATE_USER
  • NO_ENGINE_SUBSTITUTION
  • NO_ZERO_DATE
  • NO_ZERO_IN_DATE
  • ERROR_FOR_DIVISION_BY_ZERO

Mais je ne pense pas que cela ait quelque chose à voir avec l'IA.


2 commentaires

Peut-être ai-je trouvé une question similaire stackoverflow.com/questions/38786800/...


Mais vous avez redémarré le serveur après avoir supprimé les lignes.


3 Réponses :


0
votes

Auto_increment peut être réinitialisé par des mises à jour. Puisque vous l'utilisez comme file d'attente, je suppose que vous ne faites pas de mises à jour, mais cela vaut la peine de le demander.

De plus, quelle implémentation de table utilisez-vous, MyIsam, InnoDB, autre ...?


1 commentaires

Non, je n'utilise pas de mises à jour, seulement Insérer et Supprimer. Implémentation de la table ENGINE = InnoDB.



1
votes

Ok, j'ai trouvé le problème (il s'agit d'un problème connu depuis 2013).

Voici comment reproduire le problème.

# Your MariaDB Server version: 10.1.29-MariaDB MariaDB Server
# Engine InnoDB

create database ai_test;
use ai_test;

CREATE TABLE IF NOT EXISTS ai_test(id INT AUTO_INCREMENT PRIMARY KEY, 
                                   a VARCHAR(50));

show table status like 'ai_test' 
  >  Auto_increment: 1

INSERT INTO ai_test(a) VALUES ('first');
INSERT INTO ai_test(a) VALUES ('second');
INSERT INTO ai_test(a) VALUES ('third');

show table status like 'ai_test' 
  >  Auto_increment: 4

MariaDB [ai_test]> Delete from ai_test where a = 'first';
MariaDB [ai_test]> Delete from ai_test where a = 'second';
MariaDB [ai_test]> Delete from ai_test where a = 'third';

show table status like 'ai_test' \G
  >  Auto_increment: 4

# Restart Server
sudo service rh-mariadb101-mariadb stop
sudo service rh-mariadb101-mariadb start

show table status like 'ai_test' \G
  >  Auto_increment: 1

Je vais essayer de trouver une solution de contournement pour résoudre ce problème, mais je pense que cela cause des ravages dans de nombreux cas d'utilisation qui font référence à des tables d'archive ou à quelque chose du genre.

Références :

  • https://bugs.mysql.com/bug.php?id=64287
  • https://dev.mysql.com/worklog/task/?id = 6204
  • https://openquery.com .au / blog / implémentation-de-séquences-utilisant-une-fonction-stockée-et-des-déclencheurs

  • 0 commentaires

    1
    votes

    Résolu

    J'ai mis à jour 10.1.29-MariaDB MariaDB Server vers 10.2.8-MariaDB MariaDB Server

    Version> = 10.2.4 < / a> a résolu la réinitialisation de la valeur d'incrémentation automatique


    1 commentaires

    Aussi MySQL 8.0.