Подтвердить что ты не робот

Статус репликации mysql с использованием запроса выбора

Можно ли получить статус репликации из любой таблицы системных баз данных. с помощью которого я могу определить, вверх или вниз репликация.

Мне нужно знать, являются ли SLAVE_IO_RUNNING и SLAVE_SQL_RUNNING = YES из системной таблицы?

Манаси

4b9b3361

Ответ 1

Это утверждение, которое я использовал на основе ответа Манаси.

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

Ответ 2

hslakhan answer работает для 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.

Ответ 3

Я получил решение в базе данных information_schema. Пожалуйста, проверьте таблицу GLOBAL_STATUS в базе данных information_schema. Вы увидите переменную "SLAVE_RUNNING", если она "ON", что означает, что репликация работает нормально. Если это "ВЫКЛ", репликация не удалась по какой-либо причине, и вам нужно проверить, почему?: -)

Манаси

Ответ 4

Основной оператор для этого - SHOW SLAVE STATUS, который вы должны выполнить на каждом подчиненном устройстве. См. http://dev.mysql.com/doc/refman/5.1/en/replication-administration-status.html

На главном устройстве вы можете проверить состояние подключенных подчиненных устройств, используя SHOW PROCESSLIST, чтобы просмотреть список запущенных процессов. Для ведомых устройств, которые были запущены с опцией --report-host и подключены к ведущему, инструкция SHOW SLAVE HOSTS на главном экране показывает основную информацию о ведомых устройствах.

Ответ 5

Начиная с 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.

Похоже, вы пытаетесь контролировать состояние потока автоматическим способом. Поскольку у меня нет таблиц, я планирую сделать это с помощью оболочки script и задания 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/

Ответ 6

Это решение использует awk для обработки выходных данных команды show и отправляет почту в случае ошибок в любом из обработанных полей. В этом случае поля являются Slave_IO_Running и Slave_SQL_Running. Заполните бесплатно добавить другие поля из "шоу рабского состояния" выход - LAST_ERROR/Seconds_Behind_Master, например, или AWK вывод других шоу команд.

#!/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  

Ответ 7

На основании этого вопроса я написал запрос, чтобы ответить вам. Пожалуйста, сохраняйте авторские права :-)

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

С наилучшими пожеланиями, Ренан Бенедикто Перейра (BR MySQL DBA)

Ответ 8

Вы можете выполнить 'SHOW SLAVE STATUS; запрос на каждом подчиненном сервере и выборку результата. Вы также можете написать script, который будет выполнять запрос через регулярные промежутки времени.

Иначе вы можете использовать такие инструменты, как Monyog, как я, у которых есть советники, которые будут контролировать серверы репликации и предоставлять результаты в пределах установленных интервалов времени. Он также имеет страницу репликации, которая дает больше информации для серверов в настройке репликации и предоставляет функцию оповещения, если ведомое устройство не работает.

Ответ 9

Я не совсем уверен, что это за суета. "Показать статус ведомого" - это запрос. Вы можете выполнить этот запрос на любом современном языке программирования, а затем просто выбрать имена столбцов, которые хотите использовать, верно?

В PHP, например, я использую:

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

После получения результатов от 'show slave status' в строке $.

Ответ 10

Вы также можете запустить это в мастер.

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