我正在尝试在 docker 容器中运行 MySQL 复制从属。我们在生产环境中运行 MySQL 5.7.24-27-log,它来自 percona 存储库(Ubuntu 18.04)。
我曾经xtrabackup
备份、准备和发送一个用于复制的起始数据集,然后我docker pull percona
像这样启动了 percona docker 映像():
$ docker run --name mysql-replication -v /replication/data:/var/lib/mysql -v /replication/docker.cnf:/etc/mysql/docker.cnf:ro -e MYSQL_ROOT_PASSWORD=xxxx -P -d percona
我的 docker.cnf 只记录了服务器 ID(我从percona
图像中复制了它)。
[mysqld]
skip-host-cache
skip-name-resolve
bind-address = 0.0.0.0
server-id = 4
然后使用CHANGE MASTER
等。我的复制运行得很好。
我的意图(根据卷挂载-v /replication/data:/var/lib/mysql
)是将所有 MySQL 数据保留在主机上,并将复制 docker 容器视为短暂的,即容器中没有状态。server-id
如果我需要通过停止现有容器、将数据复制到别处、更改并运行新容器来启动另一个复制容器,也应该很容易。
为了测试这一点,在它设置并正常运行后(我看了Seconds_Behind_Master
下拉到0
),我想我应该能够删除容器并重新创建它,并且复制仍然可以正常工作。因此我尝试了这个:
$ docker stop mysql-replication
$ docker rm mysql-replication
$ docker run ... // same command as before
当我这样做并连接到在容器中运行的 MySQL 时,我发现它Slave_IO_Running
是No
,并且在启动它 ( START SLAVE;
) 后,我得到以下信息(如中所示SHOW SLAVE STATUS;
):
Last_Error: Could not execute Update_rows event on table databasename.tablename; Can't find record in 'tablename', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000681, end_log_pos 9952
(databasename
并且tablename
是真实的数据库和表名)
起初我以为我可能搞砸了,但我现在已经尝试了很多次来尝试解决问题。使用docker diff mysql-replication
显示对正在运行的容器没有任何变化,这似乎很重要:
$ docker diff mysql-replication
C /run
C /run/mysqld
A /run/mysqld/mysqld.pid
C /var
C /var/log
A /var/log/mysql
谷歌搜索建议我需要使用RESET SLAVE;
,START SLAVE;
但这似乎无法解决它 - 就像数据(容器外)不再与主服务器同步,因此复制无法继续。
任何人都可以在我正在做的事情中找出漏洞吗?
非常感谢。