WordPress: baza de date a pierdut incrementarea automată

4 mai 2016, 18:53:29
Vizualizări: 40.3K
Voturi: 11

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.

0
Toate răspunsurile la întrebare 6
0
24

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.
3 ian. 2017 08:11:14
2
10

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;
11 aug. 2018 00:31:54
Comentarii

Trebuie să deschizi o întrebare nouă.

Castiblanco Castiblanco
11 aug. 2018 00:51:59

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.

Howdy_McGee Howdy_McGee
11 aug. 2018 01:20:00
0

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

Mai multe informații: aici și aici

4 mai 2016 20:30:03
1

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.

28 feb. 2019 09:34:02
Comentarii

Super, mulțumesc mult. Tocmai mi-ai economisit ore întregi de muncă.

Mustafa sabir Mustafa sabir
15 oct. 2024 11:07:11
0

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;
2 aug. 2018 17:33:44
0

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.

8 nov. 2024 11:29:35