web-dev-qa-db-fra.com

Incrémentation automatique perdue de la base de données Wordpress

Après avoir rétabli une base de données Wordpress sur une version de sauvegarde, il semble que toutes les tables ont perdu leur auto-incrémentation sur les colonnes de clé primaire. J'ai lu dans un autre article que cela pourrait être lié au stockage par InnoDB de la valeur auto_increment en mémoire. J'ai déjà restauré et migré des bases de données sans ces problèmes. Quelqu'un a déjà couru un problème similaire? Merci d'avance pour votre aide.

4
cw29

J'avais un problème similaire, je l'ai résolu et, vu que c'est une des priorités de Google, ce que je cherchais peut aider les autres.

J'ai migré plusieurs bases de données Wordpress d'AWS RDS MySQL vers MySQL s'exécutant sur une instance EC2, à l'aide du service de migration de base de données. Ce que je ne savais pas, c'est qu'il ne copie pas les index, les clés, l'incrémentation automatique ou autre chose que les bases. Bien sûr, la meilleure approche serait de vider la base de données à l’aide de mysqldump et de l’importer manuellement, mais une installation Wordpress comportait des modifications importantes et je ne voulais pas les rétablir. Au lieu de cela, j'ai recréé manuellement les valeurs et les index auto_increment.

J'ai documenté comment j'ai corrigé l'incrémentation automatique de Wordpress ici sur mon site Web , voici une copie de ce qui a fonctionné pour moi. Il est possible que je fasse d'autres modifications, je mettrai à jour le site web mais je ne me souviendrai peut-être pas de mettre à jour cette question.

ALTER TABLE wp_termmeta MODIFY COLUMN meta_id bigint(20) unsigned NOT NULL auto_increment;
ALTER TABLE wp_terms MODIFY COLUMN term_id bigint(20) unsigned NOT NULL auto_increment;
ALTER TABLE wp_term_taxonomy MODIFY COLUMN term_taxonomy_id bigint(20) unsigned NOT NULL auto_increment;
ALTER TABLE wp_commentmeta MODIFY COLUMN meta_id bigint(20) unsigned NOT NULL auto_increment;
ALTER TABLE wp_comments MODIFY COLUMN comment_ID bigint(20) unsigned NOT NULL auto_increment;
ALTER TABLE wp_links MODIFY COLUMN link_id bigint(20) unsigned NOT NULL auto_increment;
ALTER TABLE wp_options MODIFY COLUMN option_id bigint(20) unsigned NOT NULL auto_increment;
ALTER TABLE wp_postmeta MODIFY COLUMN meta_id bigint(20) unsigned NOT NULL auto_increment;
ALTER TABLE wp_users MODIFY COLUMN ID bigint(20) unsigned NOT NULL auto_increment;
ALTER TABLE wp_posts MODIFY COLUMN ID bigint(20) unsigned NOT NULL auto_increment;
ALTER TABLE wp_usermeta MODIFY COLUMN umeta_id bigint(20) unsigned NOT NULL auto_increment;

