目录
2 创建节点配置文件(master.cnf与slave.cnf)
结构模式-----各种不同的结构模式上面的为一主一从(多从)
mysql主从复制同步
一 前提条件
1 具有docker环境的centos7
- yum install docker
- service docker start
2 mysql镜像5.7或5.7.28(更高版本主从复制配置不同)
docker pull mysql:8.0
二 mysql集群配置文件
1 创建配置集结构如下
- mkdir /docker/mysql/data/master MySQL主库数据位置
- mkdir /docker/mysql/data/slave MySQL从库数据位置
- mkdir /docker/mysql/master MySQL主库配置文件
- mkdir /docker/mysql/slave MySQL主库配置文件
2 创建节点配置文件(master.cnf与slave.cnf)
- cd /docker/mysql/master
- vim master.cnf
- cd /docker/mysql/slave
- vim slave.cnf
主库内容如下
- [mysqld]
- user=mysql
- character-set-server=utf8
- lower_case_table_names = 1
- #开启二进制日志 名字为日志文件的名字随便填即可
- log_bin=master1_log
- #开启主从在局域网内应该有唯一的server_id 1~255
- server_id=1
- binlog_format="mixed"
- [client]
- default-character-set=utf8
- [mysql]
- default-character-set=utf8
- 从库内容如下
- [mysqld]
- user=mysql
- character-set-server=utf8
- lower_case_table_names = 1
- server_id=2
- [client]
- default-character-set=utf8
- [mysql]
- default-character-set=utf8
三、搭建mysql环境
创建mysql容器
从dockerhub拉去一个5.7.28或者5.7的镜像
Docker pull mysql:5.7.28
创建从库容器
docker run --privileged=true --name mysqlslave -p 3340:3306 -v /docker/mysql/slave/slave.cnf:/etc/mysql/my.cnf -v /docker/mysql/data/slave:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.28
创建主库容器
docker run --privileged=true --name mysqmaster -p 3339:3306 -v /docker/mysql/master/master.cnf:/etc/mysql/my.cnf -v /docker/mysql/data/master:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.28
*根据实际情况修改路径
--privileged=true #赋予权限
--name #别名
-p #端口映射
-v #容器数据卷my.cnf为配置文件
MYSQL_ROOT_PASSWORD #mysql数据库的账号密码
查看运行状态
docker ps -a
全部在运行状态就是正常的
主库从库赋权
主库
查看容器局域网
docker network inspect bridge
可以看到容器局域网内的连接信息
远程连接主库mysql
Mysql -uroot -proot -h 127.18.0.3 ##-u数据库账号 -p数据库密码 -h 数据库局域网ip地址
如果连接不上可以用navicat连接
然后右键连接-------->命令列界面
Grant replication slave on *.* ‘root’@’172.18.0.3’ identified by ‘root’
grant replication slave on *.* to '用户名'@'ip' identified by '密码';#授权给从服务器,单个数据库授权无效,必须设置*.* ip是从库的内网ip
输入show master status;
从库
远程连接从库mysql
在命令列界面输入
mysql> change master to
-> master_host='ip', #主库的内网ip
-> master_user='root', #主库登陆账号
-> master_password='root', #主库登录密码
-> master_log_file='master1_log.000003', #与主库binlog日志名相同
-> master_log_pos=1908; #偏移量,与主库相同
然后运行
start slave;
扩展配置不需要加
Log_slave_update 记录从库更新,允许链式复制(a-b-c)
Relay_log=dbsvr2-relay-bin指定中继日志文件名
Replicate_do_db=mysql仅复制指定库,其他库将被忽略,此选项可设置多条
Replicate_ignore_d=test 不复制哪些库,其他库将被忽略
输入show slave status\G找到
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
即主从同步成功
如果有一个为no即同步失败
下面介绍两种解决方法:
方法一:忽略错误后,继续同步
该方法适用于主从库数据相差不大,或者要求数据可以不完全统一的情况,数据要求不严格的情况
解决:
stop slave;
#表示跳过一步错误,后面的数字可变
set global sql_slave_skip_counter =1;
start slave;
之后再用mysql> show slave status\G 查看:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
ok,现在主从同步状态正常了。。。
方式二:重新做主从,完全同步
该方法适用于主从库数据相差较大,或者要求数据完全统一的情况
解决步骤如下:
1.先进入主库,进行锁表,防止数据写入
使用命令:
mysql> flush tables with read lock;
注意:该处是锁定为只读状态,语句不区分大小写
2.进行数据备份
#把数据备份到mysql.bak.sql文件
[root@server01 mysql]#mysqldump -uroot -p -hlocalhost > mysql.bak.sql
这里注意一点:数据库备份一定要定期进行,可以用shell脚本或者python脚本,都比较方便,确保数据万无一失
3.查看master 状态
mysql> show master status;
+-------------------+----------+--------------+-------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+-------------------------------+
| mysqld-bin.000001 | 3260 | | mysql,test,information_schema |
+-------------------+----------+--------------+-------------------------------+
1 row in set (0.00 sec)
4.把mysql备份文件传到从库机器,进行数据恢复
#使用scp命令
[root@server01 mysql]# scp mysql.bak.sql root@192.168.128.101:/tmp/
5.停止从库的状态
mysql> stop slave;
6.然后到从库执行mysql命令,导入数据备份
mysql> source /tmp/mysql.bak.sql
7.设置从库同步,注意该处的同步点,就是主库show master status信息里的| File| Position两项
change master to master_host = '192.168.128.100', master_user = 'rsync', master_port=3306, master_password='', master_log_file = 'mysqld-bin.000001', master_log_pos=3260;
8.重新开启从同步
mysql> stop slave;
9.查看同步状态
mysql> show slave status\G 查看:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
验证主从
主库创建任何数据,从库随即更新!
结构模式-----各种不同的结构模式上面的为一主一从(多从)
--结构模式
基本应用
单向复制:主-->从
扩展应用
链式复制:主-->从-->从 #主从从
互为主从:主<-->主 #不能同时被访问,不能单独使用
一主多从:从<--主-->从
1)一主多从
[root@mysql-51 ~]# mysqldump -uroot -p123456 db1 > db1.sql
[root@mysql-51 ~]# scp db1.sql 192.168.4.53:/root
mysql> create database db1; #53主机
mysql> source /root/db1.sql; #可以直接执行sql语句
[root@mysql-53 ~]# mysql -uroot -p123456 db1 < db1.sql
[root@mysql-53 ~]# vim /etc/my.cnf
[mysqld]
server_id=53
[root@mysql-53 ~]# systemctl restart mysqld
mysql> change master to
-> master_host="192.168.4.51",
-> master_user="repluser",
-> master_password="123456",
-> master_log_file="master51.000005",
-> master_log_pos=574;
mysql> start slave;
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.4.51
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master51.000005
Read_Master_Log_Pos: 574
Relay_Log_File: mysql-53-relay-bin.000002
Relay_Log_Pos: 319
Relay_Master_Log_File: master51.000005
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
2)主从从
#延续上面的实验
[root@mysql-52 mysql]# vim /etc/my.cnf #设置52即为从又为主库
[mysqld]
log_bin=master52
binlog_format="mixed"
server_id=52
Log_slave_updates #记录从库更新,允许链式复制
[root@mysql-52 mysql]# systemctl restart mysqld
mysql> show master status\G;
*************************** 1. row ***************************
File: master52.000001
Position: 154
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
mysql> grant replication slave on *.* to repluuser@'%'
-> identified by '123456';
配置53的主库是52
mysql> change master to
-> master_host="192.168.4.52",
-> master_user="repluser",
-> master_password="123456",
-> master_log_file='master52.000001',
-> master_log_pos=442;
mysql> start slave;
注意:
Slave-io线程读取主库中binlog日志放入中继日志(relay-log),slave-sql线程在执行中继日志的语句时是不写入binlog日志中,需要添加Log_slave_updates才能写入binlog日志中
3)互为主从
主机54:
[root@mysql-54 ~]# vim /etc/my.cnf
[mysqld]
log_bin=master54
server_id=54
binlog_format="mixed"
[root@mysql-54 ~]# systemctl restart mysqld
mysql> grant replication slave on *.* to masteruser@'%' identified by '123456';
mysql> show master status\G;
*************************** 1. row ***************************
File: master54.000001
Position: 443
....
mysql> change master to \
-> master_host='192.168.4.55',
-> master_user='masteruser2',
-> master_password='123456',
-> master_log_file='master55.000001',
-> master_log_pos=444;
mysql> start slave;
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.4.55
Master_User: masteruser2
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master55.000001
Read_Master_Log_Pos: 444
Relay_Log_File: mysql-54-relay-bin.000002
Relay_Log_Pos: 319
Relay_Master_Log_File: master55.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
主机55:
[root@mysql-55 ~]# vim /etc/my.cnf
[root@mysql-55 ~]# systemctl restart mysqld
mysql> grant replication slave on *.* to masteruser2@'%' identified by '123456';
mysql> show master status\G;
*************************** 1. row ***************************
File: master55.000001
Position: 444
.....
mysql> change master to\
-> master_host="192.168.4.54",
-> master_user="masteruser",
-> master_password="123456",
-> master_log_file='master54.000001',
-> master_log_pos=443;
mysql> start slave;
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.4.54
Master_User: masteruser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master54.000001
Read_Master_Log_Pos: 595
Relay_Log_File: mysql-55-relay-bin.000002
Relay_Log_Pos: 471
Relay_Master_Log_File: master54.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
标签:主库,slave,master,mysql,docker,root,主从 From: https://www.cnblogs.com/Irving10/p/16828297.html