MySQL репликация SHOW SLAVE STATUS

andrey.vadimovich
Дата: 27.01.2013 18:23:32
Есть проблема.
Программа работает с репликой и для того чтобы быть уверенным в актуальности данных реплики использую такой код проверки

Delphi:
            {$REGION 'Master'}
            DataModule2.ADOQueryREPLICATION.Connection := DataModule2.ADOConnectionINTERNET;

            DataModule2.ADOQueryREPLICATION.Active := False;
            DataModule2.ADOQueryREPLICATION.SQL.Clear;
            DataModule2.ADOQueryREPLICATION.SQL.Add('SHOW MASTER STATUS');
            DataModule2.ADOQueryREPLICATION.Active := True;
            {$ENDREGION}

            log_position := DataModule2.ADOQueryREPLICATION.FieldByName('Position').AsInteger;
            log_file := DataModule2.ADOQueryREPLICATION.FieldByName('File').AsString;

            N_MASTER_POS.Caption := 'Master done.';

            {$REGION 'Slave'}
            DataModule2.ADOQueryREPLICATION.Connection := DataModule2.ADOConnection1;

            DataModule2.ADOQueryREPLICATION.Active := False;
            DataModule2.ADOQueryREPLICATION.SQL.Clear;
            DataModule2.ADOQueryREPLICATION.SQL.Add('SHOW SLAVE STATUS');
            DataModule2.ADOQueryREPLICATION.Active := True;
            {$ENDREGION}

            N_MASTER_POS.Caption := 'Slave done.';

              if (DataModule2.ADOQueryREPLICATION.FieldByName('Read_Master_Log_Pos').AsInteger <> DataModule2.ADOQueryREPLICATION.FieldByName('Exec_Master_Log_Pos').AsInteger)
                or (DataModule2.ADOQueryREPLICATION.FieldByName('Read_Master_Log_Pos').AsInteger <> log_position)
                or (DataModule2.ADOQueryREPLICATION.FieldByName('Master_Log_File').AsString <> log_file)
              then
              begin
                Application.MessageBox(PChar('Проблемы репликации.' + #13#10#13#10 + 'Read_Master_Log_Pos: ' + DataModule2.ADOQueryREPLICATION.FieldByName('Read_Master_Log_Pos').AsString + #13#10 + 'Exec_Master_Log_Pos: ' + DataModule2.ADOQueryREPLICATION.FieldByName('Exec_Master_Log_Pos').AsString + #13#10 + 'Position: ' + IntToStr(log_position) + #13#10 + 'File: ' + log_file), PChar(Caption), MB_OK + MB_ICONWARNING);
                Close;
                Exit;
              end;


Но вот проверка мастера проходит без сучка и задоринки,
а с слейвом беда.

Вот что собственно происходит:
При DataModule2.ADOQueryREPLICATION.Active := True; на слейве выдает ошибку
Project ХХХ.exe raised exception class EOleException with message 'Поставщик данных или другая служба вернули состояние E_FAIL'.


Если выполнить SHOW SLAVE STATUS в СКЛ-клиенте, то он возвратит вот такую запись:
Slave_IO_StateMaster_HostMaster_UserMaster_PortConnect_RetryMaster_Log_FileRead_Master_Log_PosRelay_Log_FileRelay_Log_PosRelay_Master_Log_FileSlave_IO_RunningSlave_SQL_RunningReplicate_Do_DBReplicate_Ignore_DBReplicate_Do_TableReplicate_Ignore_TableReplicate_Wild_Do_TableReplicate_Wild_Ignore_TableLast_ErrnoLast_ErrorSkip_CounterExec_Master_Log_PosRelay_Log_SpaceUntil_ConditionUntil_Log_FileUntil_Log_PosMaster_SSL_AllowedMaster_SSL_CA_FileMaster_SSL_CA_PathMaster_SSL_CertMaster_SSL_CipherMaster_SSL_KeySeconds_Behind_MasterMaster_SSL_Verify_Server_CertLast_IO_ErrnoLast_IO_ErrorLast_SQL_ErrnoLast_SQL_ErrorReplicate_Ignore_Server_IdsMaster_Server_Id
mysqlserver.zapto.orgrepl330660mysql-bin.000011415444LENOVO-relay-bin.037982253mysql-bin.000011NoYesdb00415444556None0NoNULLNo1593The slave I/O thread stops because SET @master_heartbeat_period on master failed. Error: Lost connection to MySQL server during query01


Здесь нас интересует вот что:
Slave_IO_Running = No
И собственно причина, почему No:
Last_IO_Error = The slave I/O thread stops because SET @master_heartbeat_period on master failed. Error: Lost connection to MySQL server during query.

Хотелось бы услышать мнения, что я делаю не так.

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

Спасибо, что хоть дочитали :)
netwind
Дата: 27.01.2013 18:59:08
andrey.vadimovich

Здесь нас интересует вот что:
Slave_IO_Running = No

Ну так она утонула остановилась.


andrey.vadimovich
И собственно причина, почему No:
Last_IO_Error = The slave I/O thread stops because SET @master_heartbeat_period on master failed. Error: Lost connection to MySQL server during query.

Хотелось бы услышать мнения, что я делаю не так.

Ну почему вы сразу решили, что репликация ломается ваших запросов ?

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

Спасибо, что хоть дочитали :)

