MySQLオンラインDDLの使用に関する詳細な説明

MySQLオンラインDDLの使用に関する詳細な説明

文章

オンライン DDL は MySQL 5.6 でのみサポートされています。バージョン 5.5 以前では、alter table/create index などのコマンドを使用してテーブル構造を変更するとテーブルがロックされますが、これは明らかに実稼働環境では受け入れられません。

MySQL 5.7では、オンラインDDLはパフォーマンスと安定性の面で継続的に最適化されています。パフォーマンス上の利点が大きく、業務負荷への影響が少なく、ダウンタイムを制御できます。pt-osc/gh-ostと比較して、サードパーティの依存パッケージのインストールは不要です。また、インプレースアルゴリズムのオンラインDDLもサポートしています。テーブルをコピーする必要がないため、必要なディスク容量も小さくなります。

まず、一般的な DDL ステートメントを見てみましょう。

ALTER TABLE tbl_name ADD PRIMARY KEY (列)、ALGORITHM=INPLACE、LOCK=NONE;

このうち、LOCK は DDL 操作時の同時実行の度合いを記述し、ALGORITHM は DDL の実装方法を記述します。

LOCKパラメータ

  1. LOCK=NONE: 同時クエリとDML操作を許可する
  2. LOCK=SHARED: 同時クエリを許可しますが、DML操作はブロックします
  3. LOCK=DEFAULT: システムによって決定される、可能な限りの同時実行性 (同時クエリ、DML、またはその両方) を許可します。 LOCK句を省略した場合は、LOCK=DEFAULTを指定するのと同じになります。
  4. LOCK=EXCLUSIVE: 同時クエリと DML 操作をブロックします。

アルゴリズムパラメータ

  1. ALGORITHM=COPY: pt-osc/gh-ost と同様に、コピー メソッドを使用してテーブルを変更します。
  2. ALGORITHM=INPLACE: エンジン層のデータのみを変更する必要があり、サーバー層は関係ありません。

COPY TABLE プロセス

  1. まず、ALTAR TABLE によって構造が変更された一時テーブルを作成します。
  2. 元のテーブルのデータを一時テーブルにインポートします(サーバー層によって一時テーブルが作成され、IBDファイルが表示されます)
  3. 元のテーブルを削除する
  4. 一時テーブルの名前を元のテーブル名に変更します

同時に、この処理中にデータの一貫性を保つために、中間データのコピー(Copy Table)中はテーブルがロックされ、読み取り専用になります。書き込み要求が来た場合、サービスが提供できなくなり、接続数が爆発的に増加します。

IN-PLACEプロセス

  1. 一時ファイルを作成し、元のテーブルの主キーのすべてのデータページをスキャンします。
  2. データ ページ内の元のテーブル レコードを使用して B+ ツリーを生成し、一時ファイルに保存します (innodb_temp_data_file_path 一時テーブルスペースに一時ファイルを作成します)
  3. 一時ファイルを生成する過程で、元のテーブルに対するすべての操作がログファイル(rowlog)に記録されます。
  4. 一時ファイルが生成されたら、ログ ファイル内の操作を一時ファイルに適用して、データの点で元のテーブルと同一のテーブルを取得します。
  5. データファイル(ログファイルは操作を記録および再生します)
  6. 元のテーブルデータファイルを一時ファイルに置き換えます

このプロセスでは、ALTER ステートメントは開始時に MDL 書き込みロックを取得しますが、この書き込みロックは、データが実際にコピーされる前に読み取りロックに退化します。つまり、最も時間のかかる一時ファイルにデータをコピーするプロセス中に、元のテーブルを DML で操作できます。ロックされるのは、古いテーブルと新しいテーブル間の最終切り替えフェーズ中のみです。この名前変更プロセスは非常に高速です。

DMLとDDLの同時操作を許可する

  • セカンダリインデックスを作成/追加する
  • セカンダリインデックスの名前を変更する
  • セカンダリインデックスの削除
  • インデックスタイプの変更 ({BTREE | HASH} を使用)
  • 主キーを追加する(コストが高い)
  • 主キーを削除して別の主キーを追加します (コストが高い) (ALTER TABLE tbl_name DROP PRIMARY KEY、ADD PRIMARY KEY (column)、ALGORITHM=INPLACE、LOCK=NONE;)
  • 新しいコラム(高額な費用)
  • 列を削除する(コストが高い)
  • 列の名前を変更する
  • 列の並べ替え(コストが高い)
  • 列のデフォルト値の変更
  • 列のデフォルト値を削除する
  • 列の自動増分値を変更する
  • 列属性を null/not null に設定する (コストが高い)
  • 列挙型またはコレクション列の定義を変更する
  • ROW_FORMATを変更する
  • キーブロックサイズを変更する

