基本原理:master一个io将操作写入binlog,slave的一个io读取master的binlog,写入中继日志,然后通过一个sql线程将日志写入slave的数据库
系统 centos7 数据库mysql5.7
由于个人隐私问题所以这里ip地址和数据库用户名都用以下称号来替代:
主机 IP:ip1 数据库账号:r1 密码:123456
从机 IP:ip2 数据库账号:r2 密码:123456
在r1数据库中执行以下命令
grant replication slave on *.* to 'r2'@'ip2' identified by '123456';
# 给主机添加从机
配置主机的config文件 一般来说 默认在 /etc/my.cnf 加入以下几行
server-id = 1
#id不要和从机重复
log-bin=/var/log/mysql/mysql-bin
# binlog的位置
binlog-do-db = test
#记录日志的数据库
(坑1 :这里我要主从test数据库 test后别有空格 否则mysql会将空格加上变成test 会导致master进行操作而binlog的pos不变)
binlog-ignore-db = mysql
#不记录日志的数据库
配置从机的config文件 在 /etc/my.cnf 加入以下几行
server-id = 2
log-bin=/var/log/mysql/mysql-bin
replicate-do-db = test
replicate-ignore-db = mysql,information_schema,performance_schema
重启r1数据库生效配置文件
service mysqlq restart
# 坑2 :这时候大概率会因为没有/var/log/mysql/mysql-bin文件夹而重启失效
# 这时候就需要我们建立这个文件并授权
mkdir /var/log/mysql
touch /var/log/mysql/mysql-bin.index
chmod 777 /var/log/mysql
chmod 777 /var/log/mysql/mysql-bin.index
重启r2数据库生效配置文件
service mysqlq restart
mkdir /var/log/mysql
touch /var/log/mysql/mysql-bin.index
chmod 777 /var/log/mysql
chmod 777 /var/log/mysql/mysql-bin.index
在r1数据库查看正在进行备份binlog文件
show master status;
# 第一次开启binlog都是mysql-bin.000001开始的
进入r2数据库执行以下命令
change master to master_host='ip1',master_user='r1',master_password='123456', master_log_file='mysql-bin.000001',master_log_pos=0;
# pos=0是开始的行数
start slave;
#然后开启服务
show slave stauts\G;
'''
坑3 :可能有时候没开启成功,会导致数据不同步
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
这两行为yes一个是io负责获取主机的binlog sql负责将binlog写入从机
'''
ps:如何逐步判断主从不复制
- 首先判断主机binlog是否正常可以写入 不可以可能是由于binlog_do_db的配置数据库名称不对
- 判断从机io进程是否是yes照常执行
- 判断从机sql进程是否是yes照常执行