1、原理
1.1 什么是主从复制
主从复制,就是用来建立一个和主数据库完全一样的数据库环境,这个新建的数据库称为从数据库;主数据库一般是准实时的业务数据库。
1.2 主从复制的作用
做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。
架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。
读写分离,使数据库能支撑更大的并发。在报表中尤其重要。由于部分报表sql语句非常的慢,导致锁表,影响前台服务。如果前台使用master,报表使用slave,那么报表sql将不会造成前台锁,保证了前台速度。
1.3 主从复制原理(重点)
- 数据库中的bin-log二进制文件,记录了所有Sql语句;
- 目标即是把主数据库的bin-log文件的Sql语句复制到从数据库,让其在从数据的relay-log重做日志文件中再执行一次这些Sql语句;
- 具体需要三个线程来操作:
- binlog输出线程:每当从库连接到主库时,主库会创建一个线程然后发送到binlog内容到从库。
- 从库I/O线程:当*
start slave
*语句在从库开始执行之后,从库创建一个I/O线程,该线程连接到主库并请求主库发送binlog里面的更新记录到从库上。从库I/O线程读取主库的binlog输出线程发送的更新并拷贝这些更新到本地文件,其中包括relay log文件。- 从库的SQL线程:从库创建一个SQL线程,这个线程读取从库I/O线程写到relay log的更新事件并执行。
可以知道,对于每一个主从复制的连接,都有三个线程。拥有多个从库的主库为每一个连接到主库的从库创建一个binlog输出线程,每一个从库都有它自己的I/O线程和SQL线程。
主从复制如图:
原理图2
步骤一:主库db的更新事件(update、insert、delete)被写到binlog
步骤二:从库发起连接,连接到主库
步骤三:此时主库创建一个binlog dump thread线程,把binlog的内容发送到从库
步骤四:从库启动之后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log.
步骤五:还会创建一个SQL线程,从relay log里面读取内容,从Exec_Master_Log_Pos位置开始执行读取到的更新事件,将更新内容写入到slave的db.
2、配置
2.1 环境准备
两个数据库:(例子用的本机和虚拟机)
主数据库IP:192.168.5.66 从数据库IP:192.168.177.128
MySql版本:5.7
Note:最好两数据库版本一致,从数据库版本不低于主数据库。
2.2 主数据库配置
-
创建一个新的数据库test
-
打开MySQL的配置文件my.ini,增加配置
# 主从复制 server-id=1 # 设置server-id,配置文件中一般已经有值 log-bin=mysql-bin # 开启二进制文件 binlog-ignore-db=mysql # 表示不同步mysql库 binlog-ignore-db=information_schema # 表示不同步information_schema库 binlog-ignore-db=performance_schema # 表示不同步performance_schema库 binlog-ignore-db=sys # 表示不同步sys库
Note:MySQL创建时会在隐藏目录下ProgramData文件夹下的MySQL\MySQL Server 5.7中创建my.ini,一定找对
-
重启MySQL 服务
-
创建用于同步的用户账号
(1)以管理员身份打开cmd窗口后,运行mysql -uroot -p,输入密码(为空则直接回车),登陆。
(2)先后执行下面3条命令创立用户(用户名sync,密码sync123),并刷新权限CREATE USER 'slave'@'192.168.177.128' IDENTIFIED BY '123456'; GRANT REPLICATION SLAVE ON *.* TO 'slave'@'192.168.177.128'; FLUSH PRIVILEGES;
-
查看Master状态,记录二进制文件名和位置
show master status;
二进制文件为mysql-bin.000001,位置为154
2.3 从数据库配置
-
创建一个新的数据库test
-
验证同步账号能否登陆。打开Navicat,新建链接,IP填写192.168.177.128,用户名slave,密码123456,点击“连接测试”验证是否能连接。
-
打开my.ini,增加配置
server-id=2 # 主从库server-id不能一样 log-bin=mysql-bin replicate_wild_ignore_table=mysql.% replicate_wild_ignore_table=information_schema.% replicate_wild_ignore_table=performance_schema.%
-
重启MySQL服务
-
cmd命令行登陆MySQL数据库,执行下面命令进行手动同步
CHANGE MASTER TO MASTER_HOST='192.168.5.66',MASTER_PORT=3306,MASTER_USER='slave',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=154;
-
启动salve同步进程
start slave;
-
查看slave状态。执行命令:
show slave status\G;
- 测试。在主数据库新建一个表,刷新从数据库,可以看到这个表。
Notes:在进行数据库主从复制前,主数据库中已有表和数据,则这部分数据不会同步,需要手动导出,并在从数据库中导入。
参考链接:
https://blog.csdn.net/heyeqingquan/article/details/82768156
https://www.bilibili.com/video/BV1NA411v7W8?p=16
https://www.cnblogs.com/gdjlc/p/12222512.html
https://blog.csdn.net/tlpower/article/details/7891870