1

私たちの本番データベースで大きな問題を抱えているのを手伝ってください。非常に大きな値のキーを誤って自動インクリメント列に挿入してしまいましたが、今では、再構築に時間がかかると、この値を変更できないようです。

ALTER TABLE tracks_copy AUTO_INCREMENT = 661482981

超遅いです。

これを本番環境で修正するにはどうすればよいですか?私もこれを機能させることができません(効果はありません):

myisamchk tracks.MYI --set-auto-increment=661482982

何か案は?

基本的に、私が何をしても、オーバーフローが発生します。

SHOW CREATE TABLE tracks
CREATE TABLE tracks (
...
) ENGINE=MYISAM AUTO_INCREMENT=2147483648 DEFAULT CHARSET=latin1
4

2 に答える 2

2

これに何時間も苦労した後、私はついにそれを解決することができました。myISAMのauto_increment情報はTableName.MYIに保存されます。http://forge.mysql.com/wiki/MySQL_Internals_MyISAMのstate->auto_incrementを参照してください。したがって、そのファイルを修正することが正しい方法でした。

ただし、myisamchkには、update_auto_increment関数またはそれが呼び出すもののどこかにオーバーフローバグがあるため、大きな値では機能しません。つまり、現在の値がすでに2 ^ 31を超えている場合は、更新されません(ソースファイルはこちら)。 --http://www.google.com/codesearch/p?hl = en#kYwBl4fvuWY / pub / FreeBSD / distfiles / mysql - 3.23.58.tar.gz%7C7yotzCtP7Ko / mysql- 3.23.58 / myisam / mi_check c&q = mySQL%20%22AUTO_INCREMENT =%22%20lang:c

これを発見した後、私は「xxd」を使用してMYIファイルをhexfileにダンプし、バイト60前後を編集し、hexfileのauto_increment値を手動で置き換えることになりました。「xxd-r」は、16進ファイルからバイナリファイルを復元します。何を編集するかを正確に見つけるために、はるかに小さいテーブルでALTER TABLEを使用し、diffを使用して効果を調べました。面白くありませんが、最終的には機能しました。フォーマットにチェックサムがあるようですが、無視されているようです。

于 2010-04-21T22:17:06.680 に答える
0

非常に大きなキーでレコードを削除しましたか?そのレコードがまだ存在する場合、auto_incrementをより低い値に変更することはできないと思います。

myisamchkのドキュメントから:

新しいレコードのAUTO_INCREMENT番号付けを、指定された値から開始するように強制します(AUTO_INCREMENT値がこれほど大きい既存のレコードがある場合はそれ以上)。

于 2010-04-21T19:41:57.453 に答える