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

推薦する

Linux で指定された期間に数分ごとにタスク スケジュール crontab を自動的に実行する方法

まずコードを見てみましょう #/bin/sh datename=$(日付 +%Y%m%d-%H%M%...

ツールベースのウェブサイトの考察: ツールベースのウェブサイトの定義と典型的なケース分析 (写真とテキスト)

ツール型ウェブサイトについて、まず疑問に思うのは、無数のオンラインウェブサイトの中で、どのようなウェ...

HTML テーブルタグチュートリアル (46): テーブルフッタータグ

<tfoot> タグは、テーブル フッターのスタイルを定義するために使用されます。基本構...

jsプロキシの原理の詳細な説明

目次プロキシモードとは何ですか?実例を紹介例を使ってプロキシモデルの定義を理解するプロキシとはget...

クラウドサーバーを購入し、Alibaba Cloud に Pagoda Panel をインストールする手順

アリババクラウドがサーバーを購入クラウドサーバーを購入し、サーバーバージョンとしてcentos 7....

mysql 解凍パッケージの基本インストールチュートリアル

新しいコンピューターに変更したので、すべての環境を新しいコンピューター上で設定する必要があります。ふ...

ApplicationHost.config (IIS ストレージ構成領域ファイル) の概要

新しく作成された Web サイトの場合は、ASP.NET MVC5 を例に挙げます。セッションを処理...

Vue3 の動的コンポーネントはどのように機能しますか?

目次1. コンポーネントの登録1.1 グローバル登録1.2 グローバルコンポーネントの登録プロセス1...

MySQL 8.0 の新機能 - チェック制約の紹介

目次序文チェック制約作成、削除、表示制限要約する序文MySQL 8.0 では、チェック制約という非常...

Windows での MySQL コミュニティ サーバー 8.0.16 のインストールと構成方法のグラフィック チュートリアル

最近、MySQL関連の構文をよく見かけます。また、MySQLストアドプロシージャの書き方も学びたいの...

Linuxでmore、less、catコマンドを使用してファイルの内容を表示します

Linux では、cat、more、less の各コマンドを使用してファイルの内容を表示できます。c...

完璧なアロエベラジェルを選ぶには?完璧なアロエベラジェルの本物と偽物の見分け方

最新のパーフェクト アロエ ベラ ジェルのパッケージ ボックスには、赤いフォントで完璧な英語の文字が...

Vue 画像切り抜きコンポーネントのサンプルコード

例:ヒント:このコンポーネントはvue-cropperの二次パッケージに基づいていますプラグインをイ...

Vue における v-model を使用したクロスコンポーネントバインディングの基本的な実装方法

みなさんこんにちは。今日はv-modelを使って親子コンポーネントのバインディング効果を実現する方法...

Bootstrapはカルーセルの効果を実現します

この記事では、カルーセルマップの効果を実現するためのBootstrapの具体的なコードを参考までに共...