赞
踩
目录
- 在主库上把数据更改(DDL、DML)记录到二进制日志(binary log)中,
- 备库I/O线程将主库上的二进制日志复制到自己的中继日志(relay log)中,
- 备库SQL线程读取中继日志中的事件,将其重放到备库数据库中。
- 主从复制是指将主数据库的 DDL 和 DML 操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。
- MySQL支持一台主库同时向多台从库进行复制, 从库同时也可以作为其他从服务器的主库,实现链状复制。
- MySQL 复制的优点主要包含以下三个方面:
- 主库出现问题,可以快速切换到从库提供服务。
- 实现读写分离,降低主库的访问压力(增删改操作主库,查询操作从库)
- 可以在从库中执行备份,以避免备份期间影响主库服务
①数据备份的时候加上全局锁以防止备份的数据不完整,此时数据库处于只读状态,其 它的客户端只能查询不能做增删改。
②有了主从复制后,可以在从库当中进行备份只需要锁从库就行,主库仍然可以进行增 删改等操作。从库加了全局锁后仍然可以查询,只不过在数据备份期间可能存在一定 的数据延迟,因为在备份期间从库是不能够执行从主库同步过来的二进制日志的。
③解决:可以使用single-transaction参数代替加全局锁的方式进行备份,来保证数据的 一致性备份------详情查看全局锁。
MySQL主从复制的核心就是 二进制日志,具体的过程如下:
Master 主库在事务提交时,会把数据变更记录在二进制日志文件 binlog 中。
从库读取主库的二进制日志文件 Binlog ,写入到从库的中继日志 Relay log 。 从库中的IOthread线程:发起一个请求连接主数据库,然后读取主数据库中的 Binlog日志,读取完并返回从库之后,此线程会把Binlog日志写入到从库自身的一份日志(中继日志 Relay Log)中。
- slave从库重做中继日志中的事件,将改变反映它自己的数据。 从库中的SQLthread线程:读取中继日志当中的数据,然后把中继日志当中所记录的数据变化在反映到自身数据库的数据变化,从而保证主从数据的一致。
举例:主库执行insert语句之后写入到二进制日志中,然后被IOthread线程读取过来之后写入到中继日志,那么SQLthread线程读取中继日志就会读取到这条insert语句,那么接下来在从库当中再去执行这条insert,此时就保证了主从数据的一致。
192.168.145.237 | master |
192.168.145.238 | slave |
准备好两台服务器之后,在上述的两台服务器中分别安装好MySQL(这里安装的是8.0版本),并完成基础的初始化准备(安装、 密码配置等操作)工作(注意要关闭防火墙)
修改主机名
//192.168.145.237主机上 [root@harbor ~]# hostnamectl set-hostname master [root@harbor ~]# reboot //192.168.145.238主机上 [root@harbor ~]# hostnamectl set-hostname slave [root@harbor ~]# reboot查看两台服务器上的MySQL状态
修改配置文件 vim/etc/my.cnf
[root@master ~]# vim /etc/my.cnf //添加以下内容 #mysql 服务ID,保证整个集群环境中唯一,取值范围:1 – 232-1,默认为1 server-id=1 #是否只读, 1代表只读, 0代表读写 read-only=0 #以下2个不需要配置,表示创建的所有数据库都需要进行同步 #忽略的数据, 指不需要同步的数据库 #binlog-ignore-db=mysql #指定同步的数据库 #binlog-do-db=db01重启MySQL服务器
[root@master ~]# systemctl restart mysqld
登录MySQL,创建远程连接的账号,并授予主从复制权限
[root@master ~]# mysql -uroot -p'Xielei@123' //创建test1用户,并设置密码,该用户可在任意主机连接该MySQL服务 //作用:在从库当中连接主库时的账号和密码。 mysql> create user 'test1'@'%' identified by 'Xielei@123'; Query OK, 0 rows affected (0.01 sec) //为'test1'@'%'用户分配主从复制权限 mysql> grant replication slave on *.* to 'test1'@'%'; Query OK, 0 rows affected (0.00 sec)通过指令,查看二进制日志坐标
mysql> show master status; +---------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +---------------+----------+--------------+------------------+-------------------+ | binlog.000037 | 683 | | | | +---------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)字段含义说明:
- file : 从哪个日志文件开始推送日志文件(写到哪个日志文件了)
- position : 从哪个位置开始推送日志
- binlog_ignore_db : 指定不需要同步的数据库
主库配置完后就不要在执行DML增删改以及DDL语句了。
修改配置文件 vim/etc/my.cnf
[root@slave ~]# vim /etc/my.cnf //mysql服务ID,保证整个集群环境中唯一,取值范围:1 – 2^32-1,和主库不一样即可 server-id=2 //是否只读, 1代表只读, 0代表读写 //从库只需要做查询操作不需要做修改操作,所以设置为1也可以 //这个选项仅仅代表是普通用户只读,如果这个用户具有超级管理员super的权限,那么他也是可以进行读写的 read-only=1 //如果想要禁用超级管理员的读写功能,让它也变为只有读的功能,可以设置以下参数 #super-read-only=1重启MySQL服务器
[root@slave ~]# systemctl restart mysqld
登录MySQL,设置从库配置。
现在主库和从库是没有关系的,并没有产生关联,所以接下来还要在从库中去设置主库的相关配置。
[root@slave ~]# mysql -uroot -p'Xielei@123' mysql> change REPLICATION SOURCE TO SOURCE_HOST='192.168.145.237', SOURCE_USER='test1',SOURCE_PASSWORD='Xielei@123', SOURCE_LOG_FILE='binlog.000037',SOURCE_LOG_POS=683; Query OK, 0 rows affected, 2 warnings (0.02 sec) //注释如下: SOURCE_HOST=‘192.168.145.237’:原主机地址是多少,也就是主库的ip SOURCE_USER=‘test1’:连接这个ip地址对应的mysql,那么我的用户名是多少 SOURCE_PASSWORD=‘Xielei@123’:密码是多少 SOURCE_LOG_FILE=‘binlog.000037’:从哪个二进制日志文件开始同步 SOURCE_LOG_POS=683:表示从这份日志文件中的哪个位置开始同步注释:
- 上述是8.0.23中的语法。如果mysql是 8.0.23 之前的版本,执行如下SQL:
CHANGE MASTER TO MASTER_HOST='192.168.145.237', MASTER_USER='itcast',MASTER_PASSWORD='Xielei@123', MASTER_LOG_FILE='binlog.000037',MASTER_LOG_POS=683;
- 2个版本的区别是参数名不同:当前使用的8.0.26版本兼容之前的语法,所以执行那一条都可以
参数名 含义 8.0.23之前 SOURCE_HOST 主库IP地址 MASTER_HOST SOURCE_USER 连接主库的用户名 MASTER_USER SOURCE_PASSWORD 连接主库的密码 MASTER_PASSWORD SOURCE_LOG_FILE binlog日志文件名 MASTER_LOG_FILE SOURCE_LOG_POS binlog日志文件位置 MASTER_LOG_POS
开启同步操作
//8.0.22之后执行的语法。\G表示表中的数据比较大展示出来的效果比较混乱,加上\G把每一列数据转化为每一行显示 mysql> show replica status\G; *************************** 1. row *************************** Replica_IO_State: Waiting for source to send event Source_Host: 192.168.145.237 Source_User: test1 Source_Port: 3306 Connect_Retry: 60 Source_Log_File: binlog.000037 Read_Source_Log_Pos: 1032 Relay_Log_File: slave-relay-bin.000002 Relay_Log_Pos: 672 Relay_Source_Log_File: binlog.000037 Replica_IO_Running: Yes //ID和SQL线程状态都为YES Replica_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: ...... ...... ...... //8.0.22之前 show slave status ;注释:只需要以下2个选项为yes就代表主从复制正常,
IO-Running代表那一组io线程运行是否正常,
SQL-Running代表那一组sql线程运行是否正常。
错误情况:如果是克隆的虚拟机,mysql的uuid值是一样的,必须修改从库虚拟机的mysql服务器uuid的值,和主库不能一样。修改方法如下:
//修改此文件中的uuid值,随便修改一个字符 vim /var/lib/mysql/auto.cnf //重启mysql服务 systemctl restart mysqld
先查询此时的数据库状态:
在主库 192.168.145.237 上创建数据库、表,并插入数据
mysql> create database test; Query OK, 0 rows affected, 1 warning (0.01 sec) mysql> use test; Database changed mysql> create table tb(id int(11) primary key not null auto_increment,name varchar(50) not null,sex varchar(1))engine=innodb default charset=utf8mb4; Query OK, 0 rows affected, 1 warning (0.01 sec) mysql> insert into tb(id,name,sex) values(null,'Tom', '3'),(null,'Trigger','8'),(null,'Dawn','4'); Query OK, 3 rows affected (0.01 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql>在从库 192.168.10.201 中查询数据,验证主从是否同步。
mysql> show databases; +--------------------+ | Database | +--------------------+ | aaa | | bbs | | company | | haha | | information_schema | | mysql | | performance_schema | | school | | sys | | test | +--------------------+ 10 rows in set (0.00 sec) mysql> use test; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select * from tb; +----+---------+------+ | id | name | sex | +----+---------+------+ | 1 | Tom | 3 | | 2 | Trigger | 8 | | 3 | Dawn | 4 | +----+---------+------+ 3 rows in set (0.00 sec) mysql>如上所示,主从复制成功。
注意:
我们刚才所演示的这种主从复制,它是从二进制日志的当前位置往后进行主从复制的,如果我们要把之前的数据也需要同步到从库,那么这个时候我们可以先把主库的数据导出到一个sql脚本当中,然后在从库当中把sql脚本执行,先保证主库和从库的初始数据是一致的,然后再从当前位置往后再进行同步。
1. 概述 |
将主库的数据变更同步到从库,从而保证主库和从库数据一致。 数据备份、失败迁移,读写分离,降低单库读写压力。 |
2. 原理 |
①.主库会把数据变更记录在二进制日志文件 Binlog 中。 ②.从库连接主库,读取binlog日志,并写入自身中继日志relaylog。 ③.slave重做中继日志,将改变反映它自己的数据。 |
3 搭建 |
①.准备服务器 ②.配置主库 ③.配置从库 ④.测试主从复制 |
待写中
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。