Base de datos de Wordpress pérdida automática de incremento

2

Después de revertir una base de datos de Wordpress a una versión de respaldo, parece que todas las tablas perdieron su auto_increment en las columnas de clave principal. Leí en otra publicación que podría tener que ver con que InnoDB almacena el valor auto_increment en la memoria. He retrotraído y migrado bases de datos antes sin tales problemas. ¿Alguien corrió en un tema similar antes? Gracias de antemano por cualquier ayuda.

    
pregunta cw29 04.05.2016 - 17:53

4 respuestas

7

Tuve un problema similar, lo resolví y, como esto ocupa un lugar alto en Google, lo que estaba buscando podría ayudar a otros.

Migré varias bases de datos de Wordpress de AWS RDS MySQL a MySQL ejecutándose en una instancia de EC2, usando el servicio de migración de base de datos. Lo que no sabía es que no copia índices, claves, incrementos automáticos o realmente nada más que lo básico. Por supuesto, el mejor enfoque sería volcar la base de datos usando mysqldump e importarla manualmente, pero una instalación de Wordpress tuvo cambios significativos y no quise rehacerlos. En su lugar, recreé manualmente los valores e índices de autoincremento.

He documentado cómo solucioné el incremento automático de Wordpress aquí mi sitio web , aquí hay una copia de lo que funcionó para mí. Es posible que haga más cambios, actualizaré el sitio web, pero es posible que no recuerde actualizar esta pregunta.

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;

Notas

  • Debería revisar sus tablas y asegurarse de establecer su auto_increment en un valor que tenga sentido para esa tabla.
  • Si aparece el error "alterar la tabla provoca que la secuenciación de auto-incremento de la secuenciación resulte en una entrada duplicada 1" (o 0, o algo más). Esto generalmente se arregla al eliminar la entrada con el ID 0 o 1 en la tabla. Tenga en cuenta que debe tener cuidado al hacer esto, ya que podría eliminar una fila importante.
respondido por el Tim 03.01.2017 - 07:11
1

¿Por qué sucedió? Es difícil decirlo con certeza porque hay muchas variables a considerar: errores cometidos al exportar o importar, versión de MySQL etc .

Esta es una pregunta bastante específica de la base de datos MySQL y no tiene mucho que ver con WordPress. Para obtener una respuesta específica no especulativa a la pregunta por qué , sugiero que la pregunte en SO o DBA con muchos detalles sobre su proceso de copia de seguridad.

Solución : ALTER TABLE table_name AUTO_INCREMENT = increment_number

  • Esto establece AUTO_INCREMENT manualmente a un número seleccionado
  • increment_number value debe ser al menos un número mayor que su número más alto actual de la clave principal de esa tabla que es automática incrustado
  • Además, no olvides cambiar table_name

Ejemplo: ALTER TABLE wp_posts AUTO_INCREMENT = 2043 <- número más grande en la columna de ID + 1

Notas adicionales:

  • Deberá repetir esto para cada tabla que haya desordenado el incremento automático
  • Puede haber una manera de alterar todas las tablas a la vez, pero no soy un gurú de SQL ( corrígeme si hay )
  • Tomará algo de tiempo para tablas enormes porque ALTER TABLE causa una reconstrucción de toda la mesa

Más información: here y here

    
respondido por el N00b 04.05.2016 - 19:30
0

Olvidé importar los índices del último archivo de MySQL, así que busqué el mismo problema y su consulta de autoincremento es difícil de disparar, uno por uno, el script creado, toma una tabla dinámica y verifica la clave principal Si se encuentra el script y la clave principal luego se aplicará al autoincremento dinámicamente.

  

Tome la variable de conexión db de su wp-config.php y guárdela en la raíz de youWordPressss y ejecútela mediante 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;
    
respondido por el Paresh Barad 02.08.2018 - 16:33
0

¿Por qué sucedió esto? Esto es lo que salió mal para mí:

Si exportó su base de datos usando phpadmin y tuvo un error al reimportarla, el código que agrega la clave principal no se ejecuta porque está al final del archivo SQL, no al momento de su creación.

Antes de darme cuenta de esto, actualicé a la versión beta de phpmyadmin 5 e importó los archivos con la clave a pesar de que aún tenía el error.

