Ошибка импорта данных MySQL с ошибкой 1839
У меня есть настройка главного ведомого MySQL с настроенным GTID. Я забрал резервную копию данных мастера и импортировал ее на отдельный тестовый сервер. Не удается импортировать как
ОШИБКА 1839 (HY000) в строке 24: @@GLOBAL.GTID_PURGED может быть установлена только в том случае, если @@GLOBAL.GTID_MODE = ON. Я попытался с --set-gtid-purged=OFF и AUTO, но безуспешно.
1 ответ
Если вы запускаете
SHOW MASTER STATUS\G
вы увидите что-то вроде этого:
mysql> show master status\G
*************************** 1. row ***************************
File: mysql-bin.000299
Position: 780437462
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set: 075d81d6-8d7f-11e3-9d88-b4b52f517ce4:1-616637650,
e907792a-8417-11e3-a037-b4b52f51dbf8:1-25385296642
1 row in set (0.00 sec)
Поскольку при включенном GTID все серверы получили свой UUID, и есть транзакции. Я полагаю, вы создали дамп с помощью mysqldump, и если вы посмотрите на начало этого файла, вы найдете нечто похожее на это:
--
-- GTID state at the beginning of the backup
--
SET @@GLOBAL.GTID_PURGED='075d81d6-8d7f-11e3-9d88-b4b52f517ce4:1-616648986,
e907792a-8417-11e3-a037-b4b52f51dbf8:1-25385296642';
Это команда, которая не может быть выполнена.
У вас есть следующие варианты:
Удалите эту команду из файла дампа mysql. Просто удалите это. Все вставки появятся на ведомом устройстве, так как это локальные транзакции
Если вы хотите предотвратить это, вы также можете сбросить мастер на подчиненном
mysql> RESET MASTER;
Эта команда очистит переменную "Executed_Gtid_Set" на ведомом устройстве, поэтому вы можете импортировать файл дампа напрямую, а ранее упомянутая переменная set_global_gtid_purged выполняет действие
Когда вы создаете mysqldump, вы можете пропустить часть настройки GTID, добавив
--set-GTID-продувают = OFF
параметр для mysqldump.
НОТА:
если подмножество GTID отличается на master между master и slave (если вы хотите использовать это в настройке репликации), то репликация не будет работать, я бы рекомендовал двоичный дамп и восстановление, так как GTID подчиненного устройства точно соответствует master.
С GTID появляется много новых проблем, но ваша настройка реплики будет более последовательной. С этим стоит работать.
Если вы похожи на меня и не хотите перезапускать свой дамп, потому что это была очень долгая операция, вы можете просто удалить эти строки по факту.
find . -name '*.sql' -type f -exec perl -0 -i.bak -pe 's/SET \@\@GLOBAL\.GTID_PURGED=\x27.*?\x27;//gs' {} +
Запустите это в папке с вашими файлами.sql. Это сохранит старую версию как.bak.
Это сработало для меня.
У меня огромная база данных, поэтому, как и у @Goddard, у меня есть резервная копия / дамп, разбросанный по нескольким файлам. У меня мало места на диске, поэтому я экспортирую дамп в сжатом формате (т.е.
.sql.gz
). Решение @ Goddard мне нравится, но, поскольку у меня мало места на диске, я не могу позволить себе извлечь эти файлы в.sql, а затем применить изменения. Вместо этого я выполню следующую адаптацию ответа @Goddard для импорта
.sql.gz
файлы, удаляя запрос GTID по ходу дела.
find "$DIR" -name "*.sql.gz" | while read table
do
echo "$table"
zcat "$table" | perl -pe 's/SET \@\@GLOBAL\.GTID_PURGED=\x27.*?\x27;//gs' | \
mysql -h "$HOST" -u "$USER" -p"$PASS" -P "$PORT" "$DB"
done