一、MySQL 主从复制
1. 主从复制原理
主库 有一个 工作线程 I/O dump thread(转储线程)。 从库 有两个工作线程 I/O thread 和 SQL thread。 主库 通过 I/O dump thread 给 从库 I/O thread 传送 binlog 日志。
主库 把接收的 SQL 请求,记录到自己的 binlog 日志中。 从库 的 I/O thread 去请求主库的 binlog 日志,并将 binlog 日志写到 中继日志 中。 从库 的 SQL thread 重做 中继日志 中的 SQL 语句。
2. 主从复制前提
主 DBserver 和 从 DBserver 数据库的版本需一致。 主 DBserver 和 从 DBserver 数据库数据名称需一致。 主 DBserver 需开启二进制日志。 主 DBserver 和 从 DBserver 的 server_id 都必须唯一。
二、MySQL 主服务配置
1. 修改主 my.cnf 文件
[ mysqld]
server-id= 101
log-bin= mysql-bin
binlog-do-db= db1
binlog-ignore-db= mysql
binlog_ignore_db = information_schema
binlog_ignore_db = performation_schema
binlog_ignore_db = sys
binlog_format = MIXED
1. MySQL 复制主要有三种方式
基于 SQL 语句的复制(SBR,statement-based replication),对应的 binlog 格式 STATEMENT 。 基于 行的复制(RBR,row-based replication),对应的 binlog 格式 ROW 。 混合模式复制(MBR,mixed-based replication),对应的 binlog 格式 MIXED 。
2. binlog_format
1. STATEMENT 模式(SBR)
每一条修改数据的 SQL 语句,会记录到 binlog 中。 优点:并不需要记录每一条 SQL 语句和 每一行的数据变化,减少了 binlog 日志量,节约 IO,提高性能。 缺点:在某些情况下会导致(master-slave)中的数据不一致。 如:sleep()、last_insert_id()、user-defined、functions(udf) 等函数。
2. ROW 模式(RBR)
不记录每条 SQL 语句的上下文信息,仅需记录哪条数据被修改了,修改成什么样了。 而且不会出现某些特定情况下的 存储过程、function、trigger 的调用和触发,无法被正确复制的问题。 缺点:会产生大量的日志,尤其是 alter table 的时候会让日志暴涨。
3. MIXED 模式(MBR)
以上两种模式的混合使用,MySQL 会根据执行的 SQL 语句,选择日志的保存方式。 一般的复制使用 STATEMENT 模式保存 binlog 日志。 对于 STATEMENT 模式无法复制的操作,使用 ROW 模式保存 binlog 日志。
2. 重启 Master 主服务
service mysqld restart
3. 创建连接帐户并授权
一般不用 root 帐号,% 表示所有客户端都可以连,只需要帐号密码正确。 此处可用具体 客户端IP 代替,如:192.168.1.137 加强安全。
mysql> GRANT FILE ON * . * TO 'backup' @'%' IDENTIFIED BY '123456' ;
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON * . * to 'backup' @'%' identified by '123456' ;
mysql> FLUSH PRIVILEGES ;
mysql> SELECT user , host FROM mysql. user ;
4. 查看 Master 主服务状态
mysql> show master status ;
mysql> reset master
三、MySQL 从服务配置
1. 修改从 mysqld.cnf 文件
[ mysqld]
server- id= 102
relay- log= mysql- relay
2. 配置 从服务 连接 主服务
show master status ;
查看数据库状态
mysql> change master to master_host= '192.168.1.137' , master_port= 3306 , master_user= 'slave' , master_password= '123456' , master_log_file= 'mysql-bin.002142' , master_log_pos= 385963
3. 启动 Slave 从服务
mysql> start slave;
mysql> stop slave;
4. 查看 Slave 从服务状态
mysql> show slave status ;
错误:Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
原因:MySQL 是克隆的系统,所以 MySQL 的 uuid 是一样的,所以需要修改。 解决:删除 /var/lib/mysql/auto.cnf
文件,重新启动服务。