使用MariaDB 10.3.4 Docker镜像搭建主从复制遇1062错误求助
解决MariaDB主从复制中mysql.user表root@localhost主键重复(1062)的问题
这个问题确实是因为主从节点初始化时都默认创建了root@localhost用户,而mysql.user表的主键是(user, host)组合,当从库开始复制主库的这条记录时,发现本地已经存在相同主键的记录,就会触发1062错误——正如你推测的,这和Docker环境无关,原生MariaDB部署也会遇到这个情况。
下面是几个实用的解决思路:
方案一:初始化从库时先清理默认root用户
启动从库容器时,通过自定义初始化脚本提前删除默认的root@localhost用户,避免后续复制冲突:
- 编写初始化脚本
init_slave.sql,内容如下:
DROP USER IF EXISTS 'root'@'localhost'; FLUSH PRIVILEGES;
- 启动从库容器时挂载这个脚本到容器的初始化目录,让容器启动时自动执行:
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用户做复制操作,创建一个专门的复制用户可以减少系统表同步的潜在问题,同时提升安全性:
- 在主库执行以下命令创建复制用户:
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'repl_pwd'; GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%'; FLUSH PRIVILEGES;
- 从库使用这个用户启动复制,同时在从库初始化完成后,手动删除本地的
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
相关产品推荐
相关产品推荐

