基于日志点
主从服务器配置
直接yum安装的,所以数据库的配置文件是/etc/my.cnf
log_bin: 自定义二进制日志存储的路径,默认是和mysql数据库文件存储在一起的
server-id: 服务器ID,保证集群中唯一,所以在上面的从服务器中的server-id必须改成不一样的
relay_log = : 中继日志存储路基,启动主从复制的时候,这个参数默认启动,但是依然需要手动设置,因为这个参数默认情况下是主机的名字,如果修改了主机名字,重启从服务器,可能就会报找不到中继链路的错误,从而终端主从复制链路.所以得把这个参数的名字固定
read_only: 安全性参数,可以阻止没有super权限的用户进行写操作,强烈建议开启
super_read_only: 限定super权限的用户的数据修改操作,mysql版本大于等于5.7可用
skip_slave_start: slave重启后自动启动复制链路,开启后不会自动启动
master_info_repository = TABLE;relay_log_info_repository = TABLE: 把主从服务器的信息储存到innodb表中,默认情况下是存在文件系统系统中
ps: 日志存放路径必须对MySQL服务器启动账号有写入权限,我这里是将日志存放的目录所有者给了mysql账号( chown -R mycat:mysql mysql/)
配置成功后执行systemctl start mysqld就可以了
在主服务器上建立复制账号
账号作用: 用于从服务器的IO进程链接到主服务器上,获取新的二进制日志,所以这个账号只需要一个REPLICATION SLAVE权限
1和3分别是创建账号和为账号授权(用'%'允许所有ip都能登录只是为了方便,正式的可以设置对应网段或具体IP)
2: 是一个错误的操作,我本意是只想设置主从复制只作用'mkw_shop'这一个数据库,但是权限replication slave 的级别是global,所以不能只作用于某一数据库,而是全局.要实现的话,需要在配置文件中配置添加(binlog-do-db=mkw_shop),他的意思就是让主服务器只记录这个数据的二进制文件,这样同步到从服务器的的也就只要一个裤了,这里就是弄了
初始化slave数据
进入一个备份的目录,执行下面备份数据库命令
mysqldump -uph -p --single-transaction --master-data --triggers --routines --all-databases > all.sql
ps: 线上数据库不要用这个备份,会锁表,可以用xtrabackup这个工具,后面单独写一个文章介绍
然后将备份的all.sql文件拷贝到从服务器上
然后在从服务器上使用下面命令恢复数据备份
mysql -u root -p < all.sql
从库上复制链路的配置
change master to master_host='主机IP地址',master_user='dbmaster_repl',master_password='Repl123456.',MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=603;
最后两个参数 MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=603;可以在备份的日志中找到,也可以在主服务器中使用"show master status \G;"这个命令直接查看.
启动复制链路 start slave; 查看复制链路是否启动成功show slave status \G;
验证: 在主服务器中修改添加几条数据,看看是否在从服务器中生效
基于GTID
基于DTID的复制和步骤和前面基于日志点的差不多,就简单记录解释一下不同的地方
停止并删除原来的复制链路
stop slave; 停止
reset slave all; 删除
主从服务器配置
gtid_model = on 开启gtid模式
enforce_gtid_consistency: 强制gtid一致性,启动后保证事物的安全
说明: log_slave_updates, 这个参数(在mysql 5.7之前要使用gtid模式,就必须开启),如果集群是链路集群(从服务器下面还有从服务器),这个时候这个参数就是必须
在主服务器上建立复制账号
因为在上面基于日志点的时候已经建立了,所以这里不需要建立,可以通过下图方式查看其授权
初始化slave数据
和前面操作完全一样,如果报错提示不能写入的话,可以先把配置文件中的super_read_only关闭,等数据导入成功了,在set global的方式打开
从库上复制链路的配置
change master to master_host='主机IP地址',master_user='dbmaster_repl',master_password='Repl123456.',master_auto_position=1;
和前面一样差不多,改变最后一行最关键的就可以了