一、基础:
1.复制主要有3点好处
1)实现在不同服务器上的数据分布,可以将数据读取进行负载均衡;
2)增强了数据安全性,减少主库的connections,可以实现数据高可用和故障切换;
3)实现数据库在线升级
2.二进制日志3种格式
1)STATEMENT格式
优点:日志记录量相对较小,节约磁盘及网络I/0;
缺点:对UUID(),USER(),这样的函数存在BUG
2)ROW格式
优点:使MySQL主从复制更加安全
缺点:记录日志量较大
3)MIXED格式
根据SQL语句由系统决定是基于段还是基于行来进行复制
推荐使用:binlog_format=row
3.MySQL复制原理(直接上图)
1)主将变更写入二进制日志;
2)从读取主的二进制日志变更,并写入到relay_log中;
3)在从上重放relay_log中的日志,如果基于段的复制,则在从上重新执行记录的SQL。如果基于行的复制,则在从库上直接对数据库进行修改;
4.基于GTID复制的优缺点
1)什么是GTID
GTID即全局事务ID,其保证为每一个在主上提交的事务在复制集群中可以生成一个唯一的ID
GTID=source_id:transaction_id
2)优点:可以很方便的进行故障转移,从库不会丢失主库上的任何修改
3)缺点:故障处理比较复杂,对执行的SQL有一定的限制
二、部署
环境:一主一从
主IP:192.168.20.206
从IP:192.168.20.212
需要3个步骤:
1.修改主库的my.cnf参数,并创建复制账户,备份出数据库数据,导入到从库中;
2.修改从库的my.cnf参数,导入备份数据;
3.在从库中执行使用change master 、start slave命令搞定
1.1)修改主库my.cnf文件
vim /etc/my.cnf
[mysqld]
server_id = 1
#: for binlog
binlog_format = row
log_bin = /data/mysql/mysql3306/logs/mysql-bin
binlog_rows_query_log_events = on
log_slave_updates = on
expire_logs_days = 7
binlog_cache_size = 65536
sync_binlog =1
slave-preserve-commit-order =ON
#: for gtid
gtid_mode = on
enforce_gtid_consistency = on
1.2)重启MySQL服务
service mysqld restart
1.3)创建复制用户
create user 'repl'@'192.168.20.%';
grant replication slave on *.* to 'repl'@'192.168.20.%' identified by '666666';
flush privileges;
1.4)备份数据,导入到从库中
mysqldump -uroot -p --master-data=2 --events --single-transaction --routines --triggers -S /tmp/mysql3306.sock -A -B >/opt/all.sql
scp all.sql 192.168.20.212:/opt/
2.1)修改从库my.cnf文件
[mysqld]
server_id = 2
#: for binlog
binlog_format = row
log_bin = /data/mysql/mysql3306/logs/mysql-bin
binlog_rows_query_log_events = on
log_slave_updates = on
expire_logs_days = 7
binlog_cache_size = 65536
sync_binlog =1
slave-preserve-commit-order =ON
#: for gtid
gtid_mode = on
enforce_gtid_consistency = on
2.2)重启MySQL服务
service mysqld restart
2.3)在从库清空二进制日志,记住是在从库执行,需要反复确认,慎用!
reset master;
2.4)将备份数据导入到从库中
mysql -uroot -p -S /tmp/mysql3306.sock
3.1)在从库中执行change master语句
change master to master_host='192.168.20.206',master_user='repl',master_password='666666',master_auto_position=1;
3.2)在从库中执行start slave;
start slave;
如果执行show slave status \G
出现这样的两个Yes
搞定!