WordPress Database ha perso l'auto increment

4 mag 2016, 18:53:29
Visualizzazioni: 40.3K
Voti: 11

Dopo aver ripristinato un database WordPress da una versione di backup, sembra che tutte le tabelle abbiano perso il loro auto_increment sulle colonne delle chiavi primarie. Ho letto in un altro post che questo potrebbe essere dovuto al fatto che InnoDB memorizza il valore auto_increment nella memoria. Ho eseguito ripristini e migrazioni di database in precedenza senza riscontrare problemi simili. Qualcuno si è mai imbattuto in un problema simile? Grazie in anticipo per qualsiasi aiuto.

0
Tutte le risposte alla domanda 6
0
24

Ho avuto un problema simile, l'ho risolto e dato che questa ricerca compare in alto su Google per ciò che stavo cercando, potrebbe aiutare altri.

Ho migrato diversi database Wordpress da AWS RDS MySQL a MySQL in esecuzione su un'istanza EC2, utilizzando il servizio di migrazione del database. Quello che non sapevo è che non copia indici, chiavi, auto incremento o praticamente nulla oltre alle basi. Ovviamente l'approccio migliore sarebbe stato eseguire un dump del database usando mysqldump e importarlo manualmente, ma una installazione di Wordpress aveva modifiche significative e non volevo rifarle. Invece ho ricreato manualmente i valori auto_increment e gli indici.

Ho documentato come ho risolto l'auto increment di Wordpress qui sul mio sito, ecco una copia di ciò che ha funzionato per me. È possibile che apporterò ulteriori modifiche, aggiornerò il sito ma potrei non ricordarmi di aggiornare questa domanda.

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;

Note

  • Dovresti controllare le tue tabelle e assicurarti di impostare auto_increment a un valore che abbia senso per quella tabella.
  • Se ottieni l'errore "alter table causes auto_increment resequencing resulting in duplicate entry 1" (o 0, o qualcos'altro). Di solito si risolve eliminando la voce con ID 0 o 1 nella tabella. Nota che dovresti fare attenzione perché potrebbe eliminare una riga importante.
3 gen 2017 08:11:14
2
10

Perché è successo? Ecco cosa è andato storto nel mio caso:

Se hai esportato il tuo database utilizzando phpMyAdmin e hai avuto un errore durante la reimportazione, il codice che aggiunge la chiave primaria non viene eseguito perché si trova alla fine del file SQL, non durante la sua creazione.

Prima di capirlo, ho aggiornato alla versione beta di phpMyAdmin 5 e ha importato i file con la chiave anche se avevo ancora l'errore.

La prima lezione è: non lasciare che l'importazione si interrompa, anche se le tabelle sono presenti. La mia si è bloccata su una tabella che iniziava con wp_w, quindi veniva dopo la tabella degli utenti e ha rovinato i miei auto-incrementi.

Se guardi in fondo al tuo export SQL, troverai l'alter table per aggiungere la Primary Key e l'auto-incremento.

Non è necessario specificare l'auto-incremento sa automaticamente quale sarà il prossimo incremento, come qui:

ALTER TABLE wp_posts CHANGE ID ID BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT;

Se hai avuto attività amministrativa dopo questo problema, avrai degli zeri nel campo chiave, che non ti permetteranno di impostare una chiave primaria e, senza quella, non puoi avere l'auto-incremento. Quindi devi eseguire uno script di eliminazione per ogni tabella, come questo:

DELETE FROM wp_posts WHERE ID=0;

Ecco una serie completa di aggiornamenti. Se la tua tabella contiene questi valori, genererà un errore.

DELETE FROM 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;
DELETE FROM 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(comment_ID);
ALTER TABLE wp_links ADD PRIMARY KEY(link_id);
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 ADD 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 CHANGE ID ID BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT;
ALTER TABLE wp_posts CHANGE ID ID BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT;
ALTER TABLE wp_usermeta CHANGE umeta_id umeta_id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT;
11 ago 2018 00:31:54
Commenti

Devi aprire una nuova domanda.

Castiblanco Castiblanco
11 ago 2018 00:51:59

Questa risposta è estremamente lunga e il codice non è formattato. Per favore modifica la tua risposta, sii chiaro, sii conciso, formatta il tuo codice in modo che sia leggibile.

Howdy_McGee Howdy_McGee
11 ago 2018 01:20:00
0

Perché è successo? È difficile dirlo con certezza perché ci sono molte variabili da considerare: errori fatti durante l'esportazione o l'importazione, versione di MySQL ecc.

Questa è una domanda piuttosto specifica sul database MySQL e non ha molto a che fare con WordPress stesso. Per ottenere una risposta specifica e non speculativa alla domanda sul perché, suggerisco di chiederlo su Stack Overflow (SO) o Database Administrators (DBA) fornendo molti dettagli sul tuo processo di backup.


Soluzione: ALTER TABLE nome_tabella AUTO_INCREMENT = numero_incremento

  • Questo imposta manualmente AUTO_INCREMENT a un numero selezionato
  • Il valore di numero_incremento deve essere almeno un numero più alto del valore più alto attuale della chiave primaria di quella tabella che ha l'auto incremento
  • Inoltre, non dimenticare di cambiare nome_tabella

