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 サンプル プロジェクトでの虫眼鏡効果の実装プロセス

推薦する

Vue で棒グラフを使用し、自分で設定を変更する方法

1. HTMLファイルでechartをインポートする <!-- echarts をインポート ...

CentOS7 で yum ソースをインストールし、コマンド rz と sz をアップロードおよびダウンロードする方法 (画像付き)

** CentOS7 で yum ソースをインストールし、rz および sz コマンドをアップロー...

nginxのインストールと設定の詳細なプロセス記録

目次1 nginxの紹介1 nginxとは何か2 つのアプリケーション シナリオ2 nginxのイン...

優れたウェブフロントエンドデザインの指標

Web ページのアクセシビリティは、フロントエンドでのみ評価および実装できるもののようです。ユーザビ...

Linux SecureCRT の文字化けの解決方法

SecureCRT が文字化けした文字を表示する状況を見てみましょう。例えば: ではリセットしてみま...

Dockerコンテナ内で2つのプロセスを開始するときのDockerfile実装コード

最近、cronスケジュールタスク用のdockerを作りたいと思っており、Dockerfileで次のよ...

QTとJavaScript間のインタラクティブデータの実装

1. QTからJSへのデータフロー1. QTはJS関数を呼び出し、JSはパラメータを通じてQTの値を...

Windows 2016 Server セキュリティ設定

目次システムアップデート構成Windows Update サーバーの変更自動更新を有効にして許可する...

Zabbix が MySQL のマスター/スレーブ状態を監視する方法の詳細な説明

MySQLマスタースレーブを設定した後、スレーブの状態が正常かどうかわからないことが多く、例外が発生...

MySQL交換パーティションの詳細な例

MySQL交換パーティションの詳細な例序文exchange パーティションを紹介する前に、まず my...

Linux システムでキャッシュをクリアする方法の概要

1) キャッシュメカニズムの紹介Linux システムでは、ファイルシステムのパフォーマンスを向上させ...

MacにMySQLデータベースをインストールする方法を教えます

Mac 用 MySQL をダウンロード: https://downloads.mysql.com/a...

JSはユーザー登録インターフェース機能を実装します

この記事の例では、ユーザー登録インターフェース機能を実装するためのJSの具体的なコードを参考までに共...

React Nativeプロジェクトフレームワークの構築経験

React Native は、2015 年 4 月に Facebook によってオープンソース化され...