0. 配置说明
宿主机使用的版本为19045
的win10专业版,MySQL使用的是8.0+,Docker容器使用Linux。
1. 安装Docker Desktop
- 略
修改Docker默认安装路径
安装包自己就提供了修改安装路径的功能,CMD中运行:
“Docker Desktop Installer.exe” install --installation-dir=
--installation-dir=<path>
: changes the default installation location (C:\Program Files\Docker\Docker
)
2. 在Docker中安装MySQL
可以访问 MySQL 镜像库地址:https://hub.docker.com/_/mysql?tab=tags 查看可用的其他mysql版本,默认为最新版本mysql:latest
2.1 拉取MySQL镜像
$ docker pull mysql:latest
2.2 查看本地镜像
$ docker images
2.3 启动MySQL容器实例
$ docker run --name mysql -p 3309:3306 -e MYSQL_ROOT_PASSWORD=5508769123 -d mysql
参数说明:
- docker run:告诉Docker启动一个新的容器
- –name mysql :指定了容器的名称,这里是 “mysql”
- -p 3309:3306:端口映射设置,将容器内的MySQL数据库端口(默认为3306)映射到主机上的3309端口。这样可以通过主机的3309端口访问MySQL服务器
- -e MYSQL_ROOT_PASSWORD=5508769123:环境变量的设置,用于配置MySQL容器的根用户(root)的密码。这里,密码被设置为 “5508769123”
- -d:表示以"后台"(detached)模式运行容器
- mysql:要运行的Docker镜像的名称
下面给出的输出16821a8792a185997c1b5df334fa4461a157488e90d881902596e7ff3db8c42f
为容器的id。
2.4 检查安装
$ docker ps
打开Docker Desktop检查
宿主机登录Docker中的MySQL:
3. 主从复制
3.1 设置主库(这里为宿主机器)
-
修改主库MySQL数据库的配置文件,这里配置文件位置为:
C:\ProgramData\MySQL\MySQL Server 8.0\my.ini
添加信息为:
[mysqld] log-bin=mysql-bin #必须启用二进制日志 server-id=100 #必须服务器唯一ID
找到[mysqld]标签然后添加下面两行即可
-
重启MySQL服务
(管理员权限)
$ net stop mysql80$ net start mysql80
-
在主库创建新用户并赋权
登录主库然后执行下面两条指令:
CREATE USER 'mercurows'@'%' IDENTIFIED WITH caching_sha2_password BY '5508769123'; GRANT REPLICATION SLAVE , REPLICATION CLIENT ON *.* TO 'mercurows'@'%';
**注意:**mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password。我们发现root的加密规则为caching_sha2_password,现在修改为mysql_native_password,
ALTER USER 'mercurows'@'%' IDENTIFIED WITH 'mysql_native_password' BY '5508769123';
解释:
-
CREATE USER
:创建一个新用户。 -
'mercurows'@'%'
:新用户的标识符。'mercurows'
是用户名,'%'
表示这个用户可以从任何主机连接到MySQL服务器。如果想限制用户只能从特定主机连接,可以在'%'
的位置指定相应的主机地址。 -
IDENTIFIED WITH caching_sha2_password BY '5508769123'
:用户的身份验证方法和密码。在这里用户的身份验证方法被设置为caching_sha2_password
,并且密码被设置为'5508769123'
。注意:mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password。 -
REPLICATION SLAVE, REPLICATION CLIENT
:表示授予用户 ‘mercurows’ 两种权限:REPLICATION SLAVE
(用于复制从其他MySQL服务器)和REPLICATION CLIENT
(用于查询和管理复制状态)。 -
ON *.*
:表示授予权限的范围,*.*
表示所有数据库和所有表。 -
TO 'mercurows'@'%'
:这部分指定了要授予权限的用户和其访问主机。与前一个命令相同,'mercurows'@'%'
表示 ‘mercurows’ 用户可以从任何主机连接。
检查:
flush privileges; SHOW GRANTS FOR 'mercurows'@'%';
-
-
检查主库状态
show master status;
并记录File
与Position
这两个记录,这里是DESKTOP-UPK0D57-bin.000038
与1353
,注意:在完成设置之前都不能对主库进行操作以免这两个记录发生改变。
3.2 设置从库(这里为Docker中的MySQL)
-
修改从库MySQL数据库的配置文件,这里文件在
/etc/my.cnf
中添加信息为:
[mysqld] server-id=100 #必须服务器唯一ID
找到[mysqld]标签然后添加下面一行然后保存即可
-
重启MySQL服务(我这里直接重启容器了)
-
登录从库中的MySQL然后执行下面的语句:
change master to master_host='192.168.1.172',master_port=3306,master_user='mercurows',master_password='5508769123',master_log_file='DESKTOP-UPK0D57-bin.000038',master_log_pos=1353;start slave;
解释:
change master to
:告诉MySQL服务器,接下来要更改主从复制的设置master_host='192.168.1.172'
:指定主数据库的主机名或IP地址。在这里就是我宿主电脑的IP地址master_port=3306
:指定主数据库的端口号。默认情况下,MySQL的端口号是3306master_user='mercurows'
:指定连接到主数据库的用户名,这里用户名是mercurows
。这个就是上面主数据库中刚刚创建的用户master_password='5508769123'
:这是指定连接到主数据库的用户的密码,这里密码是5508769123
master_log_file='DESKTOP-UPK0D57-bin.000038'
:这是指定主数据库上用于复制的二进制日志文件的名称。在主从复制中,主数据库会将更改记录在二进制日志文件中,从数据库会从这些文件中读取并应用这些更改。而这个日志名称在上面的3.1中的4.检查主库状态中得出master_log_pos=1353
:这是指定从哪个位置开始读取主数据库的二进制日志文件。而这个位置在上面的3.1中的4.检查主库状态中得出
-
检查
show slave status \G;
slave机器上有两个关键的进程,必须两个都要显示为 Y E S YES YES,一个是Slave_IO_Running:,一个是Slave_SQL_Running:一个负责与主机的io通信,一个负责自己的slave mysql进程。
3.3 测试
初始数据库情况:
mysql
–主库,slave
–从库
- 在主库中创建testdatabase数据库然后刷新从库:
- 在主库创建
user
表并刷新从库
经测试,对主库的增删改均能同步到从库中。
参考
- 如何在Windows上更改Docker的默认安装路径?
- docker搭建mysql8主从复制(一主一从)