复制的基本原理
slave从master读取binlog来进行数据同步
复制过程:
- master将改变记录到二进制日志(binary log),这些记录过程叫做二进制日志事件,binary log events;
- slave将master的binary log events拷贝到它的中继日志(relay log);
- slave重做中继日志中的事件,将改变应用到自己的数据库中,mysql的复制是异步的且串行化的。
复制的基本原则
- 每个slave只有一个master
- 每个slave只能由一个唯一的服务器ID
- 每个master可以有多个slave
一主一从常见配置
- mysql版本最好一致且后台以服务运行
- 主从都配置在[mysqld]节点下,都是小写
- windows主机的my.ini配置文件
server-id=1 # 【必须】主服务器唯一ID
log-bin=自己本地路径/mysqlbin # 【必须】启用二进制日志
log-err=自己本地路径/mysqlerr # 【可选】启用错误日志
basedir=自己本地路径 # 【可选】根目录
tmpdir=自己本地路径 # 【可选】临时目录
datadir=自己本地目录/data # 【可选】数据目录
binlog-ignore-db=mysql # 【可选】设置不要复制的数据库
binlog-do-db=需要复制的主数据库名 # 【可选】设置需要复制的数据库
binlog-format=STATMENT(以前默认) # 【可选】设置binlog的记录格式
# STATMENT
# ROW(现在默认)
# MIXED
STATEMENT : 记录每次操作数据库的sql操作,从库按照sql逐次执行,但凡sql中出现了类似now()这种函数,会造成主从数据的不一致情况。
ROW : 记录每一行数据的改变,但是如果在主库中一条sql改变了大量的数据,造成行的改变太多,会造成从数据库同步次数太多,同步效率低下。
MIXED : 在 STATEMENT 和 ROW 之间灵活切换,如果出现类似@@hos tname这样的系统变量,也可能造成主从数据不一致的情况,无法避免。
- linux从机的my.cnf配置文件
server-id=2 # 【必须】从服务器唯一ID
relay-log=mysql-relay # 【可选】设置中继日志文件前缀,不配置会有默认值
log-bin=mysql-bin # 【可选】启用二进制日志,做从的同时有做主就需要配置
-
重启mysql服务(主从都要进行),使配置生效
-
主机上建立账户并授权给slave
grant replication slave on *.* to 'zhangsan'@'从机数据库IP' identified by 'password';
flush privileges;
show master status;
-- 如果数据库被修改了,需要重置一下master状态
reset master;
- 在从机上配置需要复制的主机
change master to master_host='主机IP',master_port=3306,
master_user='zhangsan', master_password='password',
master_log_file='file名字',master_log_pos=posistion数字;
# 启动IO和 SQL线程thread
start slave;
show slave status \G
-- 如果出现故障,需要重置slave状态后,重新设置master的配置
stop slave;
reset slave;
change master to ...;
start slave;
复制的最大问题
复制的最大问题是“延时“。