MySQL の自動インクリメント ID はすべて初期値を定義し、その後ステップ サイズを継続的に増加します。自然数には上限がありませんが、数値を表現するのに使用されるバイト長は定義されているため、コンピュータのストレージには上限があります。たとえば、 unsigned int は 4 バイトで、その上限は テーブル定義の自動増分 ID自動増分値が上限に達した後のテーブル定義のロジックは、次の ID を適用するときに、取得された値は変更されないままになります。 mysql> テーブル t を作成します (id int unsigned auto_increment 主キー) auto_increment=4294967295; クエリは正常、影響を受けた行は 0 行 (0.01 秒) mysql> t 値に挿入します(null); クエリは正常、1 行が影響を受けました (0.00 秒) mysql> show テーブル t を作成します。 +-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | テーブル | テーブルの作成 | +-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | t | テーブル `t` を作成する ( `id` int unsigned NOT NULL AUTO_INCREMENT, 主キー (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4294967295 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci | +-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ セット内の 1 行 (0.00 秒) //4294967295 行を正常に挿入しました mysql> t 値に挿入します(null); エラー 1062 (23000): キー 't.PRIMARY' のエントリ '4294967295' が重複しています 最初の挿入が成功した後、テーブルのAUTO_INCREMENT は4294967295 のままであるため、2 番目の挿入で同じ自動増分 ID 値が取得され、挿入ステートメントの実行が試行され、主キーの競合が発生します。 InnoDBシステムはrow_idを自動的に増加させる主キーを指定せずに InnoDB テーブルを作成すると、InnoDB は自動的に非表示の 6 バイトのrow_idを作成します。 InnoDBはグローバル 主キーのないすべての InnoDB テーブルでは、データ行が挿入されるたびに、現在の コードが実装されると、 row_id は長さが 8 バイトの符号なし long 整数 (bigint unsigned) になります。しかし、InnoDB が設計された当時、 row_idの長さは 6 バイトしかなかったため、データ テーブルに書き込まれる際には最後の 6 バイトのみが配置されていました。そのため、データ テーブルに書き込むことができるrow_idの値には、次の 2 つの特徴があります。
つまり、テーブルに書き込まれる row_id の範囲は この結論を検証します。gdb を通じてシステムの自動インクリメントrow_id を変更します。 GDB は問題の再現を容易にするために使用され、テスト環境でのみ使用できます。 row_idが検証シーケンスで使い果たされました
使用後の効果の検証 gdb を使用して dict_sys.row_id を 2^48 に設定すると、この値の row_id が 0 であるため、テーブル t の最初の行に a=2 が挿入されることがわかります。 したがって、InnoDB テーブルに自動インクリメント主キーを積極的に作成する必要があります。テーブルの自動インクリメント ID が上限に達すると、データを挿入するときに主キーの競合エラーが報告されます。 シドREDO ログと binlog には、トランザクションに対応するために使用される共通フィールド Xid があります。 MySQL 内で Xid はどのように生成されますか? MySQLは内部的にグローバル変数 ステートメントが実行されるたびに、それが 現在のステートメントがトランザクションによって実行される最初のステートメントである場合、MySQL はトランザクションの Xid に
ただし、MySQL を再起動すると、新しい binlog ファイルが再生成され、同じ binlog ファイル内の Xid が一意であることが保証されます。 MySQL を再起動しても同じ binlog に 2 つの同一の Xid が表示されることはありませんが、
Innodb の trx_id Xidはサーバー層によって管理される しかし、InnoDB 独自の trx_id は、別途管理されるトランザクション ID です。 InnoDB は内部的に max_trx_id グローバル変数を維持します。新しい trx_id が必要になるたびに、max_trx_id の現在の値が取得され、max_trx_id が 1 ずつ増加します。 InnoDBデータ可視性の核となる考え方各データ行には、それを更新する trx_id が記録されます。トランザクションがデータ行を読み取ると、トランザクションの一貫性のあるビューとデータ行の trx_id を比較して、データが表示可能かどうかを判断します。 実行中のトランザクションについては、information_schema.innodb_trx テーブルからトランザクションの trx_id を確認できます。 次の例を参照してください: トランザクションのtrx_id
S2の実行記録: mysql> information_schema を使用します。 テーブル名と列名の補完のためのテーブル情報の読み取り -Aでこの機能をオフにすると起動が速くなります。 データベースが変更されました mysql> innodb_trx から trx_id、trx_mysql_thread_id を選択します。 +-----------------+---------------------+ | trx_id | trx_mysql_thread_id | +-----------------+---------------------+ | 421972504382792 | 70 | +-----------------+---------------------+ セット内の 1 行 (0.00 秒) mysql> innodb_trx から trx_id、trx_mysql_thread_id を選択します。 +---------+---------------------+ | trx_id | trx_mysql_thread_id | +---------+---------------------+ | 1355623 | 70 | +---------+---------------------+ セット内の1行(0.01秒) S2 は、innodb_trx テーブルからこれら 2 つのフィールドを取得します。2 番目のフィールド t2 に表示される trx_id は非常に大きな数値ですが、t4 に表示される trx_id は 1289 で、比較的正常な数値のように見えます。これはなぜでしょうか?
明らかな変更ステートメントに加えて、select ステートメントの後に for update が追加された場合、それは読み取り専用トランザクションではありません。
t2 で見つかった大きな数字はどこから来たのでしょうか? これにより、次のことが保証されます。
なぜ248を追加するのですか? 読み取り専用トランザクションに表示される trx_id 値が比較的大きいことを確認して、通常の状況下で読み取り/書き込みトランザクションの ID と区別できるようにします。ただし、trx_id のロジックは row_id と似ており、8 バイトとして定義されます。 読み取り専用トランザクションに trx_id が割り当てられないのはなぜですか?
読み取り専用トランザクションでは trx_id が割り当てられないため、trx_id の増加率は明らかに低下します。 この状態に達すると、MySQL ではダーティ リード バグが発生し続けます。 ダーティリードを再現する システムの max_trx_id は 2^48 - 1 に設定されているため、セッション A で開始されたトランザクション TA の最低水準点は 2^48 - 1 になります。 t2時:
t3時: セッション A は選択可視性判断を実行します。データ バージョン c=3 の trx_id (0) はトランザクション TA の最低水準点 (2^48 - 1) より小さいため、データは可視であると見なされます。 しかし、これは汚い読み方です。 また、MySQL を再起動しても これにより、低水準点とデータの可視性についての理解も深まります。 スレッドIDシステムはグローバル変数 新しい接続が作成されるたびに、 ただし、 新しいスレッドに 要約する各自動インクリメント ID には独自のアプリケーション シナリオがあり、上限に達した後の動作が異なります。
オンラインのMySQL自動増分IDが枯渇した場合の対処法については以上です。MySQL自動増分ID枯渇に関する詳細は、123WORDPRESS.COMの過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。今後とも123WORDPRESS.COMをよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Web コンポーネントの内部イベント コールバックと問題点の分析
>>: テーブルはセルとimg画像を結合してtd HTML全体を埋めます
目次序文問題: 大きなファイルのコピーNodeJS のストリームとバッファバッファストリーム解決策 ...
ブラウザの互換性とは、スタイルの互換性 (CSS)、インタラクションの互換性 (JavaScript...
目次序文Viteプロジェクトを作成する改修プロジェクトディレクトリの規則その他の構成序文毎日鳩、火ば...
JS を使用してオブジェクト指向メソッドを実装し、JD.com の 5 つ星レビュー効果を実現します...
目次charとvarcharの違いcharとvarcharの違い上記は、MySQL における cha...
MySQL での置換例の詳細な説明replace into は insert と似ていますが、rep...
プロジェクトの作業を開始するときは、ワイヤーフレームを使用してアイデアをスケッチすることが重要です。...
今日は、CSS3 の transition-delay 属性のデフォルト値 0 に単位がないのは無効...
MySQL スロー クエリ ログは、問題のあるクエリを追跡するのに非常に役立ちます。現在のプログラム...
この記事では、ページ印刷の自動ページングを実現するためのVueの具体的なコードを例として紹介します。...
1. 公式サイトからmysql-8.0.17-winx64をダウンロードし、Zipファイル形式を選択...
準備1. マスターとスレーブのデータベースのバージョンは一致している必要があります2. マスターデー...
HTTP圧縮とは場合によっては、比較的大きなメッセージ データがクライアントとサーバー間で送信され、...
Linux システムのネットワーク接続を構成するのは難しい場合があります。幸いなことに、多くの新しい...
序文Docker イメージは Dockerfile といくつかの必要な依存関係で構成され、Docke...