CREATE INDEX term_id on wp_termmeta (term_id);
CREATE INDEX meta_key on wp_termmeta (meta_key(191));
CREATE INDEX slug on wp_terms (slug(191));
CREATE INDEX name on wp_terms (name(191));
CREATE UNIQUE INDEX term_id_taxonomy on wp_term_taxonomy (term_id, taxonomy);
CREATE INDEX taxonomy on wp_term_taxonomy (taxonomy );
CREATE INDEX comment_id on wp_commentmeta (comment_id);
CREATE INDEX meta_key on wp_commentmeta (meta_key(191));
CREATE INDEX comment_post_ID on wp_comments (comment_post_ID);
CREATE INDEX comment_approved_date_gmt on wp_comments (comment_approved,comment_date_gmt);
CREATE INDEX comment_date_gmt on wp_comments (comment_date_gmt);
CREATE INDEX comment_parent on wp_comments (comment_parent);
CREATE INDEX comment_author_email on wp_comments (comment_author_email(10));
CREATE INDEX link_visible on wp_links (link_visible);
CREATE UNIQUE INDEX option_name on wp_options (option_name);
CREATE INDEX post_id on wp_postmeta (post_id);
CREATE INDEX meta_key on wp_postmeta (meta_key);
CREATE INDEX post_name on wp_posts (post_name(191));
CREATE INDEX type_status_date on wp_posts (post_type,post_status,post_date,ID);
CREATE INDEX post_parent on wp_posts (post_parent);
CREATE INDEX post_author on wp_posts (post_author);
CREATE INDEX user_login_key on wp_users (user_login);
CREATE INDEX user_nicename on wp_users (user_nicename);
CREATE INDEX user_email on wp_users (user_email);
CREATE INDEX user_id on wp_usermeta (user_id);
CREATE INDEX meta_key on wp_usermeta (meta_key(191));

ALTER TABLE wp_terms AUTO_INCREMENT = 10000;
ALTER TABLE wp_term_taxonomy AUTO_INCREMENT = 10000;
ALTER TABLE wp_commentmeta AUTO_INCREMENT = 10000;
ALTER TABLE wp_comments AUTO_INCREMENT = 10000;
ALTER TABLE wp_links AUTO_INCREMENT = 10000;
ALTER TABLE wp_options AUTO_INCREMENT = 10000;
ALTER TABLE wp_postmeta AUTO_INCREMENT = 10000;
ALTER TABLE wp_users AUTO_INCREMENT = 10000;
ALTER TABLE wp_posts AUTO_INCREMENT = 10000;
ALTER TABLE wp_usermeta AUTO_INCREMENT = 10000;

Remarques

  • Vérifiez vos tables et assurez-vous de définir votre auto_increment sur une valeur appropriée pour cette table.
  • Si vous obtenez le message d'erreur "alter table provoque un reséquençage auto_increment entraînant la duplication de l'entrée 1" (ou 0, ou autre chose). Ce problème est généralement résolu en supprimant l'entrée portant l'ID 0 ou 1 dans la table. Notez que vous devez faire attention car cela pourrait effacer une ligne importante.
10
Tim

Pourquoi est-ce arrivé? Il est difficile de dire avec certitude, car de nombreuses variables doivent être prises en compte: erreurs d’exportation ou d’importation, version de MySQL etc.

C'est une question de base de données MySQL assez spécifique et n'a pas grand chose à voir avec WordPress lui-même. Pour obtenir une réponse spécifique non spéculative à la question pourquoi , je suggère de la poser dans SO ou DBA avec beaucoup de détails sur votre processus de sauvegarde.


Solution : ALTER TABLE table_name AUTO_INCREMENT = increment_number

  • Ceci définit AUTO_INCREMENT manuellement sur un numéro sélectionné
  • increment_number valeur doit être au moins un nombre supérieur à votre plus grand nombre actuel de clés primaires de cette table incrémenté automatiquement
  • De plus, n'oubliez pas de changer table_name

Exemple: ALTER TABLE wp_posts AUTO_INCREMENT = 2043<- numéro le plus grand dans la colonne ID + 1

