原理场景:MySQL从3.23版本开始提供复制功能。指的是将主数据库的DDL和DML操做经过二进制日志传到从服务器(也叫从库),而后在从库上对这些日志从新执行,html
从而使得从库和主库的数据保持同步。mysql
优势:若是主库出现问题,能够快速切换到从库提供服务;sql
能够在从库上执行查询操做,下降主库的访问压力;数据库
能够在从库上执行备份,以避免备份期间影响主库的服务;centos
测试环境: 2台最小化安装的centos7.2缓存
具体操做:服务器
1. 安装相同版本的mysqlsession
可参考以前的文章:http://www.cnblogs.com/ding2016/p/6756941.htmlide
2. 主(master)服务器配置函数
① 在my.cnf中的[mysqld]下新增以下项目:
server_id=200 # 设置server_id,通常设置为IP;
binlog-do-db=cnblogs # 复制过滤:须要备份的数据库,输出binlog(这里我假设值备份cnblogs这个数据库);
#binlog-do-db=db2 #若是要同步多个,另起一行,再加一条
#binlog-do-db=db3 #同上
binlog-ignore-db=mysql # 复制过滤:不须要备份的数据库,不输出(mysql库通常不一样步);
log-bin=master-bin # 开启二进制日志功能,能够随便取,最好有含义;
binlog_cache_size=1M # 为每一个session 分配的内存,在事务过程当中用来存储二进制日志的缓存;
binlog_format=mixed # 主从复制的格式(mixed,statement,row,默认格式是statement);
expire_logs_days=7 # 二进制日志自动删除/过时的天数。默认值为0,表示不自动删除;
slave_skip_errors=1062 # 跳过主从复制中遇到的全部错误或指定类型的错误,避免slave端复制中断。
如:1062错误是指一些主键重复,1032错误是由于主从数据库数据不一致;
log_bin_trust_function_creators=true # 若是须要同步函数或者存储过程;
保存,退出;
补充说明:主从复制格式
(1) 基于语句的复制:在Master上执行的SQL语句,在Slave上执行一样的语句,MySQL默认采用基于语句的复制,效率比较高,
一旦发现无法精确复制时,会自动选着基于行的复制;
(2) 基于行的复制:把改变的内容复制到Slave,而不是把命令在Slave上执行一遍。从MySQL5.0开始支持;
(3) 混合类型的复制:默认采用基于语句的复制,一旦发现基于语句的没法精确的复制时,就会采用基于行的复制;
② 重启数据库
~]#systemctl restart mysql
③ 从新登入mysql并作相关受权
~]#mysql -uroot -p
mysql>create user mysql@'%' identified by 'mysql';
mysql>grant all on *.* to mysql@'%'; 这里可根据本身的数据库和权限进行设置;
mysql>grant replication slave, replication client on *.* to 'mysql'@'158.158.41.201' identified by 'mysql';
mysql>flush privileges;
mysql>show master status;
注意:记住上图蓝框标出的两个数值,由于在配置slave时会用到,每次从新配置都会改变。
3. 从(slave)服务器配置
① 在my.cnf中的[mysqld]下新增以下项目:
server_id=201 slave的ip作id;
binlog-do-db=cnblogs 与master相对应(换成本身的需求定义);
binlog-ignore-db=mysql 与master相对应;
#log-bin=slave1-bin 先注释掉,能够先不加;
binlog_cache_size=1M
relay_log=mysql-relay-bin 配置中继日志;
log_slave_updates=1
read_only=1
保存,退出;
补充说明:
(1)若是Slave为其它Slave的Master时,必须设置bin_log;
(2)log_slave_updates表示slave将复制事件写进本身的二进制日志;
(3)当设置log_slave_updates时,你可让slave扮演其它slave的master;
此时,slave把SQL线程执行的事件写进行本身的二进制日志(binary log),而后,它的slave能够获取这些事件并执行它;
② 重启从服务器mysql
~]#systemctl restart mysql
③ 从新登陆mysql
~]#mysql -uroot -p
mysql> change master to master_host='158.158.41.200',master_user='mysql',master_password='mysql',
master_port=3306,master_log_file='master-bin.000001',master_log_pos=708,master_connect_retry=30;
上图蓝色标志处就是以前再主上“show master status;”后获得的重要数据,写进去便可。
④ 开启主从同步
mysql>start slave;
⑤ 重看主从状态
mysql>show slave status \G
一切正常,一切就绪。
4. 测试主从同步
在master上新增cnblogs,查看slave上是否同步新增:
结束.