MySQL InnoDB row_id 境界オーバーフロー検証方法の手順

MySQL InnoDB row_id 境界オーバーフロー検証方法の手順

背景

クラスメートと row_id の境界問題について話し合ったので、ここで詳しく説明します。

InnoDB テーブルで主キーが定義されていない場合は、システムのデフォルトの増分 row_id (dict_sys->row_id) が主キーとして使用されます。行が挿入されるたびに 1 を追加し、最大値に達するまでこのプロセスを繰り返します。

dict_sys->row_id は unsigned long long として定義されていますが、この主キー値は 6 バイトしかないため、最大値は 2^48 になることに注意してください。 row_id がこの値を超えると、値は増加しますが、書き込み時に下位ビットのみが取得され、モジュロ演算と見なすことができます。

質問

これには問題があります。長時間実行される MySQL では、行が頻繁に挿入および削除される場合 (ログ テーブルなど)、最終的なテーブル サイズがそれほど大きくなくても、row_id 値の再利用が発生する可能性があります。また、主キー値であるため、繰り返すことはできないこともわかっています。

次のようなことが起こったとします。テーブルで、新しく挿入された行の row_id が古い行の row_id と競合します。何が起こるでしょうか?

確認する

実際、ここで必要な結論は 1 つだけです。この記事の目的は、検証方法について議論することです。上記の情報を基に、次の再現手順の設計を検討できます。

1) 主キーのない空のテーブルを作成する

2) gdbはdict_sys->row_idを1に設定する

3) 空のテーブルに複数の行を挿入する

4) gdbはdict_sys->row_idを2^48に設定する

5) さらに数行挿入する

6) 結果を見る

結論は

ご覧のとおり、行 (1) と (2) は上書きされています。

より合理的な解決策は、MySQL テーブルの自動インクリメント主キーと同様に、重複キー エラーを報告することです。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。

以下もご興味があるかもしれません:
  • Mysql InnoDBとMyISAMの違いの分析
  • MySQL innodb B+ツリーの高さを取得する方法
  • MySQL MyISAM と InnoDB の違い
  • MySQL InnoDBストレージエンジンについて簡単に説明します
  • MySQL Innodb ストレージ構造と Null 値の保存の詳細な説明
  • MySQL InnoDB のトランザクション特性を確保するにはどうすればよいですか?
  • MySQL 起動エラー InnoDB: ロックできません/ibdata1 エラー
  • MySQL InnoDB のロック機構の詳細な説明
  • MySQL (InnoDB) がデッドロックを処理する方法の詳細な説明
  • MySQL 学習 (VII): Innodb ストレージ エンジン インデックスの実装原理の詳細説明
  • MySQL slow_log テーブルを InnoDB エンジンに変更することはできません。詳細な説明
  • MySQL InnoDB の重要なコンポーネントの概要

<<:  キープアライブキャッシュをクリアする方法の詳細なグラフィック説明

>>:  Vue でキープアライブを使用した後にキャッシュをクリアする方法

推薦する

JavaScriptプロトタイプとプロトタイプチェーンを徹底的に理解する

目次序文基礎を築くプロトタイプコンストラクタのプロパティ__プロト__プロトタイプチェーン改善する要...

Windows サーバー管理におけるセキュリティの考慮事項

ウェブサーバー1. Webサーバーは、wev、cgi、asp機能を無効にするなど、不要なIISコンポ...

Vueのデータ応答性原則の詳細な説明

この記事は主に、Vue のレスポンシブ ソース コードを理解していない、または触れたことがない人向け...

mysql を解決: エラー 1045 (28000): ユーザー 'root'@'localhost' のアクセスが拒否されました (パスワードの使用: NO/YES)

1. 問題時々Mysqlにログインしてパスワードを入力すると、この状況が発生しますmysql -u...

Node.js でのブレークポイント再開の実装

序文通常のビジネスニーズ: 写真、Excel などをアップロードします。結局のところ、数 MB のサ...

docker runの--rmオプションの使用方法

Docker コンテナが終了しても、デバッグを容易にし、ユーザー データを保持するために、デフォルト...

Firefox で Webdings フォントをサポートする方法

Firefox、Opera、その他のブラウザは Webdings フォントをサポートしていません。回...

LeetCode の SQL 実装 (177. 給与が N 番目に高い)

[LeetCode] 177. 最も高い給与従業員テーブルからn番目に高い給与を取得する SQL ...

React antdはフォームの動的な増減を実現します

以前、動的フォームを記述しているときに落とし穴に遭遇しました。インデックスの添え字をキーとして使用す...

CSS flex 複数列レイアウト

基本的な3列レイアウト 。容器{ ディスプレイ: フレックス; 幅: 500ピクセル; 高さ: 20...

画像の下部の空白部分の問題を解決する

最近のプロジェクトに取り組んでいるとき、下の図に示すように、画像を参照すると常に下部に空白スペースが...

一般的な MySQL ストレージ エンジンとパラメータ設定およびチューニングの紹介

MyISAM、MySQLでよく使われるストレージエンジン特性: 1. 同時実行性とロックレベル2. ...

HTML チュートリアル: 画像のサイズ、配置、間隔、境界線の属性を変更する方法

画像タグ: <img> ページに画像を挿入するには、「src」属性を持つ「img」タグを...

Mac 環境での Nginx 構成とローカル静的リソースへのアクセスの実装

ローカル開発では、直接アクセスできない静的ファイル リソースのデバッグが必要になる場合があります。こ...