1:实现主从复制这个过程我是趟过坑的,后面是自己动手搞了几遍都成功了以后才开始决定记录的,(所以有的截图和上下文对不上的,比如说docker容器的名字对应不上,大家就用自己的就好),打算从centos8安装docker开始到最后实现主从复制,所以我从一开始将原有docker卸载开始记录的,如果你有docker了的话,可以跳过卸载docker步骤。
2:建议刷到帖子的小伙伴不着急上手,先浏览完再上手
3:描述有误的地方欢迎大家不吝赐教,找到我v:star2020082220210611
卸载docker
1:删除docker容器
sudo docker stop $(docker ps -aq)
注意:这个命令会停止所有容器,包括正在运行的容器和已经停止的容器
2:删除所有容器:
sudo docker rm $(docker ps -aq)
注意:由于我这里只有一个docker,而且已经执行了docker rm 容器id/容器名称这个命令来删除容器了。所以这里就不贴图了
3:删除所有镜像(我这里就一个mysql5.7的镜像,不过删除的这个过程有点花时间,稍微等下哈)
sudo docker rmi $(docker images -q)
注意:这个命令会删除所有镜像,包括正在运行的镜像和已经停止的镜像;执行这个命令时,命令行会给出二次确认提示y/n,选择y代表继续执行删除操作。出现上面第二个界面代表删除完毕。
4:卸载docker
sudo yum remove docker-ce docker-ce-cli containerd.io
5:删除docker数据目录
sudo rm -rf /var/lib/docker
注意:这个命令会删除 Docker 数据目录,包括所有容器、镜像和数据卷。
上面这些操作是因为我想从安装docker开始从头到尾记录,在搭建的过程中躺了几次坑,后面搭建成功后我又删除了几次,反复实验都能实现主从复制,所以记录下。大家不需要删除docker的可以直接从下面的步骤开始,希望能帮到其他小伙伴。
接下来从centos中安装docker镜像开始。
首先centos中安装docker镜像:
1:更新数据源
sudo yum update
2:安装docker运行时需要的一些工具和依赖库,因为这些centos8中并不完整,需要进行安装
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
3:下载docker包
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4:安装docker社区版:(这个过程也需要等待会儿哈)
sudo yum install -y docker-ce
5:设置docker服务并启动
sudo systemctl enable docker
sudo systemctl start docker
注意:也可以一起执行:sudo systemctl enable docker &&sudo systemctl start docker
6:查询docker版本
sudo docker --version
至此docker已经安装完成了,接下来是mysql
拉取mysql镜像,这里以mysql5.7版本为例
1:拉取mysql5.7镜像
docker pull mysql:5.7
注意:这个过程需要等待哈
2:查看镜像
docker images
3:随便创建一个mysql容器,这里的主要目的是为了复制mysql配置文件,因为我是想将mysql的配置文件my.cnf挂载出去,方便修改
docker run -d --name master mysql:5.7
注意:这里是创建一个mysql容器并运行,如果需要查看mysql的配置文件my.cnf需要执行以下命令,不需要的可以跳过
步骤1:创建容器并启动
docker run -d -p 3333:3306 --name master -e MYSQL_ROOT_PASSWORD=123456 docker.io/mysql:5.7
解释下含义:
docker run -d -p 3333:3306 --name master -e MYSQL_ROOT_PASSWORD=123456 docker.io/mysql:5.7
这个 docker 命令用于在 docker 中运行一个 MySQL 容器,以下是命令中各个参数的含义:
docker run:用于在 docker 中运行一个容器的命令。
-d:表示在后台(detached 模式)运行容器,即不在终端上显示容器的输出。
-p 3333:3306:将主机(Host)的 3333 端口映射到容器的 3306 端口。这意味着你可以通过主机的 3333 端口访问容器中的 MySQL 服务。
--name master:指定容器的名称为 "master"。
-e MYSQL_ROOT_PASSWORD=123456:设置 MySQL 根用户的密码为 "123456"。这里使用环境变量来传递密码给容器内的 MySQL 服务。
docker.io/mysql:5.7:表示使用 Docker Hub 上的 mysql 镜像,并指定标签为 5.7。
综合起来,这个命令的作用是在 Docker 中创建一个 MySQL 5.7 版本的容器,
容器名称为 "master",
通过主机的 3333 端口访问 MySQL 服务,并设置根用户密码为 "123456"。
容器在后台运行,不在终端上显示输出。
步骤2:进入容器的shell
docker exec -it master bash
步骤3:查看默认的my.cnf配置文件
ls /etc/my.cnf
cat /etc/my.cnf
或者是
ls /etc/mysql/my.cnf
cat /etc/mysql/my.cnf
4:创建并启动了docker开始创建文件夹,将mysql的默认配置文件拷贝进来,然后修改配置,在挂载出去,这样方便我们修改mysql的配置文件。
mkdir mysql // home文件下创建mysql文件
mkdir /home/mysql/master // mysql文件夹下创建主库文件夹master
mkdir /home/mysql/slave // mysql文件夹下创建从库文件夹slave
5:复制配置文件到上面创建的主从文件的my.cnf配置文件中
主文件夹:
docker cp master:/etc/my.cnf /home/mysql/master
从文件夹:
docker cp master:/etc/my.cnf /home/mysql/slave
查看是否复制成功
6:删除上面正在运行的容器
docker ps -a //查看
docker stop master //停止 ,test是我上面创建的容器的名字
docker rm master //删除
7:启动主容器
docker run -d \
--restart=always \
-p 3306:3306 \
-v /home/mysql/master/my.cnf:/etc/my.cnf \
-e MYSQL_ROOT_PASSWORD=123456 \
--name master mysql:5.7
以上docke命令中各个参数的含义:
docker run:用于在 Docker 中运行一个容器的命令。
-d:表示在后台(detached 模式)运行容器,即不在终端上显示容器的输出。
-p 3333:3306:将主机(Host)的 3333 端口映射到容器的 3306 端口。这意味着你可以通过主机的 3333 端口访问容器中的 MySQL 服务。
--name master:指定容器的名称为 "master"。
-e MYSQL_ROOT_PASSWORD=123456:设置 MySQL 根用户的密码为 "123456"。这里使用环境变量来传递密码给容器内的 MySQL 服务。
docker.io/mysql:5.7:表示使用 Docker Hub 上的 mysql 镜像,并指定标签为 5.7。
8:进入主库的配置文件并在文件[mysqld]下新增以下内容,保存后退出。
vim /home/mysql/master/my.cnf
## 设置server_id, 同一个局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql,information_schema
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
9:重新启动主库容器
docker restart master
注意:要保证master库启动成功后再继续下面的步骤,否则就会再登录mysql的时候报错,提示用户名密码不正确,如图所示。可以查看日志,当出现图二红框中所示代表启动成功了,这个时候再继续下面的步骤,去登录mysql的时候就不会报错
docker logs master //查看容器名为master的日志
10:主库中创建数据同步,分为以下几个步骤
步骤1:mysql容器
docker exec -it master bash
步骤2:登录mysql
mysql -uroot -p123456
步骤3:授予 名为"slave" 的用户从主数据库复制数据的权限
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456';
具体含义:
GRANT REPLICATION SLAVE:授予从数据库复制数据的权限。
ON *.*:将权限应用于所有数据库和所有表。
TO 'slave'@'%':授予 "slave" 用户在任何主机上的访问权限。'%' 表示任意主机。
IDENTIFIED BY '123456':设置用户 "slave" 的密码为 "123456"。
步骤4:授予名为 “slave” 的用户在从数据库复制数据和执行一些客户端操作所需的权限
grant replication slave, replication client on *.* to 'slave'@'%';
具体含义:
grant replication slave:授予从数据库复制数据的权限。
replication client:授予从数据库执行一些客户端操作的权限,例如读取主数据库的二进制日志信息。
on *.*:将权限应用于所有数据库和所有表。
to 'slave'@'%':授予 "slave" 用户在任何主机上的访问权限。'%' 表示任意主机
步骤5:刷新
flush privileges;
步骤6:查看主从同步状态记录该状态下的master_log_file和master_log_pos,这两个参数值需要记住,后面会用到
show master status;
然后ctrl+d退出即可。
注意:上面的步骤也可以在navicat中操作 。
1:新建mysql链接登录数据库
2:执行命令(按顺序执行哈)
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456';
grant replication slave, replication client on *.* to 'slave'@'%';
flush privileges;
show master status;
11:启动从容器
docker run -d \
--restart=always \
-p 3307:3306 \
-v /home/mysql/slave/my.cnf:/etc/my.cnf \
-e MYSQL_ROOT_PASSWORD=123456 \
--name slave mysql:5.7
12:修改从库配置文件,并在[mysqld]下新增以下内容:
vim /home/mysql/slave/my.cnf
在文件[mysqld]中新增以下内容:
## 设置server_id, 同一个局域网内需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql,information_schema
## 开启二进制日志功能,以备slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断
## 如:1062错误是指一些主键重复,1032是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置只读(具有super权限的用户除外)
read_only=1
13:重新启动从容器
docker restart slave
14:从库中创建数据同步用户,分为以下几个步骤
步骤1:进入mysql容器
docker exec -it slave bash
步骤2:登录mysql
mysql -uroot -p123456
步骤3:配置 MySQL 主从复制中从数据库的连接和同步信息,它告诉从数据库如何连接到主数据库以获取数据的复制更新。
CHANGE MASTER TO master_host = '192.168.0.25',
master_user = 'slave',
master_password = '123456',
master_port = 3306,
master_log_file = 'mall-mysql-bin.000001',
master_log_pos = 807,
master_connect_retry = 30;
上面这段 SQL 各个参数的含义:
master_host = '192.168.0.25':这是主数据库的 IP 地址或主机名。从数据库将连接到该主数据库来获取复制数据。
master_user = 'slave':这是连接主数据库所使用的用户名。通常创建一个用于复制的专用用户。
master_password = '123456':连接主数据库所使用的密码,与上述用户名对应。
master_port = 3306:主数据库的端口号,通常为 MySQL 默认的端口号 3306。
master_log_file = 'mall-mysql-bin.000001':这是主数据库二进制日志中的日志文件名,它包含复制数据的更新记录。
master_log_pos = 807:这是主数据库二进制日志文件中的位置,指示从数据库在何处开始读取二进制日志以进行复制。
master_connect_retry = 30:在连接主数据库失败时,从数据库会尝试重新连接的时间间隔(以秒为单位)。
总体而言,这些配置参数告诉从数据库应该连接到哪个主数据库,使用哪个用户和密码来获取复制数据,并从主数据库的指定二进制日志位置开始同步数据。这是主从复制配置的一部分,使得从数据库可以与主数据库保持数据同步。在执行 CHANGE MASTER TO 后,从数据库可以开始运行复制进程,从主数据库同步数据更新。
13:查看状态,此时Slave_IO_Running、Slave_SQL_Running都为No
show slave status \G;
14:开启主从同步
start slave;
15:再次查看主从同步状态, 此时Slave_IO_Running、Slave_SQL_Running都为 Yes
show slave status \G;
注:上面的步骤也可以在navicat中进行,步骤如下:
步骤1:新建mysql链接登录数据库
步骤2:配置 MySQL 主从复制中从数据库的连接和同步信息
CHANGE MASTER TO master_host = '192.168.0.25',
master_user = 'slave',
master_password = '123456',
master_port = 3306,
master_log_file = 'mall-mysql-bin.000001', //与主库中一致
master_log_pos = 1444, // 与主库中一致
master_connect_retry = 30;
步骤3:查看主从同步状态# 此时Slave_IO_Running、Slave_SQL_Running都为 No
show slave status;
步骤4:开启主从同步
start slave;
步骤5:再次查看主从同步状态# 此时Slave_IO_Running、Slave_SQL_Running都为 Yes
show slave status;
16:从库的Slave_IO_Running、Slave_SQL_Running都为Yes时代表主从配置成功了,接下来就可以去nacivat中创建链接,连接成功后创建数据库,插入数据,就可以验证主从是否同步啦,也可以在命令行中进行,我以nacivat中为例,创建库,表,插入数据,看是否同步
验证1:库是否同步
主库新建一个数据库:test
从库刷新一下再看:
结论:从数据库中也存在了一个test库
验证2:表是否同步
主库中创建一张表
从库刷新下再看:
结论:从库中也存在了user表
验证3:数据是否同步
从库刷新下再看:
结论:从库中也存在了user表中的数据
到此,就算完结啦,描述有误的地方欢迎大家指正。