sql >> データベース >  >> RDS >> Mysql

大規模なMySQLInnoDBテーブルの変更

    2016年の編集: 最近(2016年8月)gh-ostをリリースしました 、それを反映するように私の答えを修正します。

    今日、MySQLのテーブルをオンラインで変更できるツールがいくつかあります。これらは次のとおりです。

    • 2016年の編集: gh-ost :GitHubのトリガーレススキーマ移行ツール(免責事項:私はこのツールの作成者です)
    • oak-online-変更テーブルopenark-kitの一部として (免責事項:私はこのツールの作成者です)
    • pt-online-schema-変更 Percona Toolkitの一部として
    • Facebookのオンラインスキーマの変更MySQLの場合

    「通常の」`ALTERTABLE`について考えてみましょう:

    大きなテーブルはALTERに時間がかかります 。 innodb_buffer_pool_size 重要であり、他の変数も重要ですが、非常に大きなテーブルでは、それらはすべて無視できます。時間がかかるだけです。

    MySQLがALTERに対して行うこと テーブルとは、新しい形式で新しいテーブルを作成し、すべての行をコピーしてから切り替えることです。この間、テーブルは完全にロックされています。

    独自の提案を検討してください:

    ほとんどの場合、すべてのオプションの中で最悪のパフォーマンスを示します。何故ですか? InnoDBテーブルを使用しているため、INSERT INTO tablename_tmp SELECT * FROM tablename トランザクションになります。 巨大 取引。通常のALTER TABLEよりもさらに多くの負荷が発生します 。

    さらに、その時点でアプリケーションをシャットダウンして、書き込みが行われないようにする必要があります(INSERTDELETEUPDATE )あなたのテーブルに。もしそうなら、あなたのトランザクション全体は無意味です。

    オンラインツールが提供するもの

    すべてのツールが同じように機能するわけではありません。ただし、基本は共有されています:

    • スキーマが変更された「シャドウ」テーブルを作成します
    • トリガーを作成して使用し、元のテーブルからゴーストテーブルに変更を伝播します
    • ゆっくりと テーブルからシャドウテーブルにすべての行をコピーします。それらはチャンクでそうします:例えば、一度に1,000行。
    • 元のテーブルにアクセスして操作できる間に、上記のすべてを実行します。
    • 満足したら、RENAMEを使用して2つを交換します 。

    openark-kit ツールは3。5年間使用されています。 Perconaツールは数か月前のものですが、前者よりもテストされている可能性があります。 FacebookのツールはFacebookでうまく機能すると言われていますが、平均的なユーザーに一般的なソリューションを提供していません。自分では使ったことがありません。

    2016年の編集: gh-ost はトリガーレスソリューションであり、マスターのマスター書き込み負荷を大幅に削減し、移行書き込み負荷を通常の負荷から切り離します。それは監査可能、制御可能、テスト可能です。 GitHubで社内で開発し、オープンソースとしてリリースしました。 gh-ostを介してすべての本番環境の移行を行っています 今日。詳細については、こちら をご覧ください。 。

    各ツールには独自の制限があります。ドキュメントをよく見てください。

    保守的な方法

    保守的な方法は、アクティブ-パッシブマスター-マスターレプリケーションを使用し、ALTERを実行することです。 スタンバイ(パッシブ)サーバーで、役割を切り替えてALTERを実行します 以前はアクティブサーバーでしたが、現在はパッシブになっています。これも良いオプションですが、追加のサーバーとレプリケーションに関するより深い知識が必要です。



    1. 1〜3のランダムな番号を持つMySQL UPDATE

    2. それぞれの一意の値とカウントを取得する

    3. MySQL多対多選択

    4. MariaDB JSON_ARRAYAGG()の説明