Есть проблема.
Программа работает с репликой и для того чтобы быть уверенным в актуальности данных реплики использую такой код проверки
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_State | Master_Host | Master_User | Master_Port | Connect_Retry | Master_Log_File | Read_Master_Log_Pos | Relay_Log_File | Relay_Log_Pos | Relay_Master_Log_File | Slave_IO_Running | Slave_SQL_Running | Replicate_Do_DB | Replicate_Ignore_DB | Replicate_Do_Table | Replicate_Ignore_Table | Replicate_Wild_Do_Table | Replicate_Wild_Ignore_Table | Last_Errno | Last_Error | Skip_Counter | Exec_Master_Log_Pos | Relay_Log_Space | Until_Condition | Until_Log_File | Until_Log_Pos | Master_SSL_Allowed | Master_SSL_CA_File | Master_SSL_CA_Path | Master_SSL_Cert | Master_SSL_Cipher | Master_SSL_Key | Seconds_Behind_Master | Master_SSL_Verify_Server_Cert | Last_IO_Errno | Last_IO_Error | Last_SQL_Errno | Last_SQL_Error | Replicate_Ignore_Server_Ids | Master_Server_Id | | mysqlserver.zapto.org | repl | 3306 | 60 | mysql-bin.000011 | 415444 | LENOVO-relay-bin.037982 | 253 | mysql-bin.000011 | No | Yes | db | | | | | | 0 | | 0 | 415444 | 556 | None | | 0 | No | | | | | | NULL | No | 1593 | The slave I/O thread stops because SET @master_heartbeat_period on master failed. Error: Lost connection to MySQL server during query | 0 | | | 1 |
|
Здесь нас интересует вот что:
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.
Хотелось бы услышать мнения, что я делаю не так.
И еще, как мне перезапустить репликацию программным путем, без перезагрузки сервера и без потери позиции.
А то каждый раз когда репликация сбилась не охота вручную перезагружать сервер-реплику.
Спасибо, что хоть дочитали :)