Назад | Перейти на главную страницу

Ведомый MySQL не синхронизирован с ведущим

Наш подчиненный сервер, который используется только для резервного копирования, не синхронизирован. Он разбился о ключевой ограничитель.

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

Передо мной стоит «высокопроизводительный MySQL», и он указывает мне в сторону maatkit, в частности mk-table-sync.

На всю жизнь я не могу заставить mk-table-sync работать.

Запускаю вот так на рабе:

root@machine:~# mk-table-sync --sync-to-master --dry-run 127.0.0.1
# Syncing h=127.0.0.1
# DELETE REPLACE INSERT UPDATE ALGORITHM EXIT DATABASE.TABLE
#      0       0      0      0 Chunk     0    database.case_study_product
#      0       0      0      0 Chunk     0    database.case_study_region
#      0       0      0      0 Chunk     0    database.case_study_sector
#      0       0      0      0 Chunk     0    database.contact
#      0       0      0      0 Chunk     0    database.contact_issue
#      0       0      0      0 Chunk     0    database.feedback
#      0       0      0      0 Chunk     0    database.feedback_rating
#      0       0      0      0 Chunk     0    database.feedback_usefulness
#      0       0      0      0 Chunk     0    database.help
#      0       0      0      0 Chunk     0    database.help_issue
#      0       0      0      0 Chunk     0    database.search_weight
#      0       0      0      0 Chunk     0    database.contented_content
#      0       0      0      0 Nibble    0    database.contented_content_index
#      0       0      0      0 Chunk     0    database.contented_content_log

Я точно знаю, что contented_content и contented_content_index не синхронизированы. Но из того, что я могу сказать по форме, выходной мааткит думает, что все в порядке.

Вот вывод статуса ведомого:

mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: 10.0.40.12
                Master_User: rep1
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.000023
        Read_Master_Log_Pos: 25832973
             Relay_Log_File: mysql-relay-bin.000002
              Relay_Log_Pos: 19098703
      Relay_Master_Log_File: mysql-bin.000001
           Slave_IO_Running: Yes
          Slave_SQL_Running: No
            Replicate_Do_DB: 
        Replicate_Ignore_DB: 
         Replicate_Do_Table: 
     Replicate_Ignore_Table: 
    Replicate_Wild_Do_Table: 
Replicate_Wild_Ignore_Table: 
                 Last_Errno: 1452

Любая помощь, указатели ... запросить дополнительную информацию ... и т. Д.

Сразу после того, как я много почесал голову и поигрался в моей виртуальной среде, вот как мне удалось синхронизировать мое ведомое устройство с мастером.

1) В базе (mydb) на мастер Я хочу создать следующую таблицу:

CREATE TABLE checksum (
     db         char(64)     NOT NULL,
     tbl        char(64)     NOT NULL,
     chunk      int          NOT NULL,
     boundaries char(100)    NOT NULL,
     this_crc   char(40)     NOT NULL,
     this_cnt   int          NOT NULL,
     master_crc char(40)         NULL,
     master_cnt int              NULL,
     ts         timestamp    NOT NULL,
     PRIMARY KEY (db, tbl, chunk)
);

2) На мастер выполните следующую команду:

mk-table-checksum -d mydb --replicate mydb.checksum 127.0.0.1

3) На раб выполните следующую команду:

mk-table-sync -d mydb --replicate mydb.checksum  --sync-to-master --no-foreign-key-checks --execute 127.0.0.1

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

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

Данные ведомого устройства будут другими после того, как он закончит догонять. Запустите mk-table-checkum --replicate сначала на ведущем устройстве, затем на ведомом устройстве, запустите mk-table-sync --replicate (есть пример в документации).

Я не понимаю, что вы поняли о состоянии вашего ведомого устройства из вывода --dry-run, но --dry-run НЕ сравнивает никакие данные. Он просто сообщает вам, какие таблицы он будет исследовать и с каким алгоритмом синхронизации.

Может поможет, если на ведомый сервер поставить:

mysql> STOP SLAVE;
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
mysql> START SLAVE;

Я думаю, что нужна более четкая информация о том, что делает --dry-run, поэтому я создал запрос функции: http://code.google.com/p/maatkit/issues/detail?id=691

Я приветствую ваши комментарии там и в списке рассылки Maatkit!

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

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

Я должен отметить, что это написано на PHP, и подчиненное устройство / главное устройство находятся в той же сети с NFS, размещенной на главном диске @ / home / sharefiles /

Я уверен, что некоторые люди могут ворчать по поводу того, как это делается, но он вполне удовлетворяет мои потребности и запускается всего за пару секунд.

/ * Этот сценарий запускается еженедельно, чтобы остановить репликацию, удалить базы данных, скопировать их с главного устройства на подчиненное * /

/ * И снова начинается репликация. Не трогайте этот скрипт !! * /

// Остановить подчиненное устройство на подчиненном

$ slave = mysql_connect («подчиненный», «пользователь», «pw»);

mysql_query («ОСТАНОВИТЬ ПОДЧИНЕННЫЙ», $ slave);

// Сбросить позицию

mysql_query («СБРОСИТЬ ПОДЧИНЕННЫЙ», $ slave);

// Получаем основную информацию, позицию и т. Д.

$ master = mysql_connect («локальный хост», «пользователь», «pw»);

$ masterinfo = mysql_fetch_assoc (mysql_query ("ПОКАЗАТЬ СТАТУС МАСТЕРА", $ master)); // $ masterinfo [Файл], $ masterinfo [Позиция]

// БД для репликации

$ dbArray = array («db1», «db2», «db3», «db4»);

// Выгрузить каждую базу данных и скопировать на подчиненное устройство

foreach ($ dbArray as $ db) {

    system("mysqldump $db > /home/sharefiles/$db.sql");

    system("mysql -h slaveaddress -u root --password=pw --database=$db < /home/sharefiles/$db.sql");

}

mysql_query ("ИЗМЕНИТЬ МАСТЕРА НА MASTER_HOST = 'master', MASTER_USER = 'replication', MASTER_PASSWORD = 'replicationuserpassword', MASTER_LOG_FILE = '$ masterinfo [File]', MASTER_LOG_POS = $ masterinfo [Position]», $ slave);

mysql_query («НАЧАТЬ ПОДЧИНЕННЫЙ», $ slave);