Base de datos de WordPress perdió el auto incremento

4 may 2016, 18:53:29
Vistas: 40.3K
Votos: 11

Después de restaurar 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 primaria. Leí en otra publicación que esto podría estar relacionado con que InnoDB almacena el valor de auto_increment en memoria. He restaurado y migrado bases de datos antes sin tener estos problemas. ¿Alguien se ha encontrado con un problema similar antes? Gracias de antemano por cualquier ayuda.

0
Todas las respuestas a la pregunta 6
0
24

Tuve un problema similar, lo solucioné y como esto aparece alto en Google para lo que estaba buscando, quizás ayude a otros.

Migré varias bases de datos de Wordpress desde AWS RDS MySQL a MySQL ejecutándose en una instancia EC2, usando el servicio de migración de bases de datos. Lo que no sabía es que no copia índices, claves, auto incremento, ni 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 tenía cambios significativos y no quería rehacerlos. En su lugar, recreé manualmente los valores auto_increment e índices.

He documentado cómo solucioné el auto incremento de Wordpress aquí en 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 quizás 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ías revisar tus tablas y asegurarte de establecer tu auto_increment a un valor que tenga sentido para esa tabla.
  • Si obtienes el error "alter table causes auto_increment resequencing resulting in duplicate entry 1" (o 0, u otro). Esto usualmente se soluciona eliminando la entrada con el ID 0 o 1 en la tabla. Ten en cuenta que debes tener cuidado al hacer esto ya que podría eliminar una fila importante.
3 ene 2017 08:11:14
2
10

¿Por qué sucedió esto? Esto es lo que salió mal en mi caso:

Si exportaste tu base de datos usando phpadmin y tuviste un error al reimportarla, el código que añade la clave primaria no se ejecuta porque está al final del archivo SQL, no durante su creación.

Antes de descubrir esto, actualicé a la versión beta de phpmyadmin 5 y esta importó los archivos con la clave aunque seguía teniendo el error.

La primera lección es: no permitas que tu importación falle, incluso si tus tablas están ahí. La mía falló en una tabla que comenzaba con wp_w, así que venía después de la tabla de usuarios y arruinó mis autoincrementos.

Si miras al final de tu exportación SQL, encontrarás el ALTER TABLE para añadir la Clave Primaria y el autoincremento.

No necesitas especificar el autoincremento automáticamente sabe cuál será el siguiente incremento, así:

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

Si has tenido actividad en el administrador desde que esto ocurrió, tendrás ceros en tu campo clave, lo que no te permitirá establecer una clave primaria, y sin eso, no puedes autoincrementar. Así que necesitas ejecutar un script de eliminación para cada tabla así:

DELETE FROM wp_posts  WHERE ID=0;

Aquí tienes un conjunto completo de actualizaciones. Si tu tabla tiene estos registros, generará un error.

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
Comentarios

Tienes que abrir una nueva pregunta.

Castiblanco Castiblanco
11 ago 2018 00:51:59

Esta respuesta es extremadamente larga y su código no está formateado. Por favor, edita tu respuesta, sé claro, sé conciso, formatea tu código para que sea legible.

Howdy_McGee Howdy_McGee
11 ago 2018 01:20:00
0

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

Esta es una pregunta bastante específica sobre bases de datos MySQL y no tiene mucho que ver con WordPress en sí. Para obtener una respuesta concreta y no especulativa sobre el porqué, sugiero preguntarlo en SO o DBA con muchos detalles sobre tu proceso de respaldo.


Solución: ALTER TABLE table_name AUTO_INCREMENT = increment_number

  • Esto establece manualmente AUTO_INCREMENT a un número seleccionado
  • El valor de increment_number debe ser al menos un número mayor que el valor más alto actual de la clave primaria autoincremental de esa tabla
  • Además, no olvides cambiar table_name

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

Notas adicionales:

  • Tendrás que repetir esto para cada tabla que tenga el autoincremental alterado
  • Puede haber una forma de modificar todas las tablas a la vez, pero no soy un gurú de SQL (corrígeme si la hay)
  • Tardará algún tiempo para tablas grandes porque ALTER TABLE provoca una reconstrucción completa de la tabla

Más información: aquí y aquí

4 may 2016 20:30:03
1

Escribí una actualización para esto.

Utilizo el esquema integrado del núcleo de WP para asegurar que todas las tablas del núcleo de WP estén presentes (incluso en el futuro cuando se lance la versión 5.1.1 o superior). Elimina filas corruptas y vuelve a añadir claves y claves primarias. El script gratuito (y más explicación) se puede ver aquí: https://wpindexfixer.tools.managedwphosting.nl/

Tampoco es necesario adivinar el valor de auto-incremento.

28 feb 2019 09:34:02
Comentarios

Increíble, muchas gracias. Me acabas de ahorrar horas de trabajo.

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

Olvidé importar los índices del último archivo MySQL, así que me encontré con el mismo problema y es difícil ejecutar la consulta de autoincremento una por una, así que creé un script. Este toma una tabla dinámica y verifica la clave primaria. Si el script encuentra una clave primaria, entonces aplicará el autoincremento dinámicamente.

Toma la variable de conexión a la base de datos de tu wp-config.php y guárdala en la raíz de tu WordPress y ejecútala por URL.

// Configuración de la base de datos
$host = 'localhost';
$dbuser   = 'dbuser';
$dbpassword   = 'dbpassword';
$dbname         = 'database';

// Conectar a la base de datos
$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 "Conectado exitosamente";
} catch (PDOException $e) {
    exit("Error de conexión: " . $e->getMessage());
}

// Obtener todas las tablas de la base de datos
$stmt = $connection->prepare('SHOW TABLES');
$stmt->execute();
$table_names = array();
foreach ($stmt->fetchAll() as $row) {
    $table_names[] = $row[0];
}

// Para todas las tablas
foreach ($table_names as $table_name) {

    // Obtener el nombre de la clave primaria
    $stmt = $connection->prepare("show keys from $table_name where Key_name = 'PRIMARY'");
    $stmt->execute();
    $key_name = $stmt->fetch()['Column_name'];

    // Obtener el tipo de la clave primaria
    $stmt = $connection->prepare("show fields from $table_name where Field = '$key_name'");
    $stmt->execute();
    $key_type = $stmt->fetch()['Type'];

    // Si la clave primaria existe, proceder a añadir el autoincremento
    if ($key_name) {

        try {
            // Si faltaba auto_increment, podría haber una fila con clave=0. Calcula la siguiente clave primaria disponible
            $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'];

            // Asigna una clave primaria válida a la fila que tenga clave = 0, si existe
            $sql = "update $table_name set $key_name = $next_id where $key_name = 0";
            $stmt = $connection->prepare($sql);
            $stmt->execute();

            // Establecer auto_increment en la clave 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 "No se encontró clave primaria en la tabla $table_name.\n";
    }
}
$connection = null;
2 ago 2018 17:33:44
0

Recientemente tuve un problema similar con WordPress 6.5.4 - la tabla de usuarios perdió su Auto Incremento e intentaba insertar cada nuevo usuario creado en el panel de control con un ID de Usuario de 0.

Lo solucioné exportando la tabla de usuarios, eliminando la tabla de usuarios y luego volviéndola a crear con la estructura correcta de la tabla así:

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;

Después de eso, carga la exportación SQL en un editor de texto y simplemente copia y pega la(s) sentencia(s) INSERT en tu PHPMyAdmin para que inserte los datos antiguos ahora con los valores de ID correctos.

8 nov 2024 11:29:35