【问题标题】:Duplicate key error after MariaDB replication setupMariaDB 复制设置后出现重复键错误
【发布时间】:2021-02-15 20:50:53
【问题描述】:

在尝试在单个主服务器和复制服务器之间执行基本复制设置时,寻找有关我继续做错的指导。

通过多年来的几次试验,这充其量是不一致的。我最近的尝试(步骤)如下所示,这是来自多个站点的高潮,包括 MariaDB 支持站点。

目标:使用mariabackup或其他推荐的方法从主服务器备份数据库,恢复到复制服务器,并成功地将数据从主服务器复制到复制服务器。

使用 Mariabackup 捕获数据的备份

在主服务器上

在 MySQL 命令提示符下运行以下命令

flush privileges; flush tables with read lock;

当数据库被锁定时

运行此命令进行备份

mariabackup --defaults-file="m:\mariadb\my.ini" --backup --target-dir="m:\backup" --user user --password pass

备份后,运行命令准备

mariabackup --defaults-file="m:\mariadb\my.ini" --prepare --target-dir="m:\backup" --user user --password pass

注意 准备完成后,请确保在 MariaDB 命令提示符窗口中运行“解锁表”。

prepare 命令将显示 binlog 文件和在 CHANGE MASTER TO 中使用的位置,因此请务必在完成后捕获 prepare 命令的输出。

prepare 命令的示例输出

mariabackup based on MariaDB server 10.3.12-MariaDB Win64 (AMD64)
mariabackup: cd to m:\backup\
mariabackup: This target seems to be not prepared yet.
mariabackup: using the following InnoDB configuration for recovery:
mariabackup:   innodb_data_home_dir = .
mariabackup:   innodb_data_file_path = ibdata1:10M:autoextend
mariabackup:   innodb_log_group_home_dir = .
mariabackup: Starting InnoDB instance for recovery.
mariabackup: Using 104857600 bytes for buffer pool (set by --use-memory paramete
r)
2020-11-02 22:46:49 0 [Note] InnoDB: Mutexes and rw_locks use Windows interlocke
d functions
2020-11-02 22:46:49 0 [Note] InnoDB: Uses event mutexes
2020-11-02 22:46:49 0 [Note] InnoDB: Compressed tables use zlib 1.2.11
2020-11-02 22:46:49 0 [Note] InnoDB: Number of pools: 1
2020-11-02 22:46:49 0 [Note] InnoDB: Using SSE2 crc32 instructions
2020-11-02 22:46:49 0 [Note] InnoDB: Initializing buffer pool, total size = 100M
, instances = 1, chunk size = 100M
2020-11-02 22:46:49 0 [Note] InnoDB: Completed initialization of buffer pool
2020-11-02 22:46:49 0 [Note] InnoDB: Starting crash recovery from checkpoint LSN
=936805148847
2020-11-02 22:46:49 0 [Note] InnoDB: Last binlog file '.\master-bin.000003', pos
ition 167707395
Last binlog file .\master-bin.000003, position 167707395
201102 22:46:50 completed OK!

恢复数据库 将备份目录从 master 复制到 slave 上的 DB 驱动器的根目录

登录从服务器,打开命令提示符到备份目录

运行命令复制恢复备份到从数据目录

mariabackup --copy-back --target-dir="M:\backup" --datadir="m:\mariadb\data" --user infinity --password infinitydb

在从服务器上启动 MariaDB 服务

使用适当的值运行以下更改主命令

示例

CHANGE MASTER TO master_host="idk3-vm5", master_log_file='master-bin.000003', master_log_pos=167707395, master_port=3306, master_user="repl", master_password="repl", master_use_gtid=current_pos;

启动并检查从站

start slave; 

show slave status \G

开始复制时出错

