将完整备份导入从属时出现重复记录错误,例如“Duplicate Entry for key 'PRIMARY', error code 1062”

Joh*_*ohn 5 mysql mariadb galera

我们正在使用主服务器的完整备份恢复我们的从服务器,并收到一堆重复的密钥错误。一旦从站被追上,它就不会抛出任何错误(只有当它落后于主站时)。我们复制所有数据库表。我们使用一个 MariaDB Galera 集群作为主,一个 MariaDB 实例作为从。

这些是完成的步骤:

  1. 通过检查变量获取 master 的 GTID "gtid_binlog_position"。保存此值。

  2. 使用以下命令备份 master:

    mysql -u -p --routines --triggers --single-transaction --gtid --master-data --dump-slave --add-drop-database <dbnames> | gzip > /tmp/backup.sql.gz.

    完成此备份大约需要 20 分钟。

  3. 将数据库导入从属。

  4. 运行RESET SLAVE ALL,并将 GTID 位置设置为第一步中的值。这是通过命令完成的SET GLOBAL gtid_slave_pos = "<gtid from step 1>";,然后CHANGE MASTER TO ...

在此之后,我收到"Duplicate Entry for key 'PRIMARY', error code 1062"错误。

这些是使用的设置:

 [mysqld]     
 innodb_buffer_pool_size = 6G
 gtid_domain_id=100
 log-slave-updates=true
 open_files_limit=1000000
 innodb_large_prefix = on
 innodb_file_format = barracuda
 innodb_file_per_table = on


 [galera]
 binlog_format=row
 default_storage_engine=InnoDB
 innodb_autoinc_lock_mode=2
 log_slave_updates=1
 ## Below was added
 sync_binlog=1
 innodb_doublewrite=1
 query_cache_size=0'
 wsrep_provider_options="gcache.size = 5G"
 wsrep_retry_autocommit=4
Run Code Online (Sandbox Code Playgroud)

我通读了MySQL replication: 'Duplicated entry for PRIMARY key,但似乎解决方案不适用于这种情况,因为我没有这些设置有问题。

什么会导致这些重复的密钥错误出现?

jyn*_*nus 0

从您的步骤来看,您很可能从不同的位置备份并开始复制:

通过检查变量“gtid_binlog_position”获取master的GTID。保存该值。

不要使用该值,在该时间和进行备份的时间之间(即使是几秒),可能会更改更多行,这意味着您将无法获得起始位置的准确表示 - 这是最可能的原因重复键错误。您正在使用以下命令进行备份:

--single-transaction --gtid --master-data

您必须使用 InnoDB 才能使单个事务正常工作,否则,您的其他表将不一致。然后,使用二进制日志坐标或转储 .sql 文件开头附近写入的 gtid 位置来启动您的从站。

这个错误可能是因为在官方指南中提到了变量的 SELECT,但这仅适用于正在运行的复制,如果主服务器没有被写入或所有表都被锁定。该指南提到使用集成到 mysqldump 或 xtrabackup 中的功能是更好的选择。

这是 MySQL 上 GTID 的完整指南(一些选项和功能发生了变化,但它可能是整个过程的更好概述): https: //www.percona.com/blog/2013/02/08/how- to-createrestore-a-slave-using-gtid-replication-in-mysql-5-6/