mysql主从复制的三种模式(binlog的三种模式)
主从复制的模式
STATEMENT模式(SBR)
每一条修改数据库的语句都会被记录到binlog中
优点是不会记录每一条sql语句和每一行的数据变化,减少了bin-log的日志量 节约IO 提高性能
缺点是某些情况下会导致主从数据不一致
ROW模式(PBR)
不记录sql语句的上下文信息,仅仅记录那条数据被修改了,不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发无法被正确复制的问题。缺点是会产生大量的日志,尤其是altertable的时候会让日志暴涨
MIXED模式(MBR)
以上两种模式的混合,一般的复制使用SBR模式保存binlog,对于SBR无法复制的操作使用PBR保存binlog
mysql会根据执行的语句选择日志保存方式,建议使用
模式的配置使用
修改主库的配置
binlog_format=MIXED | ROW | STATEMENT
重启
查看主从复制的模式
mysql> show variables like "%binlog_format%";
命令行切换主从复制binlog模式
mysql> set global binlog_format='MIXED';
2,主从复制
mysqldump -uroot -p123 --routines --single_transaction --master-data=2 --databases weibo > weibo.sql
参数说明:
--routines:导出存储过程和函数
--single_transaction:导出开始时设置事务隔离状态,并使用一致性快照开始事务,然后unlock tables;而lock-tables是锁住一张表不能写操作,直到dump完毕。
--master-data:默认等于1,将dump起始(change master to)binlog点和pos值写到结果中,等于2是将change master to写到结果中并注释。
- 从库导入备份库
mysql -uroot -p123 -e 'create database weibo;'
mysql -uroot -p123 weibo < weibo.sql
- 在备份文件weibo.sql查看binlog和pos值
head -25 weibo.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=107; #大概22行
从库设置从这个日志点同步,并启动
mysql> change master to master_host='192.168.18.212',
-> master_user='sync',
-> master_password='sync',
-> master_log_file='mysql-bin.000001',
-> master_log_pos=107;
mysql> start slave;
mysql> show slave status\G;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 90
Current database: NONE
1. row **
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.18.212
Master_User: sync
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 358
Relay_Log_File: mysqld-relay-bin.000003
Relay_Log_Pos: 504
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes