前提:
前提是要在linux系统下,下载完docker,然后mysql镜像到本地中。
新建主mysql服务器实例,端口号[3303]
第一步:新建mysql主服务器容器,起名mysql-master
docker run -p 3303:3306 --name mysql-master \
-v /mydata/mysql-master/log:/var/log/mysql \
-v /mydata/mysql-master/data:/var/lib/mysql \
-v /mydata/mysql-master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
第二步:进入mysql主服务器挂载在宿主机上的配置目录 /mydata/mysql-master/conf 下,创建my.cnf配置文件,进行配置。
配置以下内容:
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
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
第三步:重启mysql主服务器容器实例,让配置更新进去,养成好习惯
第四步:进入mysql-master容器内部
ps:这步是为了测试能不能用。
第五步:接第四步,在mysql-master容器实例内创建数据同步用户
主机上的数据,不能随便来个用户都可以操作更新数据库,得创建一个可以信任得用户。
以上mysql主服务器mysql-master容器实例暂时告一段落。
新建从mysql服务器实例,端口号[3304]
第一步:新建mysql主服务器容器,起名mysql-slave
docker run -p 3304:3306 --name mysql-slave \
-v /mydata/mysql-slave/log:/var/log/mysql \
-v /mydata/mysql-slave/data:/var/lib/mysql \
-v /mydata/mysql-slave/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
第二步:进入mysql从服务器挂载在宿主机上的配置目录 /mydata/mysql-slave/conf 下,创建my.cnf配置文件,进行配置。
配置以下内容:
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能,以备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
第三步:重启mysql从服务器容器实例,让配置更新进去,养成好习惯
第四步:在主数据库中查看主从同步状态
第五步:进入mysql从服务器 mysql-slave内,并连接
第六步:接第五步,在从数据库中配置主从配置
跟从服务器说好你的老大是谁,认好老大,看清谁是主库,好跟随主库进行变化。
change master to master_host='宿主机ip', master_user='slave', master_password='123456', master_port=3303, master_log_file='mall-mysql-bin.000001', master_log_pos=617, master_connect_retry=30;master_host='宿主机ip':自己查询主库宿主机的ip
master_user='slave':刚刚你在mysql-master容器实例内创建的用于数据同步的用户名。
master_password='123456':刚刚你在mysql-master容器实例内创建的用于数据同步的用户密码。
master_port=3303:主数据库在宿主机上的映射端口号。
master_log_file='mall-mysql-bin.000001', master_log_pos=617:根据第四步查询的状态写
master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
master_connect_retry:连接失败重试的时间间隔,单位为秒。
ip查询:
change master to master_host='192.168.200.130', master_user='slave', master_password='123456', master_port=3303, master_log_file='mall-mysql-bin.000001', master_log_pos=617, master_connect_retry=30;
第七步:在从库中查看主从同步状态
加了个 \G 结果展示不一样。
Slave_IO_Running: NO
Slave_SQL_Running: NO
这两个No说明同步还没开始,主库都数据都没更新。
第八步:在从数据库中开启主从同步
主数据库用来同步数据的用户是slave,从数据库也认过这个slave为老大了, 但是从数据库得开启这个用户slave,说明他打心里认从这个老大,之后跟随slave来更新数据,统一接受主数据库的sql语句。
第九步:查看从数据库状态,看看是否已经同步
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
这两个变成Yes,说明主从数据库之间的链路已经打开,同步完成。
最后,进行主从复制测试
主数据库新建库,新建表,插入数据
从数据库查看数据
可以看到从数据库的数据随主数据库更新了,那么就恭喜你完成了。