исходя из документации достаточно start slave.
Но раз уже она остановилась, причин может быть так много, что лучше не перезапускать, а разобраться почему остановилась.
Мне кажется, вы реплицируете на 5.5 из более старой версии и возможна эта штука - master_heartbeat_period там в старой версии вообще не работает.
andrey.vadimovich
Дата: 27.01.2013 19:11:36
Ломается репликация явно не от моих запросов, это и так понятно, не понятно почему при вызове такого запроса из Дельфи возникает ошибка, если обычный клиент просто выдает данный результат. ПОЧЕМУ ОШИБКА?

Останавливается репликация от того что сервер может выключили с розетки либо инет пропал (это обычный компьютер, сконфигурированный как сервер с открытыми портами)

Слейв старт, а репликация не собьется??
netwind
Дата: 27.01.2013 19:54:20
andrey.vadimovich
Ломается репликация явно не от моих запросов, это и так понятно, не понятно почему при вызове такого запроса из Дельфи возникает ошибка, если обычный клиент просто выдает данный результат. ПОЧЕМУ ОШИБКА?

как я понимаю, это просто совпадение. просто ваш клиент делает особенные проверки, а обычный нет.

Останавливается репликация от того что сервер может выключили с розетки либо инет пропал (это обычный компьютер, сконфигурированный как сервер с открытыми портами)

Слейв старт, а репликация не собьется??

зависит от причины падения. при включении все само должно подниматься.
andrey.vadimovich
Дата: 27.01.2013 20:29:29
netwind
просто ваш клиент делает особенные проверки, а обычный нет.

да какие особые проверки, обычные компоненты АДО.
netwind
Дата: 27.01.2013 21:32:46
andrey.vadimovich, читать SHOW SLAVE STATUS - это необычно.
andrey.vadimovich
Дата: 28.01.2013 02:30:43
netwind,

а в чем выражается необычность?
результатом должен выступать набор данных, но в НЕКОТОРЫХ случаях он не возвращается, почему??
netwind
Дата: 28.01.2013 11:54:22
andrey.vadimovich, а, так вы еще и из дельфи что-то наворотили.
тут уж ничего не знаю. воспользуйтесь волшебной силой отладки.
andrey.vadimovich
Дата: 28.01.2013 13:44:14
netwind,
в том то и дело, что отладка выдает ошибку в
DataModule2.ADOQueryREPLICATION.Active := True;

т.е. проблемы именно с запросом, вернее с ответом из базы данных.
Но еще раз повторюсь, иногда запрос проходит и в результате я имею вышеописанную таблицу и все ок.
Но с чем все это связано???
netwind
Дата: 28.01.2013 13:55:48
andrey.vadimovich
т.е. проблемы именно с запросом, вернее с ответом из базы данных.
Но еще раз повторюсь, иногда запрос проходит и в результате я имею вышеописанную таблицу и все ок.
Но с чем все это связано???

ну так найдите с каким именно запросом и ответом. Вычлените проблему, удалите лишнее и все станет прозрачно.