Дублирующиеся ошибки первичного ключа при применении binlog после восстановления mydumper/myloader [перенесено]MySql

Форум по Mysql
Ответить
Anonymous
 Дублирующиеся ошибки первичного ключа при применении binlog после восстановления mydumper/myloader [перенесено]

Сообщение Anonymous »

Я реализую рабочий процесс полного + инкрементального восстановления с использованием mydumper / myloader и двоичных журналов MySQL.

Шаг резервного копирования
Я создаю резервную копию, согласованную со снимками, с помощью mydumper:

Код: Выделить всё

mydumper \
-u Admin \
-h 127.0.0.1 \
-a \
--database=db1 \
--threads=4 \
--trx-tables \
--events \
--routines \
--triggers \
--compress \
--outputdir=/backup/17122025 \
--verbose=3
После завершения дампа я считываю координаты binlog из сгенерированного файла метаданных:

Код: Выделить всё

BINLOG_FILE=$(awk -F= '/SOURCE_LOG_FILE/ {gsub(/[ "#]/,"",$2); print $2}' metadata)
BINLOG_POS=$(awk -F= '/SOURCE_LOG_POS/  {gsub(/[ #]/,"",$2); print $2}' metadata)
Пример из метаданных:

Код: Выделить всё

SOURCE_LOG_FILE = "binlog.000524"
SOURCE_LOG_POS  = 337111
Шаг восстановления
Я восстанавливаю полную резервную копию в новую базу данных с помощью myloader:

Код: Выделить всё

myloader \
-u Admin \
-h 127.0.0.1 \
-a \
--directory=/backup/17122025 \
--database=db1_restore \
--threads=4 \
--overwrite-tables \
--verbose=3
На этом этапе восстановленная база данных выглядит правильно.
Например, таблица имеет 400 строк с первичными ключами 1–400.

Инкрементное воспроизведение (binlog)
После создания резервной копии я вставляю дополнительные строки в исходную базу данных.
Чтобы применить эти значения, изменения в восстановленной базе данных, я запускаю:

Код: Выделить всё

mysqlbinlog /Data/mysql/binlog.000524 \
--start-position=337111 \
--database=db1 \
| sed 's/`db1`/`db1_restore`/g' \
| mysql \
--show-warnings \
-u Admin \
-h 127.0.0.1 \
-p \
db1_restore
Проблема
При применении binlog MySQL завершается с ошибкой с повторяющимися ошибками первичного ключа, например:

ОШИБКА 1062 (23000) в строке 56: повторяющаяся запись «401» для ключа «tablename.PRIMARY»

Это происходит несмотря на то, что:
  • В восстановленной таблице есть строки 1–400
  • На изображении строки бинлога показана вставка для PK 401
  • Значение AUTO_INCREMENT таблицы уже превышает 401
Бинлог явно содержит события на основе строк, такие как:

Код: Выделить всё

### INSERT INTO `db1_restore`.`tablename`
### SET
###   @1=401
Вопрос
Как правильно применить бинлоги MySQL после восстановления mydumper/myloader без возникновения повторяющихся ошибок первичного ключа?

Среда
  • MySQL 8.4.x
  • Binlog формат: ROW
  • Инструмент резервного копирования: mydumper 0.21.x
  • Инструмент восстановления: myloader 0.21.x
  • Ядро: InnoDB


Подробнее здесь: https://stackoverflow.com/questions/798 ... der-restor
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «MySql»