web-dev-qa-db-ja.com

実行中のmysqldumpを検出する方法は?

変更できないものは次のとおりです。マスターといくつかのスレーブを実行するmySQL myISAMレプリケーションを取得しました。 1つのスレーブがmysqldumpを使用した夜間のバックアップに使用されています。バックアップは、重いロックを使用しており、マスターと比較してスレーブを「エージング」させています。 mysqldumpはrootとして接続し、すべてのデータベースをダンプしていますが、他のすべての接続はデータベースごとに1人の非SUPERユーザーを使用しています。ダンプは、専用のバックアップサーバーで単純なシェルスクリプトを使用して開始されます。

ここに問題があります:バックアップされているサーバーで実行されているデータベースの1つに「通常の」ユーザーとして接続されているときに、バックアップが実行されているかどうかを検出したいと思います。 Cronjobsは、早期に終了するか、バックアップが完了するまで待つことができない本当に重要な必要なジョブのみを処理することにより、実行中のバックアップに対応できる必要があります。バックアップスクリプトを実行しているサーバーはWebサーバーに接続していません。共通のポイントはmysqlサーバーのみです。バックアップスクリプトは、サーバーに「現在バックアップを実行中」としてフラグを立てるためにいくつかのことを行うことができます。バックアップを実行している1つのスレーブのみを無視するように、「すべてのユーザーが参照できるグローバルサーバー側環境変数」の種類を設定したいのですが、そのデータベースまたはレプリケーションチェーンでバックアップが実行されていることを単に認識してもかまいません。 。バックアップ中にデータベースがロックされているため、データベースを使用することはできません。

バックアップの開始時に一時テーブルを作成しようとしましたが(既存=バックアップが実行されており、既存ではない=バックアップは実行されていません)、一時テーブルは(予想どおり)最初に作成した接続に対してのみ表示されます。 SUPER以外のユーザーが他のユーザーとルートを含むすべての接続(バックアップサーバーからの接続=バックアップが実行中)のSHOW PROCESSLISTを表示する権限を取得できるかどうかを確認しましたが、うまくいきませんでした。すべてのデータベースユーザーにSUPERを付与することはできません。

助言がありますか?

読んで(そして答えて)くれてありがとう。

2
Sebastian

このシナリオでの唯一の希望は、PROCESS特権を持つことです。

SUPER特権を使用すると、プロセスを強制終了できます。当然、あなたはそれを望まない。一方、PROCESS権限では、プロセスリストを表示できます。

PROCESS権限に関するMySQLドキュメント によると

PROCESS特権は、サーバー内で実行されているスレッドに関する情報(つまり、セッションによって実行されているステートメントに関する情報)の表示に関係します。この権限により、SHOW PROCESSLISTまたはmysqladmin processlistを使用して、他のアカウントに属するスレッドを確認できます。あなたはいつもあなた自身のスレッドを見ることができます。

OK、ビッグディール。プロセス特権では、プロセスリストを表示できます。それはどのように役立ちますか?

SHOW PROCESSLIST;を実行すると、進行中のmysqldumpをすばやく検出し、[情報]フィールドに次のようなパターンを表示できます。

SELECT /*!40001 SQL_NO_CACHE */ * FROM

プロセス特権があり、MySQL 5.1+を実行している場合は、次のクエリを実行できます。

select COUNT(1) mysqldumpThreads
from information_schema.processlist
where info like 'SELECT /*!40001 SQL_NO_CACHE */%';

次に出力例を示します。

mysql> select COUNT(1) mysqldumpThreads
    -> from information_schema.processlist
    -> where info like 'SELECT /*!40001 SQL_NO_CACHE */%';
+------------------+
| mysqldumpThreads |
+------------------+
|                1 |
+------------------+
1 row in set (0.00 sec)

あなたがする必要があるのはその数のためのクエリです。ゼロ以外を取得した場合、mysqldumpが実行されている必要があります。

試してみる !!!

5
RolandoMySQLDBA

バックアップを開始する前に、バックアップスクリプトで別のテーブルに値を設定し、終了時にリセットしてください。その後、この値を照会するだけです。

0
Mchl

LVMスナップショットを使用してmyisamテーブルをバックアップし、レプリケーションのダウンタイムを数分に最小限に抑えることをお勧めします。

http://www.mysqlperformanceblog.com/2006/08/21/using-lvm-for-mysql-backup-and-replication-setup/

Innodbに移行できる場合は、 xtrabackup を使用して、目立った干渉がほとんどない状態でライブバックアップを実行できます。

編集

個人的には、3つのデータベースにまたがる約220 GBのインスタンスにLVMスナップショットを使用していました。 LVMスナップショットとディスクへの負荷のオーバーヘッドにより、レプリケーションが毎晩8,000秒も遅れました。ロックはありませんでしたが、貧弱な小さなディスクは、レプリケーションの負荷とバックアップに対応できませんでした。 Fusion ioに切り替える必要がありました。これは確かにいいことですが、非常にコストがかかります。

0
atxdba