Wordpressデータベースをバックアップバージョンにロールバックした後、すべてのテーブルが主キーカラムのauto_incrementを失ったようです。私は別の投稿で、これはInnoDBがauto_increment値をメモリに格納することに関連する可能性があります。このような問題が発生することなく、データベースをロールバックして移行しました。誰もが前に同様の問題に遭遇しましたか?ご協力ありがとうございます。
私は同様の問題を抱えていたので解決しました。これは、私が探していたものが他の人に役立つかもしれないという理由で、Googleで高く評価されているためです。
データベース移行サービスを使用して、AWS RDS MySQLからEC2インスタンスで実行されているMySQLにいくつかのWordpressデータベースを移行しました。私が知りませんでしたが、それはインデックス、キー、自動インクリメント、または実際には基本以外のものをコピーしません。もちろん、最良のアプローチはmysqldumpを使用してデータベースをダンプし、手動でインポートすることですが、1つのWordpressインストールに大きな変更があり、それらをやり直したくありませんでした。代わりに、auto_incrementの値とインデックスを手動で再作成しました。
私のウェブサイトでWordpress自動インクリメントを修正 の方法を文書化しました。これが私にとってうまくいったもののコピーです。さらに変更を加えることは可能です。ウェブサイトを更新しますが、この質問を更新することを忘れないかもしれません。
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;
ノート
なぜそれが起こったのですか?考慮すべき変数がたくさんあるので、確実に言うのは難しいです。エクスポートまたはインポートの間違い、MySQLバージョンetc。
これはMySQLデータベース特有の質問で、WordPress自体とはあまり関係がありません。 why の質問に対する具体的な非投機的な答えを得るために、私は _ so _ または _ dba _ であなたのバックアッププロセスに関する多くの詳細と共にそれを尋ねることを勧めます。
解決策 :ALTER TABLE table_name AUTO_INCREMENT = increment_number
AUTO_INCREMENT
を選択された数に設定しますincrement_number
value は でなければなりません自動インクリメントされるそのテーブルの主キーの現在の最大数より少なくとも1大きい数値table_name
を変更することを忘れないでください例:ALTER TABLE wp_posts AUTO_INCREMENT = 2043
<-
ID列の最大数+ 1
追加のメモ:
ALTER TABLE
はテーブル全体を再構築するため、巨大なテーブルにはしばらく時間がかかります。これはなぜ起こったのでしょうか。これが私にとって悪いことです。
Phpadminを使用してデータベースをエクスポートしたが、再インポート時にエラーが発生した場合、主キーを追加するコードは、作成時ではなくSQLファイルの末尾にあるため、実行されません。
これを理解する前に、私はphpmyadmin 5ベータ版を更新し、それでもエラーが発生したにもかかわらずキー付きのファイルをインポートしました。
レッスン1は、テーブルがあってもインポートをクラッシュさせないでください。私のwp_wで始まるテーブルでクラッシュしたので、それはユーザーの後に来て、私の自動インクリメントをrektしました。
SQLエクスポートの下部を見ると、主キーと自動増分を追加するための変更表があります。
自動インクリメントを指定する必要はありません 次のインクリメントがどのようなものであるかを自動的に認識します。 ALTER TABLE wp_posts変更ID ID BIGINT(20)UNSIGNED NOT NULL AUTO_INCREMENT;
これ以降、管理者の操作があった場合は、キーフィールドにゼロが表示されます。この場合、主キーを設定することはできません。それがないと、自動インクリメントすることはできません。そのため、各テーブルに対して削除スクリプトを実行する必要があります。 DELETE FROM wp_posts WHERE ID = 0;
あなたのテーブルがこれらを持っている場合、これはスローしてエラーになります。
Wp_termmetaから削除します。WHERE meta_id = 0; wp_termsのWHERE term_id = 0から削除します。 wp_term_taxonomyから削除しますWHERE term_taxonomy_id = 0; wp_commentmetaから削除します。WHERE meta_id = 0; wp_commentsのWHERE comment_ID = 0から削除します。 wp_links WHERE link_id = 0から削除します。 wp_optionsのWHERE option_id = 0から削除します。 wp_postmetaから削除します。WHERE meta_id = 0; wp_users ID = 0から削除してください。 wp_posts WHERE ID = 0から削除してください。 wp_usermeta WHEREから削除します。umeta_id = 0;
ALTER TABLE wp_termmeta主キーの追加(meta_id); ALTER TABLE wp_termsプライマリキーの追加(term_id); ALTER TABLE wp_term_taxonomy ADD PRIMARY KEY(term_taxonomy_id); ALTER TABLE wp_commentmeta主キーの追加(meta_id); ALTER TABLE wp_comments ADD主キー(comment_ID); ALTER TABLE wp_linksプライマリキー追加(link_id); ALTER TABLE wp_options ADD主キー(option_id); ALTER TABLE wp_postmeta主キーの追加(meta_id); ALTER TABLE wp_users ADD PRIMARY KEY(ID); ALTER TABLE wp_posts ADD PRIMARY KEY(ID); ALTER TABLE wp_usermeta主キーの追加(umeta_id);
ALTER TABLE wp_termmeta変更meta_id meta_id BIGINT(20)UNSIGNED NOT NULL AUTO_INCREMENT。 ALTER TABLE wp_terms変更term_id term_id BIGINT(20)UNSIGNED NOT NULL AUTO_INCREMENT。 ALTER TABLE wp_term_taxonomy変更term_taxonomy_id term_taxonomy_id BIGINT(20)UNSIGNED NOT NULL AUTO_INCREMENT; ALTER TABLE wp_commentmeta変更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変更link_id link_id BIGINT(20)UNSIGNED NOT NULL AUTO_INCREMENT。 ALTER TABLE wp_options変更option_id option_id BIGINT(20)UNSIGNED NOT NULL AUTO_INCREMENT。 ALTER TABLE wp_postmeta変更meta_id meta_id BIGINT(20)UNSIGNED NOT NULL AUTO_INCREMENT。 ALTER TABLE wp_users変更ID ID BIGINT(20)UNSIGNED NOT NULL AUTO_INCREMENT。 ALTER TABLE wp_posts変更ID ID BIGINT(20)UNSIGNED NOT NULL AUTO_INCREMENT。 ALTER TABLE wp_usermeta変更umeta_id umeta_id BIGINT(20)UNSIGNED NOT NULL AUTO_INCREMENT。
MySQLファイルの最後からインデックスをインポートするのを忘れていたので、同じ問題と自動インクリメントクエリを1つずつ起動するのが難しいスクリプトを作成しました。動的テーブルを取り、主キーをチェック自動インクリメントに動的に適用されます。
あなたのwp-config.phpからdb接続変数を取り出してyouWordPressssルートに保存し、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;
私はこれに関する更新を書きました。
all WPコアテーブルが存在することを確認するためにWPコアスキーマのビルドを使用します(将来5.1.1以降がリリースされた場合でも)。破損した行を削除し、キーを主キーに再追加します。無料のスクリプト(そしてより多くの説明)はここで見られることができます: https://wpindexfixer.tools.managedwphosting.nl/
自動インクリメント値も推測する必要はありません。