Banco de dados do Wordpress perdeu o incremento automático

2

Após reverter um banco de dados do Wordpress para uma versão de backup, parece que todas as tabelas perderam o auto_increment nas colunas de chave primária. Eu li em outro post que isso poderia ter a ver com o InnoDB armazenando o valor auto_increment na memória. Revisei e migrei bancos de dados antes sem esses problemas. Alguém correu em um problema semelhante antes? Agradecemos antecipadamente por qualquer ajuda.

    
por cw29 04.05.2016 / 17:53

4 respostas

7

Eu tive um problema semelhante, resolvi isso e, como isso acontece no Google, o que eu estava procurando pode ajudar outras pessoas.

Migrei vários bancos de dados do Wordpress do AWS RDS MySQL para o MySQL em execução em uma instância do EC2, usando o serviço de migração de banco de dados. O que eu não sabia é que não copia índices, chaves, auto incremento, ou realmente nada além do básico. É claro que a melhor abordagem seria despejar o banco de dados usando o mysqldump e importá-lo manualmente, mas uma instalação do Wordpress sofreu mudanças significativas e eu não queria refazê-las. Em vez disso, recriou manualmente os valores e índices de auto_increment.

Eu documentei como eu corrigi o incremento automático do Wordpress aqui em meu site , aqui está uma cópia do que funcionou para mim. É possível que eu faça mais alterações, atualizarei o site, mas talvez não me lembre de atualizar essa pergunta.

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

  • Você deve verificar suas tabelas e configurar seu auto_increment para um valor que faça sentido para essa tabela.
  • Se você receber o erro "alter table faz com que a auto-incremento resequencing resulte na entrada duplicada 1" (ou 0, ou outra coisa). Isso geralmente é corrigido, excluindo a entrada com o ID 0 ou 1 na tabela. Observe que você deve ter cuidado ao fazer isso, pois pode excluir uma linha importante.
por Tim 03.01.2017 / 07:11
1

Por que isso aconteceu? É difícil dizer com certeza porque há muitas variáveis a serem consideradas: erros cometidos na exportação ou importação, versão do MySQL etc .

Esta é uma questão de banco de dados MySQL bastante específica e não tem muito a ver com o próprio WordPress. Para obter uma resposta não especulativa específica para questionar por que , sugiro perguntar em SO ou DBA com muitos detalhes sobre seu processo de backup.

Solução : ALTER TABLE table_name AUTO_INCREMENT = increment_number

  • Isso define AUTO_INCREMENT manualmente para um número selecionado
  • increment_number value deve ser pelo menos um número maior que seu número mais alto atual da chave primária da tabela que é automática incremeted
  • Além disso, não se esqueça de alterar table_name

Exemplo: ALTER TABLE wp_posts AUTO_INCREMENT = 2043 <- maior número na coluna de ID + 1

Notas extras:

  • Você precisará repetir isso para cada tabela que estragou o incremento automático
  • Pode haver uma maneira de alterar todas as tabelas de uma vez, mas não sou guru de SQL ( corrija-me se houver )
  • Demorará algum tempo para tabelas grandes porque ALTER TABLE causa uma reconstrução da tabela inteira

Mais informações: aqui e aqui

    
por N00b 04.05.2016 / 19:30
0

Esqueci de importar índices do último arquivo MySQL, então peguei o mesmo problema e sua consulta de autoincremento difícil de disparar, um por um, para criar um script. Ele pega uma tabela dinâmica e verifica a chave primária Se o script for encontrado e a chave primária então será aplicado ao incremento automático dinamicamente.

  

Pegue a variável de conexão db do seu wp-config.php e salve na raiz do youWordPressss e execute por 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;
    
por Paresh Barad 02.08.2018 / 16:33
0

Por que isso aconteceu? Aqui está o que deu errado para mim:

Se você exportou seu banco de dados usando phpadmin e teve um erro ao reimportá-lo, o código que adiciona a chave primária não é executado porque está no final do arquivo SQL e não em sua criação.

Antes que eu descobrisse, atualizei para o phpmyadmin 5 beta e importei os arquivos com a chave mesmo que eu ainda tivesse o erro.