Notes supplémentaires:

  • Vous devrez répéter cette opération pour chaque table ayant subi une incrémentation automatique erronée.
  • Il pourrait y avoir un moyen de modifier toutes les tables à la fois mais je ne suis pas un gourou SQL ( corrigez-moi s'il y a )
  • Cela prendra du temps pour les tables énormes car ALTER TABLE provoque une reconstruction de la table entière

Plus d'informations:icietici

3
N00b

Pourquoi est-ce arrivé? Voici ce qui s'est mal passé pour moi:

Si vous avez exporté votre base de données à l'aide de phpadmin et que vous avez eu une erreur lors de sa réimportation, le code qui ajoute la clé primaire ne s'exécute pas car il se trouve à la fin du fichier SQL, pas à sa création.

Avant de comprendre cela, je me suis mis à jour vers la version bêta de phpmyadmin 5 qui importait les fichiers avec la clé même si j'avais toujours l'erreur.

La leçon 1 est, ne laissez pas votre importation planter, même si vos tables sont là. Le mien s'est écrasé sur la table qui a commencé avec wp_w, donc c'est venu après l'utilisateur et il a répété mes incréments automatiques.

Si vous regardez au bas de votre exportation SQL, vous trouverez la table de modification permettant d'ajouter la clé primaire et l'incrémentation automatique.

Vous n'avez pas besoin de spécifier l'incrément automatique il sait automatiquement en quoi consiste l'incrément suivant: ALTER TABLE wp_posts CHANGER ID ID BIGINT (20) UNSIGNED NOT NULL AUTO_INCREMENT;

Si vous avez eu une activité d'administrateur depuis que cela s'est produit, vous avez des zéros dans votre champ de clé, ce qui ne vous permettra pas de définir une clé primaire, et sans cela, vous ne pouvez pas incrémenter automatiquement. Vous devez donc exécuter un script de suppression contre chaque table, comme suit: DELETE FROM wp_posts WHERE ID = 0;

Voici un ensemble complet de mises à jour Si votre table en contient, elle se produira en erreur.

SUPPRIMER DE wp_termmeta WHERE meta_id = 0; DELETE FROM wp_terms WHERE term_id = 0; DELETE FROM wp_term_taxonomy WHERE term_taxonomy_id = 0; DELETE FROM wp_commentmeta WHERE meta_id = 0; DELETE FROM wp_comments WHERE comment_ID = 0; DELETE FROM wp_links WHERE link_id = 0; DELETE FROM wp_options WHERE option_id = 0; DELETE FROM wp_postmeta WHERE meta_id = 0; DELETE FROM wp_users WHERE ID = 0; DELETE FROM wp_posts WHERE ID = 0; SUPPRIMER DE wp_usermeta WHERE umeta_id = 0;

ALTER TABLE wp_termmeta ADD PRIMARY KEY (meta_id); ALTER TABLE wp_terms ADD PRIMARY KEY (term_id); ALTER TABLE wp_term_taxonomy ADD PRIMARY KEY (term_taxonomy_id); ALTER TABLE wp_commentmeta ADD PRIMARY KEY (meta_id); ALTER TABLE wp_comments ADD PRIMARY KEY (ID_comment); ALTER TABLE wp_links ADD PRIMARY KEY (id_lien); ALTER TABLE wp_options ADD PRIMARY KEY (option_id); ALTER TABLE wp_postmeta ADD PRIMARY KEY (meta_id); ALTER TABLE wp_users ADD PRIMARY KEY (ID); ALTER TABLE wp_posts ADD PRIMARY KEY (ID); ALTER TABLE wp_usermeta AJOUTER PRIMARY KEY (umeta_id);

ALTER TABLE wp_termmeta CHANGE meta_id meta_id BIGINT (20) UNSIGNED NOT NULL AUTO_INCREMENT; ALTER TABLE wp_terms CHANGE term_id term_id BIGINT (20) UNSIGNED NOT NULL AUTO_INCREMENT; ALTER TABLE wp_term_taxonomy CHANGE term_taxonomy_id term_taxonomy_id BIGINT (20) UNSIGNED NOT NULL AUTO_INCREMENT; ALTER TABLE wp_commentmeta CHANGE meta_id meta_id BIGINT (20) UNSIGNED NOT NULL AUTO_INCREMENT; ALTER TABLE wp_comments CHANGE comment_ID comment_ID BIGINT (20) UNSIGNED NOT NULL AUTO_INCREMENT; ALTER TABLE wp_links CHANGE link_id link_id BIGINT (20) UNSIGNED NOT NULL AUTO_INCREMENT; ALTER TABLE wp_options CHANGE option_id option_id BIGINT (20) UNSIGNED NOT NULL AUTO_INCREMENT; ALTER TABLE wp_postmeta CHANGE meta_id meta_id BIGINT (20) UNSIGNED NOT NULL AUTO_INCREMENT; ALTER TABLE wp_users CHANGER ID ID BIGINT (20) UNSIGNED NOT NULL AUTO_INCREMENT; ALTER TABLE wp_posts ID D'IDENTIFICATION DE MODIFICATION ID BIGINT (20) UNSIGNED NOT NULL AUTO_INCREMENT; ALTER TABLE wp_usermeta CHANGE umeta_id umeta_id BIGINT (20) UNSIGNED NOT NULL AUTO_INCREMENT;

0
Ben Erwin

J'ai oublié d'importer les index du dernier fichier MySQL. J'ai donc récupéré le même problème. Il est difficile de lancer une requête auto-incrémentée une par une. Le script ainsi créé prend une table dynamique et recherche la clé primaire Si le script est trouvé et la clé primaire, être appliqué pour auto-incrémenter dynamiquement.

Prenez la variable de connexion à la base de données de votre fichier wp-config.php et enregistrez-la dans la racine youWordPressss et exécutez-la par url.

// Database configration
$Host = 'localhost';
$dbuser   = 'dbuser';
$dbpassword   = 'dbpassword';
$dbname         = 'database';

// connect to DB
$conn = new mysqli($Host, $dbuser, $dbpassword);
try {
    $connection = new PDO("mysql:Host=$Host;dbname=$dbname", $dbuser, $dbpassword, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET sql_mode="NO_ZERO_DATE"'));
    $connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Connected successfully";
} catch (PDOException $e) {
    exit("Connection failed: " . $e->getMessage());
}

// get all tables from DB
$stmt = $connection->prepare('SHOW TABLES');
$stmt->execute();
$table_names = array();
foreach ($stmt->fetchAll() as $row) {
    $table_names[] = $row[0];
}

// for all tables
foreach ($table_names as $table_name) {

    // get the name of primary key
    $stmt = $connection->prepare("show keys from $table_name where Key_name = 'PRIMARY'");
    $stmt->execute();
    $key_name = $stmt->fetch()['Column_name'];

    // get the type of primary key
    $stmt = $connection->prepare("show fields from $table_name where Field = '$key_name'");
    $stmt->execute();
    $key_type = $stmt->fetch()['Type'];

    // primary already exist then going to add auto increment
    if ($key_name) {

        try {
            // if auto_increment was missing there might be a row with key=0 . compute the next available primary key
            $sql = "select (ifnull( max($key_name), 0)+1) as next_id from $table_name";
            $stmt = $connection->prepare($sql);
            $stmt->execute();
            $next_id = $stmt->fetch()['next_id'];

            // give a sane primary key to a row that has key = 0 if it exists
            $sql = "update $table_name set $key_name = $next_id where $key_name = 0";
            $stmt = $connection->prepare($sql);
            $stmt->execute();

            // set auto_increment to the primary key
            $sql = "alter table $table_name modify column $key_name $key_type auto_increment";
            $stmt = $connection->prepare($sql);
            $stmt->execute();

        } catch (PDOException $e) {
            echo $e->getMessage() . '\n';
        }
    } else {
        echo "primary key not found in table $table_name.\n";
    }
}
$connection = null;
0
Jelly Fish

J'ai écrit une mise à jour pour cela.

J'utilise le schéma de construction WP Core pour s'assurer que all WP Les tables de base sont présentes (même à l'avenir lorsque la version 5.1.1 ou ultérieure sera publiée). Il supprime les lignes corrompues et rajoute des clés primaires. Le script gratuit (et plus d'explications) peut être vu ici: https://wpindexfixer.tools.managedwphosting.nl/

Pas besoin de deviner la valeur d'auto-incrémentation aussi.

0
Ramon Fincken