概念
MySQL支持主从库的机制,所谓主从库的机制就是将数据库进行克隆,从库同步主库的变更,二者行为同步。
原理
当主库开启了二进制日志文件binlog
的功能之后,主库数据的变更会将其写到binlog
文件中去。从库去订阅主库的binlog
文件,通过IO进程将主库binlog
文件的变更同步到从库的RelayLog
中继日志中去,再由从库的线程将中继日志中的信息同步至从库数据库。
优势
- 一个主库可以有多个从库,可以大大降低主库的压力
- 一个从库也可以作为主库,因此MySQL集群可以做成树状的形式
- 可以在从库执行读操作,主库执行写操作再同步从库,从而实现读写分离
- 主库出现故障的时候,从库可以顶上
- 数据库备份这种比较耗费性能的操作可以在从库执行
操作
主库操作:
- 前往
my.cnf
MYSQL配置文件中进行如下配置:# MYSQL服务ID,集群环境中唯一标识符 server-id=1 # 指定binlog文件的存放路径 log-bin=/var/lib/mysql/mysqlbin # 是否只读:1只读,0读写 read-only=0 # 不需要同步的数据库(一般mysql这种默认库不需要同步) binlog-ignore-db=mysql
- 重启主库MYSQL服务:
service mysql restart;
- 进入mysql:
mysql -u 用户名 -p密码;
- 创建同步数据的账户并进行授权操作
(创建用户时如果有遇到提示密码不符合密码策略的,可以参考这篇博客修改:【修改MYSQL密码策略】)# 创建一个账户test,密码是test11,ip是192.168.1.100 create user 'test'@'192.168.1.100' identified by 'test11'; # 授权该账号权限为主从同步,可以同步的数据库与表为*.*也就是全部 grant replication slave on *.* to 'test'@'192.168.1.100'; # 刷新权限 flush privileges;
- 查看主库状态:
show master status;
从库操作:
如果从库是window系统下的,其实操作也大同小异,可以参考这一篇博客的:【MySQL主从复制(linux主+windows从)】
- 前往
my.cnf
MYSQL配置文件中进行如下配置:# MYSQL服务ID,集群环境中唯一标识符 server-id=2 # 指定binlog文件的存放路径 log-bin=/var/lib/mysql/mysqlbin
- 重启从库mysql服务:
restart mysql service;
- 进入mysql:
mysql -u 用户名 -p密码;
- 设置主库:
change master to master_host= '主库IP', master_user='主库同步账号', master_password='主库同步账号的密码', master_log_file='推送的日志文件', master_log_pos=推送日志的位置;
(后两个参数来自于主库show master status
的查询结果,最后一个参数是数值,注意不要加引号) - 开启主从同步操作:
start slave;
- 检测是否开启主从同步:
show slave status \G;
,Slave_IO_Running 和 Slave_SQL_Running 均为YES即表示主从已开启。
需要注意的是:主从复制只能保证开启主从复制之后的数据做同步,举例主库存在test
数据库,从库什么都没有,主库向test数据库的test01
表插入一条数据从库同步的时候是会报错的,因为从库没有这个数据库更没有这张表!!因此开启主从前最好是两个数据库处于初始状态,或者说从库是由主库的最新一次备份恢复而来的,保证开启前主从库数据同步!
文章内容来源于黑马程序员的视频观后总结