A lição 1 é: não deixe sua importação travar, mesmo que suas tabelas estejam lá. O meu bateu na mesa que começou com wp_w assim que veio depois do usuário e rekt meus incrementos auto.

Se você observar a parte inferior da exportação do SQL, encontrará a tabela alter para adicionar a chave primária e o incremento automático.

Você não precisa especificar o incremento automático ele sabe automaticamente qual é o próximo incremento assim: ALTER TABLE wp_posts MUDAR ID ID BIGINT (20) NÃO ASSINADO NULL AUTO_INCREMENT;

Se você tiver uma atividade administrativa desde que isso aconteceu, você terá zeros no campo-chave, o que não permitirá que você defina uma chave primária e, sem isso, não será possível incrementar automaticamente. Então você precisa executar um script de exclusão em cada tabela igual a: DELETE FROM wp_posts WHERE ID = 0;

Aqui está um conjunto completo de atualizações Se a sua mesa tiver isso, será lançado um erro.

DELETE FROM wp_termmeta ONDE meta_id = 0; DELETE FROM wp_terms WHERE term_id = 0; DELETE FROM wp_term_taxonomy ONDE 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 ONDE option_id = 0; DELETE FROM wp_postmeta ONDE meta_id = 0; DELETE FROM wp_users WHERE ID = 0; DELETE FROM wp_posts WHERE ID = 0; DELETE FROM wp_usermeta ONDE umeta_id = 0;

ALTER TABLE wp_termmeta ADICIONAR CHAVE PRIMÁRIA (meta_id); ALTER TABLE wp_terms ADICIONAR CHAVE PRIMÁRIA (term_id); ALTER TABLE wp_term_taxonomy ADICIONAR CHAVE PRIMÁRIA (term_taxonomy_id); ALTER TABLE wp_commentmeta ADICIONAR CHAVE PRIMÁRIA (meta_id); ALTER TABLE wp_comments ADICIONAR CHAVE PRIMÁRIA (comment_ID); ALTER TABLE wp_links ADICIONAR CHAVE PRIMÁRIA (link_id); ALTER TABLE wp_options ADICIONAR CHAVE PRIMÁRIA (option_id); ALTER TABLE wp_postmeta ADICIONAR CHAVE PRIMÁRIA (meta_id); ALTER TABLE wp_users ADICIONAR CHAVE PRIMÁRIA (ID); ALTER TABLE wp_posts ADICIONAR CHAVE PRIMÁRIA (ID); ALTER TABLE wp_usermeta ADICIONAR CHAVE PRIMÁRIA (umeta_id);

ALTERAR TABELA wp_termmeta MUDAR meta_id meta_id BIGINT (20) UNINIZADO NÃO NULO AUTO_INCREMENT; ALTER TABLE wp_terms CHANGE term_id termo_id BIGINT (20) NÃO ASSINADO NULL AUTO_INCREMENT; ALTER TABLE wp_term_taxonomy CHANGE term_taxonomy_id termo_taxonomy_id BIGINT (20) UNSIGNED NÃO NULO AUTO_INCREMENT; ALTER TABLE wp_commentmeta CHANGE meta_id meta_id BIGINT (20) NÃO ASSINADO NULL AUTO_INCREMENT; ALTER TABLE wp_comments MUDAR comment_ID comment_ID BIGINT (20) NÃO ASSINADO NULL AUTO_INCREMENT; ALTER TABLE wp_links MUDANÇA link_id link_id BIGINT (20) UNSIGNED NÃO NULL AUTO_INCREMENT; ALTER TABLE wp_options MUDANÇA option_id option_id BIGINT (20) UNSIGNED NÃO NULO AUTO_INCREMENT; ALTER TABLE wp_postmeta MUDAR meta_id meta_id BIGINT (20) UNSIGNED NOT NULL AUTO_INCREMENT; ALTER TABLE wp_users MUDANÇA ID ID BIGINT (20) UNSIGNED NOT NULL AUTO_INCREMENT; ALTER TABLE wp_posts MUDANÇA ID ID BIGINT (20) UNSIGNED NÃO NULL AUTO_INCREMENT; ALTER TABLE wp_usermeta CHANGE umeta_id umeta_id BIGINT (20) NÃO ASSINADO NULL AUTO_INCREMENT;

    
por Ben Erwin 10.08.2018 / 23:31