mysqldumpが進行中の場合、ユーザーはシステムの実行速度が遅いと不平を言う


9

MYSQLデータベース(ibdata1)のサイズは73 GBで、Windows 2008 O / SでINNODBテーブルの専用データベースサーバーとして実行するように構成されています。mysqldumpを使用してバックアップを実行していますmysqldump --skip-opt --quick --single-transaction --create-options --extended-insert --disable-keys --add-drop-table --complete-insert- set-charset-圧縮--log-error = Proddb0635.err -u root -pjohndoe Proddb> \ devNas \ devNas \ sqlbackup \ LIVE \ db \ Proddb0635.sql

バックアップファイルProddb0635.sqlは、データベースサーバーとは別のサーバーに保存されます。RAMは12 GBです。INNODBバッファープールのサイズは6 GBです。追加のmem.poolは32 MBです。クエリキャッシュのサイズは2 GBです。ネットバッファーの長さは最大16 Mです。パケットサイズ1 GB。

mysqlのバージョンは5.0.67です。

バックアップが実行されていない場合、ユーザーはパフォーマンスに満足しています。

バックアップの実行中にINNODBバッファープールのヒット率が100%に近い高い値になっています。保留中の読み取りまたは保留中の書き込みはありません。innodb wait freeは0です。CPU使用率は高くありません。最小9%から最大15%mysqlbackupが実行されているかどうかに関係なく、クエリキャッシュヒット率は約40%と低くなっています。現在、Windowsタスクマネージャーは、10 GBのRAMが使用されていることを表示しています。2 GBのRAMしか利用できない状態でクエリキャッシュを増やす必要がありますか?mysqlld-ntは9.2 GBのRAMを使用し、mysqldumpは5 MBのRAMを使用しています。Alos氏は、-compressオプションの有無にかかわらず、ダンプファイルのサイズは同じであることに注意しました。

iNNODBバッファープールのサイズを減らす必要がありますか?

ありがとう

回答:


8

Windowsには既知の問題があり、大きなファイルを別のサーバーにプッシュすると、すべてのメモリがユーザープロセスではなくシステムキャッシュに割り当てられることになります。タスクマネージャーの[物理メモリ(MB)]セクションで、システムキャッシュに割り当てられているメモリの量を確認できます。

これは、ローカルディスクにバックアップしてから、リモートマシンにそのファイルをプルさせることで解決できます。


Mrdenny、ありがとう。SANにディスクが保存されていますが、それでも違いはありますか?
dbachacha '

1
ストレージがどのように提示されても、それは問題です。ストレージはSANストレージであるため、ファイルをネットワーク経由で別のマシンにコピーする必要はありません。MySQLサーバーに新しいLUNを提示し、そのマシンにバックアップします。テープバックアップのためにファイルを別のマシンに移動する必要がある場合は、SANを使用します。LUNをスナップし、スナップショットをバックアップサーバーに提示し、ファイルをバックアップしてから、スナップショットを削除します。翌日繰り返します。これはおそらくすべてスクリプト化できます。
mrdenny 2011

最初の提案:#はシステムキャッシュで変更されていません。LUNについては、システム&ネットワークチームで働く同僚に伝えます。
dbachacha

バックアップスクリプトを他のサーバーで実行するように移動しましたが、かなりの改善があります。さらに、アプリケーションコードが単一の接続を再利用していないが、データベースサーバーへの1つの要求にグループ化された複数の関数で開閉することがわかりました。また、1枚のNICカードがバックアップデータとオンライントランザクションデータで共有されていることもわかりました。そのため、バックアップ専用のNICを用意する予定です。本当にありがとう。
dbachacha

7

状況に応じて、mysqldumpのパフォーマンスを向上させるために私が考えていることがいくつかあります。コマンドは次のとおりです。

mysqldump --skip-opt --quick --single-transaction --create-options --extended-insert --disable-keys --add-drop-table --complete-insert --set-charset --compress- -log-error = Proddb0635.err -u root -pjohndoe Proddb> \ devNas \ devNas \ sqlbackup \ LIVE \ db \ Proddb0635.sql

最初に気付くのは、出力をファイルシステムにリダイレクトしていることです。「devNas」と表示されているので、これはネットワーク接続ストレージであると想定します。私はバックアップ用のNASのファンですが、運用トラフィックと別の物理NICに接続する必要があります。帯域幅を飽和させていなくても、競合します。--quickフラグを使用すると、メモリに保持する代わりにすべての行をフラッシュするため、これはさらに問題になります。

次に目にするのは、-compressを起動したことです。-hスイッチを使用していないため、mysqlをローカルで実行しているようです。これは、このコンテキストでは不要なローカルCPUを使用する場合があります。--compressは必要ですか?mysqldumpクライアントとmysqlサーバー間のデータのみを圧縮し、ファイルの内容は圧縮しません。

次に、-single-transactionフラグを使用していることを確認します。これは、mysqldumpの一部としてすべての選択をテストするため、余分なCPUが発生します。

これはパフォーマンスとは関係ありませんが、MyISAM(手動)でのみ機能する--disable-keysを使用しています。

mysqldumpをオフラインのホストからリモートで実行し、完了後にダンプファイルをNASに移動して、この操作を可能な限り帯域外にしてみてください。