MariaDB [(none)]> show slave status \G
*************************** 1. row ***************************
                Slave_IO_State: Queueing master event to the relay log
                   Master_Host: idk3-vm5
                   Master_User: repl
                   Master_Port: 3306
                 Connect_Retry: 60
               Master_Log_File: master-bin.000002
           Read_Master_Log_Pos: 604529766
                Relay_Log_File: idk3-vm8-relay-bin.000002
                 Relay_Log_Pos: 1631
         Relay_Master_Log_File: master-bin.000002
              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: 1062
                    Last_Error: Error 'Duplicate entry 'idk3-vm8-OrderInjector' for key 'PRIMARY'' on query. Default database: 'idf'. Query: 'INSERT INTO `idf`. `idf_client_version` (`idf`.`idf_client_version`.`HOSTNAME`,`idf`.`idf_client_ve rsion`.`SOFTWARE`,`idf`.`idf_client_version`.`VERSION`,`idf`.`idf_client_version `.`LAST_CONNECTED`) VALUES ('idk3-vm8','OrderInjector','20.2.11','2020-11-02 11: 29:13')'
                  Skip_Counter: 0
           Exec_Master_Log_Pos: 1331
               Relay_Log_Space: 604530378
               Until_Condition: None
                Until_Log_File:
                 Until_Log_Pos: 0
            Master_SSL_Allowed: No
            Master_SSL_CA_File:
            Master_SSL_CA_Path:
               Master_SSL_Cert:
             Master_SSL_Cipher:
                Master_SSL_Key:
         Seconds_Behind_Master: NULL  Master_SSL_Verify_Server_Cert: No
                 Last_IO_Errno: 0
                 Last_IO_Error:
                Last_SQL_Errno: 1062
                Last_SQL_Error: Error 'Duplicate entry 'idk3-vm8-OrderInjector' for key 'PRIMARY'' on query. Default database: 'idf'. Query: 'INSERT INTO `idf`. `idf_client_version` (`idf`.`idf_client_version`.`HOSTNAME`,`idf`.`idf_client_ve rsion`.`SOFTWARE`,`idf`.`idf_client_version`.`VERSION`,`idf`.`idf_client_version `.`LAST_CONNECTED`) VALUES ('idk3-vm8','OrderInjector','20.2.11','2020-11-02 11: 29:13')'    Replicate_Ignore_Server_Ids:
              Master_Server_Id: 1
                Master_SSL_Crl:
            Master_SSL_Crlpath:
                    Using_Gtid: Slave_Pos
                   Gtid_IO_Pos: 0-1-701693
       Replicate_Do_Domain_Ids:    Replicate_Ignore_Domain_Ids:
                 Parallel_Mode: conservative
                     SQL_Delay: 0
           SQL_Remaining_Delay: NULL
       Slave_SQL_Running_State:
              Slave_DDL_Groups: 0 Slave_Non_Transactional_Groups: 0
    Slave_Transactional_Groups: 3 1 row in set (0.003 sec)

鉴于我已经刷新了权限、刷新了表并锁定了数据库,然后捕获了备份,我不明白为什么在恢复和完成复制配置后我继续得到重复的密钥。

如果有人能帮助我理解我做错了什么,我将不胜感激。

【问题讨论】:

  • 关于从属状态,二进制日志正在从文件 master-bin.000002 中读取,而备份已经进行到 master_log_file='master-bin.000003', master_log_pos=167707395。请在从服务器reset slave all; 上运行命令并再次更改主服务器
  • 感谢您的回复。我已经多次运行停止奴隶,重置奴隶,重置奴隶,并重复改变主人。我什至已经完成了这些事情,回到主服务器,刷新 priv,锁定表,通过 show master status 捕获一个新日志和 pos,并在我的 change master to command 中使用它,每次启动时我都会收到重复的键错误复制。
  • 检查idf.idf_client_version 在两台服务器上的声明是否相同。 (显示创建表idf.idf_client_version

标签: mysql mariadb database-replication


【解决方案1】:

关于从属状态,二进制日志正在从文件 master-bin.000002 中读取,同时备份到master_log_file='master-bin.000003', master_log_pos=167707395. 请在从属服务器上运行命令

全部重置奴隶;

将 MASTER 更改为 master_host="idk3-vm5", master_log_file='master-bin.000003', master_log_pos=167707395, master_port=3306, master_user="repl", master_password="repl";

启动从机;

注意:这里不需要master_use_gtid=current_pos;。一旦从站将不同步,那么您可以使用 GTID 进行更改。

【讨论】:

  • 这工作完美,现在一切都在同步 - 非常感谢。所以一旦事情同步了,那么运行 CHANGE MASTER TO master_use_gtid=current_pos 就好了,对吗?这在 MariaDB 复制支持站点上被列为推荐要做的事情。
  • 如果从属同步。首先检查 gtid slave_pos 和 current_pos 是否相同。
猜你喜欢
  • 1970-01-01
  • 2016-02-05
  • 2013-03-17
  • 1970-01-01
  • 2012-12-06
  • 2016-10-19
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多