WordPress: baza de date a pierdut incrementarea automată
După restaurarea unei baze de date WordPress la o versiune de backup, se pare că toate tabelele au pierdut valoarea auto_increment de pe coloanele cheie primară. Am citit într-un alt post că acest lucru ar putea fi legat de faptul că InnoDB stochează valoarea auto_increment în memorie. Am făcut rollback și am migrat baze de date și înainte, fără astfel de probleme. A mai întâmpinat cineva o problemă similară? Mulțumesc în avans pentru orice ajutor.

Am avut o problemă similară, am rezolvat-o și deoarece acest subiect apare sus în Google pentru ceea ce căutam, poate ajuta și pe alții.
Am migrat mai multe baze de date Wordpress de la AWS RDS MySQL la MySQL rulează pe o instanță EC2, folosind serviciul de migrare a bazelor de date. Ceea ce nu știam este că nu copiază indecșii, cheile, auto increment sau aproape nimic altceva în afară de elementele de bază. Desigur, cea mai bună abordare ar fi să faci un dump al bazei de date folosind mysqldump și să o imporți manual, dar una dintre instalările Wordpress avea modificări semnificative și nu am vrut să le refac. În schimb, am recreat manual valorile auto_increment și indecșii.
Am documentat cum am reparat auto increment în Wordpress aici pe site-ul meu, iată o copie a ceea ce a funcționat pentru mine. Este posibil să fac alte modificări în viitor, voi actualiza site-ul dar s-ar putea să nu-mi amintesc să actualizez această întrebare.
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
- Ar trebui să verifici tabelele și să te asiguri că setezi auto_increment la o valoare care are sens pentru acel tabel.
- Dacă primești eroarea "alter table causes auto_increment resequencing resulting in duplicate entry 1" (sau 0, sau altceva). De obicei se rezolvă prin ștergerea intrării cu ID-ul 0 sau 1 din tabel. Reține că ar trebui să fii atent când faci asta deoarece s-ar putea să ștergi un rând important.

De ce s-a întâmplat asta? Iată ce a mers greșit în cazul meu:
Dacă ai exportat baza de date folosind phpadmin și ai avut o eroare la reimportare, codul care adaugă cheia primară nu rulează pentru că se află la sfârșitul fișierului SQL, nu la crearea acestuia.
Înainte să înțeleg asta, am actualizat la versiunea beta phpmyadmin 5 și a importat fișierele cu cheia chiar dacă încă aveam eroarea.
Prima lecție este să nu lași importul să se blocheze, chiar dacă tabelele tale sunt acolo. În cazul meu, s-a blocat la un tabel care începea cu wp_w, așa că a venit după utilizator și a distrus incrementele automate.
Dacă te uiți la sfârșitul exportului tău SQL, vei găsi comanda ALTER TABLE pentru adăugarea Cheii Primare și a incrementului automat.
Nu este necesar să specifici incrementul automat, acesta știe automat care este următorul increment, astfel:
ALTER TABLE wp_posts CHANGE ID ID BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT;
Dacă ai avut activitate de administrare de când s-a întâmplat acest lucru, ai zerouri în câmpul cheie, ceea ce nu îți va permite să setezi o cheie primară, iar fără aceasta, nu poți avea increment automat. Deci, trebuie să rulezi un script de ștergere pentru fiecare tabel, astfel:
DELETE FROM wp_posts WHERE ID=0;
Iată un set complet de actualizări. Dacă tabelul tău conține aceste valori, va genera o eroare.
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;

Acest răspuns este extrem de lung și codul său nu este formatat. Te rog să editezi
răspunsul tău, fii clar, fii concis, formatează-ți codul astfel încât să fie lizibil.

