web-dev-qa-db-ja.com

選択クエリを使用したmysqlレプリケーションステータス

任意のシステムデータベーステーブルからレプリケーションステータスを取得することは可能ですか。これを使用して、レプリケーションがアップかダウンかを識別できます。

システムテーブルからSLAVE_IO_RUNNINGおよびSLAVE_SQL_RUNNING = YESかどうかを知る必要がありますか?

マナシ

14
MySQL DBA

これは、マナシのトップアンサーに基づいて私が使用したステートメントです。

SELECT variable_value 
FROM information_schema.global_status 
WHERE variable_name='SLAVE_RUNNING';
12
hslakhan

hslakhanの回答 MySQL 5.6で機能しますが、MySQL 5.7では、スレーブステータス変数がinformation_schemaからperformance_schemaに移動しました。

Slave_IO_Runningは以下に対応します:

SELECT SERVICE_STATE FROM performance_schema.replication_connection_status;

Slave_SQL_Runningは以下に対応します:

SELECT SERVICE_STATE FROM performance_schema.replication_applier_status;

SHOW SLAVE STATUS出力からの他の変数もいくつかあります。残りについては、 https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_show_compatibility_56_slave_status を参照してください。

6
Paul Tobias

Information_schemaデータベースで解決策を入手しました。 information_schemaデータベースのテーブルGLOBAL_STATUSを確認してください。変数「SLAVE_RUNNING」が「ON」の場合、レプリケーションが正常に機能していることを意味します。 「オフ」の場合、何らかの理由でレプリケーションが失敗しているため、理由を確認する必要がありますか? :-)

マナシ

4
MySQL DBA

このための主要なステートメントはSHOWSLAVE STATUSであり、これは各スレーブで実行する必要があります。参照: http://dev.mysql.com/doc/refman/5.1/en/replication-administration-status.html

マスターでは、SHOW PROCESSLISTを使用して接続されたスレーブのステータスを確認し、実行中のプロセスのリストを調べることができます。 --report-Hostオプションで開始され、マスターに接続されているスレーブの場合、マスターのSHOW SLAVE HOSTSステートメントは、スレーブに関する基本情報を示します。

2
Ashwin A

このソリューションは、awkを使用してshowコマンドの出力を処理し、処理されたフィールドのいずれかにエラーが発生した場合にメールを送信します。この場合、フィールドはSlave_IO_RunningおよびSlave_SQL_Runningです。 'show slave status'出力から他のフィールドを自由に入力してください-Last_Error/Seconds_Behind_Masterたとえば、またはawk出力他のshowコマンドの。

#!/bin/bash  
# get some slave stats  
Slave_IO_Running=`mysql -u root --password="pwd" -Bse "show slave status\G" | grep Slave_IO_Running | awk '{ print $2 }'`  
Slave_SQL_Running=`mysql -u root --password="pwd" -Bse "show slave status\G" | grep Slave_SQL_Running | awk '{ print $2 }'`  
Last_error=`mysql -u root --password="pwd" -Bse "show slave status\G" | grep Last_error | awk -F : '{ print $2 }'`  

if [ $Slave_SQL_Running == 'No' ] || [ $Slave_IO_Running == 'No' ];  
then  
    echo "Last Error:" $Last_error | mail -s "Replication error on slavedb!!!" [email protected]  
fi  

exit 0  
2
ninjabber

MySQL 5.6以降では、サーバーを--master-info-repository=TABLEおよび--relay-log-info-repository=TABLEで起動することにより、スレーブステータスをファイルではなくテーブルに保存できます。

参照: http://dev.mysql.com/doc/refman/5.6/en/slave-logs.html

それでも、テーブルに探している特定の値(SLAVE_IO_RUNNINGおよびSLAVE_SQL_RUNNING)が含まれるかどうかはわかりません。 mysql 5.1を実行しているため、これを試すことができませんでした。私はちょうど検索していて、5.6のドキュメントでそれを見つけました。

自動化された方法でスレッドのステータスを監視しようとしているようです。テーブルがないので、シェルスクリプトとcronジョブを使用して、次のように実行する予定です。

$ mysql -u root -pXXXX -e "SHOW SLAVE STATUS\G" | grep Slave_IO_Running | awk '{ print $2 }'
$ mysql -u root -pXXXX -e "SHOW SLAVE STATUS\G" | grep Slave_SQL_Running | awk '{ print $2 }'

参照: http://www.stardothosting.com/blog/2012/02/checking-and-repairing-mysql-replication-automatically/

2
Bad Tea

この質問に基づいて、私はあなたに答えるための質問を書きました。著作権を維持してください:-)

SELECT 
    channel_name AS Channel_Name,
    smi.Host AS Master_Host,
    smi.user_name AS Master_User,
    smi.port AS Master_Port,
    smi.master_log_name AS Master_Log_File,
    smi.master_log_pos AS Read_Master_Log_Pos,
    ssi.master_log_pos AS Exec_Master_Log_Pos,
    rcs.service_state AS Slave_IO_Running,
    rss.service_state AS Slave_SQL_Running,
    t.processlist_time AS Seconds_Behind_Master,
    rcs.last_error_number AS Last_IO_Errno,
    rcs.last_error_message AS Last_IO_Error,
    rss.last_error_number AS Last_SQL_Errno,
    rss.last_error_message AS Last_SQL_Error,
    tc.processlist_state AS  Slave_IO_State,
    t.processlist_state AS  Slave_SQL_Running_State

FROM
    mysql.slave_master_info smi 
        JOIN
    mysql.slave_relay_log_info ssi USING (channel_name)   
        JOIN 
    performance_schema.replication_connection_status rcs USING (channel_name)
        LEFT JOIN
    performance_schema.replication_applier_status_by_worker rss USING (channel_name)
        LEFT JOIN
    performance_schema.threads t ON (rss.thread_id = t.thread_id)
        LEFT JOIN
    performance_schema.threads tc ON (rcs.thread_id = tc.thread_id)
\G

よろしくお願いいたします。RenanBenedictoPereira(BR MySQL DBA)

これをマスターで実行することもできます。

SELECT * FROM information_schema.PROCESSLIST AS p WHERE p.COMMAND = 'Binlog Dump';
0
harshil9968

私は大騒ぎがtbhについて何であるか本当にわかりません。 'show slave status' ISクエリ。最新のプログラミング言語からそのクエリを実行してから、使用する列名を選択するだけです。

PHPたとえば、私は次を使用します:

    $row = $stmt->fetch();
    print "Slave_IO_Running: " . $row['Slave_IO_Running'] . "\n";

$ rowの「showslavestatus」から結果を取得した後。

0
Fred