基于语句的复制(STATEMENT):在主服务器上执行的 SQL 语句,在从服务器上执行同样的语句。MySQL 默认采用基于语句的复制,效率比较高。
基于行的复制(ROW):不记录 SQL 语句上下文信息,仅保存哪条记录被修改。
混合类型的复制(MIXED):默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。
主从复制原理:
1、change master to 时,ip pot user password binlog position写入到master.info进行记录
2、start slave 时,从库会启动IO线程和SQL线程
3、IO_T,读取master.info信息,获取主库信息连接主库
4、主库会生成一个准备binlog DUMP线程,来响应从库
5、IO_T根据master.info记录的binlog文件名和position号,请求主库DUMP最新日志
6、DUMP线程检查主库的binlog日志,如果有新的,TP(传送)给从从库的IO_T
7、IO_T将收到的日志存储到了TCP/IP 缓存,立即返回ACK给主库 ,主库工作完成
8、IO_T将缓存中的数据,存储到relay-log日志文件,更新master.info文件binlog 文件名和postion,IO_T工作完成
9、SQL_T读取relay-log.info文件,获取到上次执行到的relay-log的位置,作为起点,回放relay-log
10、SQL_T回放完成之后,会更新relay-log.info文件
11、relay-log会有自动清理的功能
12、主库一旦有新的日志生成,会发送“信号”给binlog dump,通知IO线程再请求
在开始搭建之前,您需要准备以下环境:
yum -y install ntp
vim /etc/ntp.conf
25行左右添加
server 127.127.172.0 #设置本地是时钟源,注意修改网段
fudge 127.127.172.0 stratum 8 #设置时间层级为8(限制在15内)
service ntpd start
yum -y install ntp ntpdate
service ntpd start
/usr/sbin/ntpdate masterIP #进行时间同步,指向Master服务器IP
crontab -e
*/30 * * * * /usr/sbin/ntpdate masterIP
1、在主服务器上打开MySQL配置文件my.cnf,并添加以下配置:
[mysqld]
log-bin=mysql-bin
server-id=1
2、systemctl restart mysqld 重启MySQL服务以使更改生效。
1、在主服务器上创建一个用于从服务器的账户,并授予复制权限:
CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
2、使用以下命令查看主服务器的二进制日志文件名和位置:
SHOW MASTER STATUS;
在从服务器上打开MySQL配置文件my.cnf,并添加以下配置:
[mysqld] server-id=2
1、在从服务器上执行以下命令,连接到主服务器:
CHANGE MASTER TO MASTER_HOST='master_host_name', MASTER_USER='repl',MASTER_PASSWORD='password',MASTER_LOG_FILE='recorded_log_file_name',MASTER_LOG_POS=recorded_log_position;
2、启动从服务器复制:
START SLAVE;
3、使用以下命令检查从服务器复制进程是否已启动:
SHOW SLAVE STATUS\G
如果Slave_IO_Running和Slave_SQL_Running的值都为“YES”,则表示从服务器已经成功连接到主服务器并开始复制。
//如果需要停止主从服务复制的功能,使用以下命令:
stop slave;
//若搭建主从复制的过程出错,则需要清理掉之前的配置,还需要执行以下命令:
reset slave all;
当主库的 TPS 并发较高的时候,由于主库上面是多线程写入的,而从库的SQL线程是单线程的,导致从库SQL可能会跟不上主库的处理速度。
解决方法:
MySQL主从复制是一种提高数据库可用性和性能的常用解决方案。本教程介绍了如何搭建MySQL主从复制,您可以根据实际情况进行调整和优化。