⒈关于主从复制的原理:
简单的来讲就是slave上一个io线程去取binlog事件,一个sql线程将binlog事件重放至slave上
⒉关于复制账号权限
mysql的主服务器需要有replication slave的权限
当然在实际环境中,我们需要监控和管理复制,所以需要有replication client权限
另外如果需要主备切换的,就需要主从都具有replication slave与replication client的权限
实际操作:GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO repl@'192.168.101.%' IDENTIFIED BY 'tianqu';
⒊关于复制的方式(binlog_format)
基于语句的复制:通俗一点就是sql语句复制,好处:不会使用大量带宽(为什么?一条更新好几M的数据,binlog中就几十字节) 缺点:有存在无法复制的sql语句,存储过程、触发器的复制也可能存在问题。
基于行的复制:通俗一点就是物理复制,表中数据基于行复制。优点:能解决语句复制的缺点 缺点:复制数据多,不好检测复制中问题。
混合复制:结合两者的优点,能用语句复制的采用语句,其他则基于行的复制
具体的参数设置请看核心三处
⒋关于复制的参数
⑴核心参数(主库)
#指定log_bin,开启二进制,默认在data目录下
log_bin = /var/lib/data/mysql-bin
#指定sever_id的一个作用是标识sql产生的源主机,防止重复复制,所以两边的server_id必须不一致
server_id=10
#复制方式
binlog_format='MIXED'
mysql> select @@binlog_format;
+-----------------+
| @@binlog_format |
+-----------------+
| STATEMENT |
+-----------------+
1 row in set (0.00 sec)
⑵核心参数(备库)
#指定log_bin,开启二进制,默认在data目录下
log_bin = /var/lib/data/mysql_bin
#指定sever_id的一个作用是标识sql产生的源主机,防止重复复制,所以两边的server_id必须不一致
server_id=10
#复制方式
binlog_format='MIXED'
mysql> select @@binlog_format;
+-----------------+
| @@binlog_format |
+-----------------+
| STATEMENT |
+-----------------+
1 row in set (0.00 sec)
#指定中继日志的位置
relay_log=/var/lib/mysql-relay-bin
⑶主库复制其他参数
#该参数控制binlog在事务提交前将二进制日志同步到磁盘,该参数最好设置,防止丢失事务
sync_binlog=1
#过滤主库上面的二进制,这两个参数在环境中强烈建议不使用,有可能导致某个时间的数据恢复失败。
binlog_do_db与binlog_ignore_db
⑷备库的其他参数
#防止备库在崩溃后,启动自动复制
skip_slave_start
#允许备份重放的事件重放到二进制日志中,从库带从库是必须的选项
log-slave-updates = 1
#其他刷新到磁盘的文件,如果对性能不是很看重,可以配置如下参数,默认是不调用fsync的
sync_master_info =1
sync_relay_log =1
sync_relay_log_info=1
#中继日志中关于mysql库操作的数据不进行重放
replicate-wild-ignore-table=mysql%
⒌关于主备配置文件
主备库的一个基本配置
主库:
log_bin = /var/lib/data/mysql-bin
server_id=10
binlog_format='MIXED'
sync_binlog=1
备库(从库带从库情况下)
log_bin = /var/lib/data/mysql-bin
server_id=8
binlog_format='MIXED'
relay_log=/var/lib/mysql_relay_bin
sync_binlog=1
skip_slave_start
Replicate_Wild_Ignore_Table=mysql.%
⒍配置主从复制
主备库创建复制账号
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO repl@'192.168.101.%' IDENTIFIED BY 'tianqu';
备库上:
CHANGE MASTER TO MASTER_HOST='192.168.101.11',MASTER_USER='repl',MASTER_PASSWORD='tianqu',MASTER_LOG_FILE='mysql-bin.00001',MASTER_LOG_POS=0;
然后start salve
⒎关于复制的检查
在从库下:
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.101.11
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000119
Read_Master_Log_Pos: 120
Relay_Log_File: relaylog.000123
Relay_Log_Pos: 283
Relay_Master_Log_File: mysql-bin.000119
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table: mysql.%
如果Slave_IO_Running,Slave_SQL_Running为yes说明复制连接没问题
⒏关于主主复制
主主复制就是互为主备的关系
在配置时,可以参照主从复制,但为了防止主键冲突,必须加入如下参数
主库A
auto_increment_increment=1,即主键从1开始,可以自定义
auto_increment_offset=1,及主键的偏移量为1,可以自定义
主库B
auto_increment_increment=2,即主键从2开始
auto_increment_offset=1,及主键的偏移量为1
所以主库A上的主键的插入顺序为:1 3 5 7 9 ...
而主库B上的主键则为:2 4 6 8 ...
注意主主复制不能保证数据的一致性,如果update同一个语句,可能会导致两台的结果不一致