Esempio: ALTER TABLE wp_posts AUTO_INCREMENT = 2043 <- numero più grande nella colonna ID + 1

Note aggiuntive:

  • Dovrai ripetere questo per ogni tabella che ha l'auto incremento danneggiato
  • Potrebbe esserci un modo per modificare tutte le tabelle contemporaneamente ma non sono un esperto di SQL (correggimi se esiste)
  • Ci vorrà del tempo per tabelle molto grandi perché ALTER TABLE causa una ricostruzione dell'intera tabella

Ulteriori informazioni: qui e qui

4 mag 2016 20:30:03
1

Ho scritto un aggiornamento per questo.

Utilizzo lo schema integrato del core di WordPress per garantire che tutte le tabelle del core WP siano presenti (anche in futuro quando verrà rilasciata la versione 5.1.1 o superiore). Rimuove le righe corrotte e riaggiunge chiavi e chiavi primarie. Lo script gratuito (e ulteriori spiegazioni) è disponibile qui: https://wpindexfixer.tools.managedwphosting.nl/

Non c'è nemmeno bisogno di indovinare il valore di auto-incremento.

28 feb 2019 09:34:02
Commenti

Fantastico, grazie mille. Mi hai appena risparmiato ore di lavoro.

Mustafa sabir Mustafa sabir
15 ott 2024 11:07:11
0

Ho dimenticato di importare gli indici dall'ultimo file MySQL, quindi ho riscontrato lo stesso problema ed è difficile eseguire la query di autoincremento una per una, quindi ho creato uno script. Prende una tabella dinamica e verifica la chiave primaria. Se lo script trova una chiave primaria, applicherà l'autoincremento in modo dinamico.

Prendi la variabile di connessione al database dal tuo wp-config.php e salvala nella root di WordPress ed eseguilo tramite URL.

// Configurazione del database
$host = 'localhost';
$dbuser   = 'dbuser';
$dbpassword   = 'dbpassword';
$dbname         = 'database';

// connessione al 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 "Connesso con successo";
} catch (PDOException $e) {
    exit("Connessione fallita: " . $e->getMessage());
}

// ottieni tutte le tabelle dal DB
$stmt = $connection->prepare('SHOW TABLES');
$stmt->execute();
$table_names = array();
foreach ($stmt->fetchAll() as $row) {
    $table_names[] = $row[0];
}

// per tutte le tabelle
foreach ($table_names as $table_name) {

    // ottieni il nome della chiave primaria
    $stmt = $connection->prepare("show keys from $table_name where Key_name = 'PRIMARY'");
    $stmt->execute();
    $key_name = $stmt->fetch()['Column_name'];

    // ottieni il tipo della chiave primaria
    $stmt = $connection->prepare("show fields from $table_name where Field = '$key_name'");
    $stmt->execute();
    $key_type = $stmt->fetch()['Type'];

    // se la chiave primaria esiste, procedi ad aggiungere l'autoincremento
    if ($key_name) {

        try {
            // se mancava l'autoincremento, potrebbe esserci una riga con chiave=0. calcola la prossima chiave primaria disponibile
            $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'];

            // assegna una chiave primaria valida alla riga che ha chiave = 0, se esiste
            $sql = "update $table_name set $key_name = $next_id where $key_name = 0";
            $stmt = $connection->prepare($sql);
            $stmt->execute();

            // imposta l'autoincremento sulla chiave primaria
            $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 "chiave primaria non trovata nella tabella $table_name.\n";
    }
}
$connection = null;
2 ago 2018 17:33:44
0

Recentemente ho avuto un problema simile con WordPress 6.5.4 - la tabella degli utenti ha perso il suo Auto Increment e tentava di inserire ogni nuovo utente creato nel pannello di controllo con un ID utente pari a 0.

L'ho risolto esportando la tabella degli utenti, eliminando la tabella e poi ricreandola con la struttura corretta in questo modo:

CREATE TABLE `tn_users` (`ID` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,`user_login` varchar(60) NOT NULL DEFAULT '',`user_pass` varchar(255) NOT NULL DEFAULT '',`user_nicename` varchar(50) NOT NULL DEFAULT '',`user_email` varchar(100) NOT NULL DEFAULT '',`user_url` varchar(100) NOT NULL DEFAULT '',`user_registered` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',`user_activation_key` varchar(255) NOT NULL DEFAULT '',`user_status` int(11) NOT NULL DEFAULT 0,`display_name` varchar(250) NOT NULL DEFAULT '',`spam` tinyint(2) NOT NULL DEFAULT 0,`deleted` tinyint(2) NOT NULL DEFAULT 0,PRIMARY KEY (`ID`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

Successivamente carichi l'export SQL in un editor di testo e copi-incolli semplicemente le istruzioni INSERT nel tuo PHPMyAdmin in modo che inserisca i vecchi dati ora con i valori ID corretti.

8 nov 2024 11:29:35