De ce s-a întâmplat acest lucru? Este dificil de spus cu siguranță, deoarece există multe variabile de luat în considerare: greșeli făcute la exportare sau importare, versiunea MySQL etc.
Aceasta este mai degrabă o întrebare specifică despre baza de date MySQL și nu are prea mult de-a face cu WordPress în sine. Pentru a obține un răspuns specific și nespeculativ la întrebarea de ce, vă sugerez să o puneți pe SO sau DBA cu multe detalii despre procesul dumneavoastră de backup.
Soluție: ALTER TABLE table_name AUTO_INCREMENT = increment_number
- Aceasta setează manual
AUTO_INCREMENT
la un număr selectat - Valoarea
increment_number
trebuie să fie cel puțin cu un număr mai mare decât cel mai mare număr curent al cheii primare a acelei tabele care este auto incrementată - De asemenea, nu uitați să schimbați
table_name
Exemplu: ALTER TABLE wp_posts AUTO_INCREMENT = 2043
<-
cel mai mare număr din coloana ID + 1
Note suplimentare:
- Va trebui să repetați acest lucru pentru fiecare tabelă care are auto increment afectat
- Ar putea exista o modalitate de a modifica toate tabelele deodată, dar nu sunt expert în SQL (corectați-mă dacă există)
- Va dura ceva timp pentru tabelele mari, deoarece
ALTER TABLE
provoacă o reconstrucție a întregii tabele

Am scris o actualizare pentru asta.
Folosește schema integrată din WP Core pentru a asigura că toate tabelele WP Core sunt prezente (chiar și în viitor când va fi lansată versiunea 5.1.1 sau mai mare). Elimină rândurile corupte și readaugă cheile și cheile primare. Scriptul gratuit (și mai multe explicații) poate fi văzut aici: https://wpindexfixer.tools.managedwphosting.nl/
Nu este nevoie să ghicești valoarea auto-increment.

Am uitat să import indexurile din ultimul fișier MySQL, așa că am întâmpinat aceeași problemă și este dificil să rulez manual query-urile de autoincrement unul câte unul, așa că am creat un script. Acesta ia o tabelă dinamică și verifică dacă există o cheie primară. Dacă scriptul găsește o cheie primară, va aplica autoincrementul în mod dinamic.
Ia variabila de conexiune la baza de date din wp-config.php și salvează-o în rădăcina WordPress, apoi rulează prin URL.
// Configurația bazei de date
$host = 'localhost';
$dbuser = 'dbuser';
$dbpassword = 'dbpassword';
$dbname = 'database';
// conectare la 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 "Conectat cu succes";
} catch (PDOException $e) {
exit("Conexiune eșuată: " . $e->getMessage());
}
// obține toate tabelele din DB
$stmt = $connection->prepare('SHOW TABLES');
$stmt->execute();
$table_names = array();
foreach ($stmt->fetchAll() as $row) {
$table_names[] = $row[0];
}
// pentru fiecare tabelă
foreach ($table_names as $table_name) {
// obține numele cheii primare
$stmt = $connection->prepare("show keys from $table_name where Key_name = 'PRIMARY'");
$stmt->execute();
$key_name = $stmt->fetch()['Column_name'];
// obține tipul cheii primare
$stmt = $connection->prepare("show fields from $table_name where Field = '$key_name'");
$stmt->execute();
$key_type = $stmt->fetch()['Type'];
// dacă există cheie primară, se va adăuga auto increment
if ($key_name) {
try {
// dacă lipsea auto_increment, poate exista un rând cu cheia=0. calculează următoarea cheie primară disponibilă
$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'];
// atribuie o cheie primară validă unui rând care are cheia = 0, dacă există
$sql = "update $table_name set $key_name = $next_id where $key_name = 0";
$stmt = $connection->prepare($sql);
$stmt->execute();
// setează auto_increment pe cheia primară
$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 "cheie primară negăsită în tabelul $table_name.\n";
}
}
$connection = null;

Am avut recent o problemă similară cu WordPress 6.5.4 - tabelul de utilizatori a pierdut Auto Increment și a încercat să insereze fiecare utilizator nou creat în panoul de control cu un ID de utilizator setat la 0.
Am rezolvat problema exportând tabelul de utilizatori, ștergând tabelul de utilizatori și apoi recreându-l cu structura corectă a tabelului astfel:
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;
După aceea, încărcați exportul SQL într-un editor de text și copiați și lipiți declarația/declarațiile INSERT în PHPMyAdmin, astfel încât să insereze datele vechi acum cu valorile corecte ale ID-urilor.