La primera lección es, no dejes que tu importación se bloquee, incluso si tus tablas están ahí. El mío se estrelló en la mesa que comenzó con wp_w, por lo que se produjo después de que el usuario y rekt mis incrementos automáticos.

Si observa la parte inferior de su exportación SQL, encontrará la tabla de modificación para agregar la clave principal y el incremento automático.

No es necesario que especifique el incremento automático , ya que sabe automáticamente cuál es el siguiente incremento: ALTER TABLE wp_posts CHANGE ID ID BIGINT (20) SIN SIGNO NULL AUTO_INCREMENT;

Si ha tenido actividad de administrador desde que sucedió esto, tiene ceros en el campo de su clave, lo que no le permitirá establecer una clave principal, y sin eso, no puede realizar un incremento automático. Así que necesitas ejecutar un script de eliminación vs cada tabla al igual que: ELIMINAR DE wp_posts WHERE ID = 0;

Aquí hay un conjunto completo de actualizaciones Si su mesa tiene estos, lanzará un error.

ELIMINAR DE wp_termmeta DONDE meta_id = 0; ELIMINAR DE wp_terms DONDE term_id = 0; ELIMINAR DE wp_term_taxonomy DONDE term_taxonomy_id = 0; ELIMINAR DE wp_commentmeta DONDE meta_id = 0; ELIMINAR DE wp_comments DONDE comment_ID = 0; ELIMINAR DE wp_links DONDE link_id = 0; ELIMINAR DE wp_options DONDE option_id = 0; ELIMINAR DE wp_postmeta DONDE meta_id = 0; ELIMINAR DE wp_users WHERE ID = 0; ELIMINAR DE wp_posts WHERE ID = 0; ELIMINAR DE wp_usermeta DONDE 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 AGREGAR CLAVE PRIMARIA (term_taxonomy_id); ALTER TABLE wp_commentmeta AGREGAR CLAVE PRIMARIA (meta_id); ALTER TABLE wp_comments ADD PRIMARY KEY (comment_ID); ALTER TABLE wp_links AGREGAR CLAVE PRIMARIA (link_id); ALTER TABLE wp_options AGREGAR TECLA PRIMARIA (option_id); ALTER TABLE wp_postmeta AGREGAR CLAVE PRIMARIA (meta_id); ALTER TABLE wp_users ADD CLAVE PRIMARIA (ID); ALTER TABLE wp_posts AGREGAR CLAVE PRIMARIA (ID); ALTER TABLE wp_usermeta AGREGAR CLAVE PRIMARIA (umeta_id);

ALTER TABLE wp_termmeta CHANGE meta_id meta_id BIGINT (20) NO ESTADO NO NULO AUTO_INCREMENT; ALTER TABLE wp_terms CHANGE term_id term_id BIGINT (20) SIN SIGNO NULL AUTO_INCREMENT; ALTER TABLE wp_term_taxonomy CHANGE term_taxonomy_id term_taxonomy_id BIGINT (20) NO ESTADO NO NULL AUTO_INCREMENT; ALTER TABLE wp_commentmeta CHANGE meta_id meta_id BIGINT (20) SIN SIGNO NULL AUTO_INCREMENT; ALTER TABLE wp_comments CAMBIAR comment_ID comment_ID BIGINT (20) NO ESTÁ SIGNO NULL AUTO_INCREMENT; ALTER TABLE wp_links CHANGE link_id link_id BIGINT (20) SIN SIGNO NULL AUTO_INCREMENT; ALTER TABLE wp_options CHANGE option_id option_id BIGINT (20) SIN SIGNO NULL AUTO_INCREMENT; ALTER TABLE wp_postmeta CHANGE meta_id meta_id BIGINT (20) SIN SIGNO NULL AUTO_INCREMENT; ALTER TABLE wp_users CHANGE ID ID BIGINT (20) NO ESTADO NO NULO AUTO_INCREMENT; ALTER TABLE wp_posts CHANGE ID ID BIGINT (20) NO ESTADO NO NULO AUTO_INCREMENT; ALTER TABLE wp_usermeta CHANGE umeta_id umeta_id BIGINT (20) NO ESTADO NO NULO AUTO_INCREMENT;

    
respondido por el Ben Erwin 10.08.2018 - 23:31

Lea otras preguntas en las etiquetas