Spec-Zone.ru › MySQL 5.7

16.1.5.2 Настройка реплики с несколькими источниками для репликации на основе GTID

Если источники в топологии репликации с несколькими источниками содержат существующие данные, можно сэкономить время, если настроить реплику с соответствующими данными до начала репликации. В топологии репликации с несколькими источниками копирование каталога данных нельзя использовать для настройки реплики с данными из всех источников, и вы также можете захотеть реплицировать только определенные базы данных из каждого источника. Поэтому лучшей стратегией настройки такой реплики является использование mysqldump для создания соответствующего файла дампов на каждом источнике, а затем использование клиента mysql для импорта файла дампа на реплику.

Если вы используете репликацию на основе GTID, вам необходимо обратить внимание на оператор SET @@GLOBAL.gtid_purged, который mysqldump размещает в выходных данных дампа. Этот оператор передает GTID транзакций, выполненных на источнике, на реплику, и реплике эта информация необходима. Однако для любого случая, более сложного, чем настройка одной новой пустой реплики из одного источника, вам необходимо проверить, какое влияние этот оператор оказывает на версию MySQL на реплике, и соответствующим образом обработать этот оператор. Следующие рекомендации обобщают подходящие действия, но для получения более подробной информации см. документацию mysqldump.

В MySQL 5.6 и 5.7 оператор SET @@GLOBAL.gtid_purged, написанный mysqldump, заменяет значение gtid_purged на реплике. Также в этих версиях это значение можно изменить только тогда, когда запись реплики о транзакциях с GTID (множество gtid_executed) пусто. В топологии репликации с несколькими источниками необходимо удалить оператор SET @@GLOBAL.gtid_purged из выходных данных дампа перед повторной обработкой файлов дампа, потому что вы не можете применить второй или последующий файл дампа, включающий этот оператор. В качестве альтернативы удалению оператора SET @@GLOBAL.gtid_purged, если вы настраиваете реплику с двумя частичными дампами из одного источника, и множество GTID во втором дампе такое же, как в первом (т. е. между дампами на источнике не выполнялись новые транзакции), вы можете установить параметр --set-gtid-purged у mysqldump в значение OFF при выводе второго файла дампа, чтобы исключить этот оператор.

Для MySQL 5.6 и 5.7 эти ограничения означают, что все файлы дампов из источников должны быть применены в одной операции на реплике с пустым множеством gtid_executed. Вы можете очистить историю выполнения GTID реплики, выполнив оператор RESET MASTER на реплике, но если у вас есть другие, желаемые транзакции с GTID на реплике, выберите альтернативный метод настройки из описанных в Разделе 16.1.3.5, «Использование GTID для переключения и масштабирования».

В следующем примере настройки мы предполагаем, что оператор SET @@GLOBAL.gtid_purged необходимо удалить из файлов и обработать вручную. Мы также предполагаем, что на реплике до начала настройки нет желаемых транзакций с GTID.

  1. Чтобы создать файлы дампа для базы данных с именем db1 на source1 и базы данных с именем db2 на source2, выполните mysqldump для source1 следующим образом:

    mysqldump -u<user> -p<password> --single-transaction --triggers --routines --set-gtid-purged=ON --databases db1 > dumpM1.sql 
    

    Затем выполните mysqldump для source2 следующим образом:

    mysqldump -u<user> -p<password> --single-transaction --triggers --routines --set-gtid-purged=ON --databases db2 > dumpM2.sql 
    
  2. Запишите значение gtid_purged, которое mysqldump добавил в каждый из файлов дампа. Например, для файлов дампа, созданных в MySQL 5.6 или 5.7, вы можете извлечь значение так:

    cat dumpM1.sql | grep GTID_PURGED | cut -f2 -d'=' | cut -f2 -d$'\''
    cat dumpM2.sql | grep GTID_PURGED | cut -f2 -d'=' | cut -f2 -d$'\'' 
    

    Результат в каждом случае должен быть множеством GTID, например:

    source1:   2174B383-5441-11E8-B90A-C80AA9429562:1-1029
    source2:   224DA167-0C0C-11E8-8442-00059A3C7B00:1-2695
    
  3. Удалите строку из каждого файла дампа, содержащую оператор SET @@GLOBAL.gtid_purged. Например:

    sed '/GTID_PURGED/d' dumpM1.sql > dumpM1_nopurge.sql
    sed '/GTID_PURGED/d' dumpM2.sql > dumpM2_nopurge.sql 
    
  4. Используйте клиент mysql, чтобы импортировать каждый отредактированный файл дампа в реплику. Например:

    mysql -u<user> -p<password> < dumpM1_nopurge.sql
    mysql -u<user> -p<password> < dumpM2_nopurge.sql 
    
  5. На реплике выполните оператор RESET MASTER для очистки истории выполнения GTID (предполагая, как указано выше, что все файлы дампа были импортированы и что на реплике нет желаемых транзакций с GTID). Затем выполните оператор SET @@GLOBAL.gtid_purged, чтобы установить значение gtid_purged в объединение всех множеств GTID из всех файлов дампа, как вы записали в шаге 2. Например:

    mysql> RESET MASTER;
    mysql> SET @@GLOBAL.gtid_purged = "2174B383-5441-11E8-B90A-C80AA9429562:1-1029, 224DA167-0C0C-11E8-8442-00059A3C7B00:1-2695";
    

    Если между множествами GTID в файлах дампа есть или могут быть пересекающиеся транзакции, вы можете использовать описанные в Разделе 16.1.3.7, «Примеры хранимых функций для работы с GTID» хранимые функции, чтобы проверить это предварительно и вычислить объединение всех множеств GTID.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/replication-multi-source-provision-replica.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API