はい、ネットワークおよびシステム管理者に確認しました。ネットワーク接続ストレージです。mysqldumpを別のサーバーに移動してみることができます。また、-compressの使用についても理解できるようになりました。マニュアルによると--compressはクライアントとサーバーで動作しますが、違いがあるかどうかを確認しました。mysqldumpを実行するクライアントとmysqlデータベースサーバーの間で流れるデータの種類。データはmysqlデータベースサーバーとdevNasの間を流れています。MySQlのドキュメントと本のデータベースの設計とチューニングでは、INNODBテーブルの単一トランザクションの使用を優先しています。
dbachacha

バックアップスクリプトを他のサーバーで実行するように移動しましたが、かなりの改善があります。さらに、アプリケーションコードが単一の接続を再利用していないが、データベースサーバーへの1つの要求にグループ化された複数の関数で開閉することがわかりました。また、1枚のNICカードがバックアップデータとオンライントランザクションデータで共有されていることもわかりました。そのため、バックアップ専用のNICを用意する予定です。本当にありがとう。
dbachacha

お役に立ててうれしいです。ご多幸を祈る。
randomx

ここで私は次のシナリオを理解するのに助けが必要です:mysqlデータベースはサーバーAにあります。mysqldumpはサーバーBで実行され、サーバーCにデータをダンプします。サーバーAからサーバーCへの専用NICがあります。これは正しいですか?確信が持てないので、昨夜、mysqldumpはサーバーAで実行されていました。CPUの競合を減らすために、別のサーバーで実行したいと思います。
dbachacha

mysqldumpは「クライアントユーティリティ」であり、データベース上のテーブルにアクセスする権限を持つ任意のホストから実行できます。あなたの戦略は、サーバーAのテーブルをターゲットとするサーバーCのシェルからmysqldumpを実行することです。もちろん、サーバーCからダンプするスキーマへのアクセスを許可する必要があります。
randomx 2011

2

観測#1

InnoDBに対してmysqldumpを実行する際に注意する点があります。

InnoDBバッファープールに存在するダーティページは、最初にディスクにフラッシュする必要があります。mysqldumpは、ダーティページがまだあるInnoDBテーブルのフラッシュをトリガーします。

innodb_max_dirty_pages_pctというサーバーオプションがあります。デフォルト値は75がMySQL 5.5で、5.5より前のバージョンのMySQLでは90です。実稼働環境では、この数をデフォルト値のままにしても問題ありません。

InnoDBバッファープールにダーティページがたくさんあるかどうかを確認するには、次のコマンドを実行します。

SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';

ところでこれから示すようにページは16Kです:

SHOW GLOBAL STATUS LIKE 'Innodb_page_size';

InnoDBとmysqldumpの場合、2つの状況でこの数を減らすことができます。

CIRCUMSTANCE 1:永久に0に設定します

これをmy.iniに追加するだけです。

[mysqld]
innodb_max_dirty_pages_pct=0

これにより、InnoDBバッファープールが無駄のない状態に保たれます。ダンプされているInnoDBテーブルをフラッシュする手順は、mysqldumpが動作する前に、可能な限り少数のダーティページ(おそらく0)をフラッシュする必要があるため、迅速です。

唯一の欠点は、トラフィック量の多いDBからmysqldumpを実行する場合、ダーティページをより頻繁にフラッシュするため、書き込みI / Oがわずかに増加する可能性があります。これを実行することにより、mysqlをrestartnigせずにそうであるかどうかを判断できます。

SET GLOBAL innodb_max_dirty_pages_pct = 0;

設定を12〜24時間のままにします。書き込みパフォーマンスが許容できる場合は、問題ありません。そうでない場合は、次のように設定し直してください。

SET GLOBAL innodb_max_dirty_pages_pct = 90;

CIRCUMSTANCE 2:mysqldumpの約1時間前に0に設定します

SET GLOBAL innodb_max_dirty_pages_pct = 0;

mysqldumpを実行する

SET GLOBAL innodb_max_dirty_pages_pct = 90;

観測#2

あなたは持っている--complete-挿入を mysqldumpをオプションとして。これにより、VALUES句の前のすべてのINSERTステートメントに列名が埋め込まれます。--extended-insertを使用しても、挿入される行のバッチごとに、mysqldumpに送信される列名があります。--complete-insertを削除することで、mysqldumpに送信されるバイト数を減らすことができます。

勧告

スレーブとしてセットアップできる別のWindowsサーバーがある場合は、本番マシンからではなく、そのスレーブからmysqldumpを実行します。


ありがとうございました。「保存」は読むよりも時間がかかるとユーザーが文句を言うのを忘れていました。すぐにあなたの観察番号2を実装します。私は間違いなくあなたがスレーブを持っていること、そしてmysqldumpをスレーブから取得することをお勧めします。
dbachacha

innodb_buffer_pool_dirty_pagesは、バックアップの開始直前には高すぎませんでした。約9〜最大です。196.マスタースレーブも良い推薦です。
dbachacha '18

1
バックアップスクリプトを他のサーバーで実行するように移動しましたが、かなりの改善があります。さらに、アプリケーションコードが単一の接続を再利用していないが、データベースサーバーへの1つの要求にグループ化された複数の関数で開閉することがわかりました。また、1枚のNICカードがバックアップデータとオンライントランザクションデータで共有されていることもわかりました。そのため、バックアップ専用のNICを用意する予定です。本当にありがとう。これでうまくいかない場合は、マスタースレーブも問題ないと思います。
dbachacha
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.