You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用MariaDB 10.3.4 Docker镜像搭建主从复制遇1062错误求助

解决MariaDB主从复制中mysql.user表root@localhost主键重复(1062)的问题

这个问题确实是因为主从节点初始化时都默认创建了root@localhost用户,而mysql.user表的主键是(user, host)组合,当从库开始复制主库的这条记录时,发现本地已经存在相同主键的记录,就会触发1062错误——正如你推测的,这和Docker环境无关,原生MariaDB部署也会遇到这个情况。

下面是几个实用的解决思路:

方案一:初始化从库时先清理默认root用户

启动从库容器时,通过自定义初始化脚本提前删除默认的root@localhost用户,避免后续复制冲突:

  1. 编写初始化脚本init_slave.sql,内容如下:
DROP USER IF EXISTS 'root'@'localhost';
FLUSH PRIVILEGES;
  1. 启动从库容器时挂载这个脚本到容器的初始化目录,让容器启动时自动执行:
docker run -d \
  --name mariadb-slave \
  -v $(pwd)/init_slave.sql:/docker-entrypoint-initdb.d/init_slave.sql \
  -e MYSQL_ROOT_PASSWORD=your_root_pwd \
  mariadb:10.3.4

方案二:配置主从复制时使用专用复制用户(推荐)

尽量避免用root用户做复制操作,创建一个专门的复制用户可以减少系统表同步的潜在问题,同时提升安全性:

  1. 在主库执行以下命令创建复制用户:
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'repl_pwd';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;
  1. 从库使用这个用户启动复制,同时在从库初始化完成后,手动删除本地的root@localhost,再开始复制:
DROP USER 'root'@'localhost';
FLUSH PRIVILEGES;
-- 之后执行CHANGE MASTER TO命令启动复制
CHANGE MASTER TO
  MASTER_HOST='master_container_ip',
  MASTER_USER='repl_user',
  MASTER_PASSWORD='repl_pwd',
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=154;
START SLAVE;

方案三:临时跳过系统表复制(不推荐)

如果不需要同步mysql库的权限变动,可以在主库的配置文件中添加过滤规则,跳过mysql.user表的复制:

[mysqld]
# 跳过整个mysql库的复制
binlog-ignore-db=mysql
# 或者仅跳过user表
binlog-ignore-table=mysql.user

⚠️ 注意:这个方法仅适用于特殊场景,不同步mysql库可能导致主从权限配置不一致,不建议在生产环境使用。

内容的提问来源于stack exchange,提问作者Kryten

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:22:03