オンライン DDL は、コストが高いとマークされた操作には使用できますが、サーバーの IO と CPU に大きな負荷がかかります。また、レプリケーションのブロックも発生し、スレーブ レプリケーションの遅延という別の形を引き起こします。したがって、テーブルが大きい場合は、オフピーク時に実行することをお勧めします。

同時DMLを許可しないDDL操作

  • 全文インデックスを追加する
  • 空間インデックスの追加
  • 主キーの削除
  • 列のデータ型の変更
  • 自動増分列を追加します (新しい列を追加 -> 自動増分列に変更)
  • テーブル文字セットの変更
  • データ型の長さを変更する
    • 特殊なケース: varchar 文字の長さが 10 から 255 未満に変更された場合、インプレース メソッドを使用するとテーブルはロックされません。ただし、255 から 10 に変更された場合はテーブルがロックされます。

上記はMySQL Online DDLの使用に関する詳細な説明の詳細な内容です。MySQL Online DDLの使用に関する詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQL 8.0 で列を素早く追加する方法
  • MySQL DDL による同期遅延を解決する方法
  • MySQL 8.0 アトミック DDL 構文の詳細な説明
  • MySQL オンライン DDL ツール gh-ost 原理分析
  • MySQL DDLステートメントの使用
  • 一般的なMysql DDL操作の概要
  • MySQL 8.0 の新機能の分析 - トランザクション データ ディクショナリとアトミック DDL
  • MySQL データ定義言語 DDL の基本ステートメント
  • MySQL 8.0 DDLアトミック機能と実装原則
  • MySQLオンラインDDL gh-ostの使用の概要
  • MySQL 5.7 でブロックポジショニング DDL の問題を解決する
  • MySQL 8.0 の新機能: アトミック DDL ステートメントのサポート
  • MySQL がユーザー名とパスワードの漏洩を引き起こす可能性のある Riddle の脆弱性を公開
  • MySQL 8.0 オンライン DDL クイック列追加の概要

<<:  入力ファイルのカスタムボタンの美化(デモ)

>>:  Javascript サンプル プロジェクトでの虫眼鏡効果の実装プロセス

推薦する

JS での矢印関数と this の記述と理解

目次序文1. JSで関数を書く方法1. 通常の関数の書き方2. 矢印関数の書き方2. 通常の関数でこ...

GoのDockerデプロイメント用の基本イメージ2つの実装

1. golang:最新のベースイメージ mkdir gotest タッチメイン.go Docker...

CSSの固定位置属性の詳細な説明

モバイル アプリを開発する場合、Web サイトが特定の高さまでスクロールしたときにコンテンツの一部を...

nginxリバースプロキシwebSocket設定の詳細な説明

最近、プロジェクトで作業しているときに webSocket プロトコルを使用し、WeChat アプレ...

Linux の一般的なテキスト処理コマンドと vim テキストエディタ

今日は、いくつかの一般的なテキスト処理コマンドとvimテキストエディタを紹介します。 3日目 - 一...

MySQL ストアド プロシージャと共通関数のコード分析

mysql ストアド プロシージャの概念:特定のタスク (クエリと更新) を実行できる、データベース...

this.parentNode.parentNode (親ノードの親ノード) はどういう意味ですか?

親ノードの親ノード、例えば、このような段落がありますHTML:コードをコピーコードは次のとおりです。...

Linux での SSH パスワードフリーログイン設定の詳細な説明

Linux サーバー A と B が 2 台あり、一方のサーバーから SSH 経由でパスワードなしで...

docker CMD/ENTRYPOINT が sh スクリプトを実行する問題の解決策: not found/run.sh:

Dockerfile の設定に問題はありませんが、ENTRYPOINT コマンドを実行するとエラー...

Nginx での SSL 証明書のインストールと展開手順の概要

目次問題の説明:インストール手順1. 準備2. サーバーにリモート接続する3. 証明書と秘密鍵ファイ...

CSSはヒントボックス、バブルボックス、三角形を作成します

場合によっては、ページにプロンプ​​ト ボックスやバブル ボックスが必要になることがあります。CSS...

Nginx を使用して IP アドレスが悪意を持って解決されるのを防ぐ方法

Nginxを使用する目的Alibaba Cloud ECS クラウド サーバーを使用して、まずは著者...

Docker、プレーヤー機能を備えたCMSオンデマンドシステムを構築

目次文章1. 機械を準備する2. Dockerをインストールする1. 依存パッケージをインストールす...

UbuntuでOpenCVをコンパイルしてインストールする方法

opencv2 の簡単なインストール: conda インストール --channel https:/...

ファイルの種類を検出するJavaScriptメソッド

目次1. 画像のバイナリデータを表示する方法2. 絵の種類の見分け方3. 画像の種類を検出する方法3...