文章目录
结合上篇源码编译安装创建得数据库实例,现在测试msyql5.7.10主从复制功能
壹,在主服务器上
主服务器:192.168.6.241
从服务器:192.168.6.242
参考得博文
壹-壹:开启bin-log
cat /etc/my.cnf
[mysqld]
server-id=1 ###注意正式网络环境中server-id 唯一
log-bin=/henanzhengzhou/mysql/logdir/binlog
壹-贰:重启服务,并检查bin-log是否开启
~]# systemctl restart mysqld
mysql> show variables like ‘%log_bin%’;
壹-叁:在master主服务器上设置复制使用账号,并设置REPLICATION SLAVE权限
mysql> grant replication slave on *.* to 'rep1'@'192.168.6.242' identified by '123';
mysql> grant replication slave on *.* to 'rep1'@'%' identified by '123'; #要求比较严得话,这条可以不用执行
贰,在从服务器上
relay_log_recovery={0|1}:紧随服务器启动立即启用自动中继日志恢复。默认值是0,禁用。
预设从服务器只作备份数据库使用
my.cnf 配置
[mysqld]
max_connections = 1000
log_bin = slave-bin #开启bin-log日志
server_id = 2
relay_log = slave-relay-bin # 开启中继日志
log_slave_updates = 1
read_only = 1
#以下两个为可选选项,如果要保证数据不丢失最好在清理binlog之前把要清理的日志备份,日志文件的大小根据磁盘的性能做适当的调整
expire_logs_days = 7 //binlog过期清理时间
max_binlog_size = 100m //binlog每个日志文件大小
replicate_ignore_db=information_schema #忽略不复制得库
replicate_ignore_db=performance_schema #忽略不复制得库
replicate_ignore_db=mysql #忽略不复制得库
replicate_ignore_db=sys #忽略不复制得库
replicate_do_db=test #可以复制得库
replicate_do_table=test.a #可以复制得表
replicate_ignore_table=test.b #不允许复制得表
重启mysql服务
systemctl restart mysqld
flush tables with read lock; # 锁表语句
为了保证数据一致性,主服务器需要设定锁定有效,这个操作为了确保没有数据库操作,以便获得一致性得快照,备份后还原到从服务器上,
show master status \G #查询主机二进制日志名和偏移值
unlock tables; # 备份后主数据库恢复写操作
进入从服务器:
mysql> stop slave ; #停止从机上得slave 线程
对从服务设置主服务器上得配置
mysql> change master to
master_host=‘192.168.6.241’,
master_user=‘rep1’,
master_password=‘123’,
master_port=3307,
master_log_file=‘binlog.000007’,
master_log_pos=578;
########## master_connect_retry=30; #重试时间、单位秒,默认重试时间为 60s
start slave ; #在从机上启动slave 线程
show slave status \G # 查询从机服务器得状态
上边得两个进程一定是yes ,不然主从复制没戏
下面这条语句 延申得以备配置错误
mysql> reset slave all; #清理掉之前的配置,防止同步已经同步了的数据
叁: 验证主从复制
叁-壹 ,重置数据库使主从数据库服务器一致
叁-贰 ,停止从机slave 进程
mysql> stop slave ;
设置复制基本信息:
叁-叁 ,开启从机slave进程
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
叁-肆,查看从机slave进程状态
show slave status \G
叁-伍,在主机上创建数据库、表并插入数据,检查是否主从数据一致
肆,搭建主从复制时,报错示例
Table’mysql.servers’doesn’t exist
在搭建mysql主从复制时,遇到的一个报错。在执行flush privileges命令时提示 mysql.servers表不存在
mysql> flush privileges;
ERROR 1146 (42S02): Table 'mysql.servers' doesn't exist
因为是一个刚建立的实例,表中没有任何数据,又新建一个实例,找到对应系统自带得创表语句,在执行建表语句时,又提示表空间存在这个表
ERROR 1813 (HY000): Tablespace '`mysql`.`servers`' exists.
瞬间来了兴致,一番百度,找到了问题所在,在对应得表得数据目录下一般会同时存在如下两个文件,不知某种原因导致其中一个文件丢失,在执行语句时,才会出现这种问题,5.7.10版得直接停掉服务,删除对应得残留文件,再重新走一遍建表语句,问题顺利解决
参考文章
- 1, .frm 文件 数据表定义信息
- 2 ,.ibd 文件 数据表内容
肆:主从服务架构图
肆-壹,MySQL主从复制简介
MySQL主从复制(也称A/B复制、Replication),简单讲就是A和B两台机器做主从后,在A上写数据,另外一台B也会跟着写数据,两者数据实时同步。
MySQL主从是基于binlog的,主上须开启binlog才能进行主从。
主从过程大致分为三个步骤:
1)主将更改操作记录到binlog里;
2)从将主的binlog事件(SQL语句)同步到从本机上,并记录在relaylog里;
3)从根据relaylog里面的SQL语句按顺序执行;
主上有一个log dump线程,用来和从的I/O线程传递binlog
从上有两个线程,其中I/O线程,用来同步主的binlog并生成relaylog,另外一个SQL线程用来把relaylog里面的SQL语句落地