MySql实现主从热备和读写分离

1、主从配置需要注意的地方

1、主DB server和从DB server数据库的版本一致
2、主DB server和从DB server数据库数据一致[ 这里就会可以把主的备份在从上还原,也可以直接将主的数据目录拷贝到从的相应数据目录]
3、主DB server开启二进制日志,主DB server和从DB server的server_id都必须唯一

本次测试环境在windows8.1下,mysql版本是5.7.18

教程开始:
第一步,做基本操作
1.) 在主(master)数据库上执行 select version(); 查看mysql版本号,在从(slave)数据库上执行 select version(); 查看mysql版本号,看是否是一致的!
2.) 在主(master)数据库上执行 show variables like 'log_%';  查看主(master)是否开启binlog 。看log_bin 这一栏是不是ON (ON代表开启)如果没有开启就开启,开启方法如下:
找到"C:\ProgramData\MySQL\MySQL Server 5.7\my.ini" 在my.ini的 [mysqld]下 添加一个binlog配置就可以了(注意一定要加在[mysqld]下,如果加在[mysqld_safe]或其他位置下是不行的)如下:
log_bin=master_mysql_3306_bin

3.) 在主(master)数据库上创建一个shallowmemory数据库。 在从(slave)数据库上创建一个shallowmemory数据库 (这个教程就不写了,很简单)


第二步、在主(master)数据库配置: 找到:"C:\ProgramData\MySQL\MySQL Server 5.7\my.ini"  在my.ini修改如下,如果没有就添加这些配置
#开启主从复制,主库的配置
log_bin=master_mysql_3306_bin
#指定主库serverid,一般用ip末尾作为serverid
server-id=136
#指定同步的数据库,如果不指定则同步全部数据库
binlog-do-db=shallowmemory

第三步、执行SQL语句查询状态:如下图,记录Position的值, 需要在从库中设置同步起始值。同时也注意看一下File下的binlog文件名,就是这个: master_mysql_3306_bin.000001
SHOW MASTER STATUS;
第四步 、 在主数据库创建同步用户
#授权用户slave01使用root密码登录mysql,注意192.168.1.172指定的是从数据库的ip地址
grant replication slave on *.* to 'slave01'@'192.168.1.172'identified by 'root';
# 刷新MySQL的系统权限相关表
flush privileges;
第五步、 在从(slave)数据库配置, 找到:"C:\ProgramData\MySQL\MySQL Server 5.7\my.ini"  在my.ini修改如下,如果没有就添加这些配置
#指定serverid,只要不重复即可,从库也只有这一个配置, 其他都在SQL语句中操作
server-id=172
第六步、在从(slave)数据库执行sql:
CHANGE  MASTER  TO
 master_host='192.168.1.136',# 这里写主master数据库的ip
 master_user='slave01',# 这里写刚刚在主master数据库分配的用户名
 master_password='root', # 这里写刚刚在主master数据库分配的密码
 master_port=3306, # 这里写刚刚在主master数据库端口
 master_log_file=' master_mysql_3306_bin.000001 ', # 这里写 主master数据库生成的binlog文件 。位置在: C:\ProgramData\MySQL\MySQL Server 5.7\Data\下面
 master_log_pos=7946; # 这里写刚刚在主master数据库中记录的 Position的值
第七步、在从(slave)数据库 执行sql:
#启动slave同步
START SLAVE;
#查看同步状态  如果Slave_IO_Running 和 Slave_SQL_Running都是Yes代表成功
SHOW  SLAVE STATUS;


现在我们在主(master)数据库中新建一张表,从(slave)数据库中也会新建一张表,
我们在 主(master)数据库新增一条记录,然后到从(slave)数据库中刷新,数据已经同步过来了。
并且 主(master)数据库只要执行update、insert、delete,从(slave)数据库都会同步过来了

需要在从数据库中关闭 slave;sql语句是: stop slave; #停止同步 
start slave    #开始同步,从日志终止的位置开始更新。 

常见问题错误以及解决方法:
1、 执行[SQL] CHANGE MASTER TO
 master_host=' 192.168.1.136  ',
 master_user='slave01',
 master_password='root',
 master_port=3306,
 master_log_file='master_mysql_3306_bin.000001',
 master_log_pos=10209;
[Err] 3021 - This operation cannot be performed with a running slave io thread; run STOP SLAVE IO_THREAD FOR CHANNEL '' first.
这是因为 slave 正在运行
解决方式是 :我们关闭掉就可以了 在从slave数据库执行sql:stop slave;  然后再次执行上面的sql就不会报错了


2、 有时候配置不成功, Slave_IO_Running这里是NO ,原因多半是 master_host的 ip写错或者是密码用户名写错, 出现Slave_IO_Running:NO还有一个原因是slave上没有权限读master上的数据。
解决方式是:在从(slave)数据库执行sql: stop slave;
修改正确的ip和用户名密码
CHANGE  MASTER  TO
 master_host='192.168.1.136',# 这里写主master数据库的ip
 master_user='slave01',# 这里写刚刚在主master数据库分配的用户名
 master_password='root', # 这里写刚刚在主master数据库分配的密码
 master_port=3306, # 这里写刚刚在主master数据库端口
 master_log_file=' master_mysql_3306_bin.000001 ', # 这里写 主master数据库生成的binlog文件 。位置在: C:\ProgramData\MySQL\MySQL Server 5.7\Data\下面
 master_log_pos=7946; # 这里写刚刚在主master数据库中记录的 Position的值
然后再执行sql
Slave_IO_Running就变成Yes了
但是 SHOW  SLAVE STATUS;再次查看状态时 Slave_SQL_Running又变成NO,原因是主(master)的 Position的值已经变了
解决方式是在主 (master) 据库执行sql: show MASTER status;查看 Position的值 ,再次修改从数据库中 Position的值 执行就可以了

注意,这样只能在主数据库增删改数据,不能再从数据库增删改,比如以下场景:
在从数据库新增一个数据  id是1 name是张三
然后在主数据库新增一个数据id是1 name是李四。这样就会出现问题,再次在从数据库执行sql查看状态
SHOW  SLAVE STATUS;
会发现 Slave_SQL_Running是NO 了。建议是从库也可以同步到主数据库

实现 主---主互相复制实际只是把上面的例子反过来再做一遍。我自己也测试过 也是可以的



你可能感兴趣的:(MySql实现主从热备和读写分离)