mysqlを再起動します.auto_incrementの値リセット(InnoDB)

3975 ワード

先日、mysqlデータベースがマシンを移行した後、auto_に遭遇しました.incrementがmysqlの再起動後に値をリセットした問題と、ユーザー名のパスワードが正しい場合に接続を拒否した問題について、ネット上で検索した資料の説明は以下の通りです.
a.接続拒否Linux環境下でJAVAプログラムを実行し、接続文字列の中でデータベースサーバーアドレスをlocalhostに配置し、ユーザー名パスワードが正しく、接続時にエラーが発生した:java.sql.SQLException: Access denied for user 'root'@'127.0.0.1' (using password: YES)'. コマンドライン接続による正常な解決方法:コマンドラインでmysql GRANT ALL PRIVILEGES ON*.*を登録するTO 'root'@'127.0.0.1' IDENTIFIED BY 'root123' WITH GRANT OPTION;
b.MYSQLマニュアル(http://dev.mysql.com/doc/refman/5.1/zh/storage-engines.html#innodb-auto-increment-column)
15.2.6.3. AUTO_INCREMENT列はInnoDBでどのように働いていますか
テーブルにAUTOを指定するとINCREMENT列は、データ辞書のInnoDBテーブルハンドルに自動成長カウンタというカウンタが含まれており、この列に新しい値を割り当てるために使用されます.自動成長カウンタは、ディスクが存在するのではなく、プライマリメモリにのみ格納されます.
InnoDBは次のアルゴリズムを使用してai_という名前を含むcolのAUTO_INCREMENT列のテーブルT初期化自動成長カウンタ:サーバ起動後、1人のユーザがテーブルTを挿入すると、InnoDBは以下の文に等価な動作を実行する.
SELECT MAX(ai_col) FROM T FOR UPDATE;

文が取り戻した値は逐次加算され、カラムと自動成長カウンタに割り当てられます.テーブルが空の場合、値1はカラムに与えられます.自動成長カウンタが初期化されておらず、ユーザが表Tに出力を表示するSHOW TABLE STATUS文を呼び出すと、カウンタは初期化され(カウントは増加しないが)、その後の挿入のために記憶される.この初期化では、トランザクションの終了までテーブルを通常の独占リードロックします.
InnoDBペアは、新しくテーブルを作成した初期化自動成長カウンタに対して同様のプロセスを許可する.
ユーザがINSERTでAUTO_である場合INCREMENT列はNULLまたは0を指定し、InnoDB処理行は、値がまだ指定されていないかのように、新しい値を生成します.
自動成長カウンタが初期化された後、ユーザーがカラム値を明確に指定した行を挿入し、現在のカウンタ値より大きい場合、カウンタはカラム値を指定するように設定されます.値が明示的に指定されていない場合、InnoDBはカウンタに1を追加し、カラムに新しい値を割り当てます.
自動成長カウンタにアクセスすると、InnoDBは、ビジネスの終了ではなく現在のSQL文の終了まで、専用のテーブルレベルのAUTO-NCロックを使用します.AUTO_を含む1つのロック解除ポリシーが導入されましたINCREMENT列のテーブルの挿入改善配置.両方のトランザクションが同じテーブルに対してAUTO-INCロックを同時に持つことはできません.
カウンタから取得したトランザクションをロールバックすると、AUTO_に付与される可能性があります.INCREMENT列の値のシーケンスにギャップが見つかりました.
ユーザーがカラムに値を割り当てる場合、または値が指定した整数形式で格納できる最大整数より大きい場合、自動成長メカニズムの動作は定義されません.
CREATE TABLEとALTER TABLE文では、InnoDBがAUTO_をサポートINCREMENT=nテーブルオプションで、カウンタの初期値を設定するか、現在のカウンタ値を変更します.このセクションで先に説明したため、このオプションの影響はサーバの再起動後に無効になります.
c. http://www.iteye.com/problems/64981
最近mysqlのバグに遭遇して、mysqlを再起動して、auto_incrementの値をリセットします.シナリオ:mysql 5.0,innodbモードテーブルaのidをauto_に設定increment型先insertテーブルa 100行、このときid最大値は100である.更に90行を削除します:後の2種類の情況が現れます:1.mysqlを再起動せずに、テーブルaの行レコードを挿入し続け、この行レコードのidは101である.2 mysqlを再起動し、表aの行レコードを挿入し、この行レコードのidは11である.これはmysqlのバグだと思いますが、皆さんはこのような状況に遭遇したことがありますか?このような問題を解決する達人はいますか?私が望んでいるのは、再起動後に表aに挿入されたこの行の記録のidが101だと思っているので、仕方がありませんか?
-----------------------------------------------------------------------------------------------------
あなたの時計のエンジンはInnoDbからMyISAMに変更すればいいです(ただMyISAMは事務をサポートしていません)具体的にはなぜ公式の言い方を見ることができますか?http://dev.mysql.com/doc/refman/5.0/en/innodb-auto-increment-handling.html
参照
innodbエンジンを使用したテーブルにauto_を指定した場合increment列では、列を指定せずにデータを挿入し、この挿入に失敗するとinsertはロールバックしますが、show create table xxxでauto_を表示するとincrementの最新値を見ると、auto_incrementはロールバックしていません.どうしたの?
MySQL Manualでは、この問題についての説明があります:AUTO_INCREMENT Handling in InnoDB.
ざっと話してください.MySQLでinnodbエンジンを使用したテーブルにauto_を指定した場合increment列です.このテーブルにはauto_があります.incrementカウンタ、現在のauto_を専門に記録incrementの相関値.insert時にauto_increment列付与.重要なのは、このカウント値がディスクではなくメモリに保存されていることです.mysql serverが実行されている場合、このカウント値はinsertの変更に伴ってのみ増加し、deleteに伴って減少しません.言い換えればauto_incrementカウント値は常に増加状態であり、減少しません.このときデータベースに100個のレコードがあり、idが1から100までauto_incrementカウント値は101(カウント値は常に次のinsertの値、すなわち現在のauto_increment列の値よりも1つ大きい)であり、delete id=100の記録後、さらに1つの文をinsertすると、この文のidは100ではなく101である.
mysql serverが再起動するとauto_incrementの値は変更される可能性があります.最初はinnodbがディスクではなくメモリに格納されているため、起動したばかりのときにauto_をクエリーする必要があります.incrementカウント値の場合、mysqlは自動的に実行されます.
SELECT MAX(id) FROM t FOR UPDATE;
現在のauto_を取得する文increment列の最大値をauto_に配置します.incrementカウンタにあります.
次に、ユーザがid列の値を表示的に指定しない限りauto_incrementカウンタ値はinsertのたびに自動的に増加し、挿入するレコードごとに1増加する.
では、私が指定したid列の値を表示し、指定した値が現在のauto_よりも大きい場合incrementカウンタの値が大きい場合、どのように処理しますか?mysqlはこの値を1から増やしてauto_に割り当てます.incrementカウンタ.
トランザクションにinsert操作がある場合auto_incrementカウンタは増加しましたが、最後にrollbackになりました.auto_incrementはrollbackに従わないので注意してください.