说明
- 1个主库,可以设置 n 个从库,从库的数据能够自动和主库的数据保持一致
- 主从复制的架构有两个好处:一个是进行数据自动的备份,数据在主库和从库上都有一份,如果主库挂了,从库还有一份完整的数据。另一个是可以实现数据库访问的读写分离,提高数据库的吞吐量。也就是对数据的更新操作是在主库中完成的,而读取操作在多个从库中完成的,从而实现了负荷分担的效果,提高数据库的访问效率
- MySQL 的主从复制是通过他的归档日志(binlog) 来实现的。基本的过程就是从库在一个线程中和主库建立一个长连接,获取主库binlog 的位置,然后主库将这个位置之后的 binlog 日志内容发送给从库,从库获取到主库发送过来的 binlog 内容后先写入到本地的中转日志(relaylog)中,然后从库另一个进程在从中转日志中读取内容并解析成为 sql 语句在从库中执行,从而保证了主从的同步
- 同步是基于binlog 的,所以默认同步具有 binlog 的所有库,但也可以在从库中指定需要同步的库,前提是该库具备 binlog
前提
主库和从库的数据库的版本保持一致
主从复制集群中每个数据库实例的 server-id 的值不能重复
要开启归档日志并且归档日志的格式选择为 row 方式。这两个在 MySQL 8 中默认就是这样,所以不需要设置,如果早期版本默认值不同需要在配置文件中人工设置
1 2 3 4
| # 是否开启 binlog show variables like 'log_bin'; # binlog 格式 show variables like 'binlog_format';
|
主库设置
配置 my.conf
1 2 3 4 5 6 7 8 9 10 11
| [mysqld] #标识唯一id(必须),一般使用ip最后位 server-id=100
#不记录 binlog 的数据库,可设置多个 binlog-ignore-db=information_schema binlog-ignore-db=performance_schema binlog-ignore-db=mysql #指定需要 binlog 的数据库(和slave是相互匹配的),可以设置多个 binlog-do-db=jeecgboot_tongchuan_portal binlog-do-db=jeecgboot_tongchuan_car
|
创建主从复制权限用户「或者使用root」
在 MySQL 中增加一个可以进行主从复制权限的用户。在 mysql 交互环境中执行如下命令
1 2
| mysql>create user 'repl'@'10.110.2.72' identified by 'reple_password'; mysql>grant replication slave on *.* to 'repl'@'10.110.2.72';
|
查看日志位置
1 2 3 4 5 6 7 8
| show master status;
+---------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +---------------+----------+--------------+------------------+-------------------+ | WIN-PPBR15MIHTE-bin.000003 | 156 | | | | +---------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
|
获取到当前归档日志的名字和位置,后面从服务器设置主从复制的时候需要从这个位置开始
从库设置
配置 my.conf
1 2 3 4 5 6
| servier-id = 11 ## id号一定不能与主服务器的id号相同 关掉二进制日志 #log-bin=mysql-bin 添加如下内容: ##这些是开启中继日志的 relay-log=relay-bin relay-log-index=relay-bin.index
|
重启服务
service mysqld restart
配置同步信息
1 2 3 4 5 6 7 8 9
| mysql> change master to -> master_host='192.168.0.99', -> master_port=3306, -> master_user='root', -> master_password='123456', -> master_log_file='WIN-PPBR15MIHTE-bin.000003', -> master_log_pos=156; mysql>start slave; mysql>show slave status\G;
|
这个命令将当前数据库设置为 192.168.0.99 数据库的从库,并且从归档日志 WIN-PPBR15MIHTE-bin.000003 的位置 156 开始进行复制。
查看从库的状态
1
| mysql> show slave status\G;
|
Slave_IO_State 的值为 Waiting for master to send event ,表示已经准备好接受主库发送过来的归档日志进行处理了
效果演示
在主库执行如下命令
1 2 3 4 5
| mysql>create database test1; mysql>use test1; mysql>create table test1(id bigint); mysql>insert into test1 values(1); mysql>insert into test1 values(2);
|
在从库查看数据库状态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | test1 | +--------------------+ 5 rows in set (0.00 sec) mysql> use test1; Database changed mysql> show tables; +-----------------+ | Tables_in_test1 | +-----------------+ | test1 | +-----------------+ 1 row in set (0.01 sec)
mysql> select * from test1; +------+ | id | +------+ | 1 | | 2 | +------+ 2 rows in set (0.00 sec)
mysql>
|
可以看到,主库中做的操作,都同步到从库中来了
指定同步的数据库
默认将主库中的所有数据库都同步到从库中来了,但可以通过如下2 种方式指定同步的数据库或者数据库的数据表
- 方式一:在从库中执行命令,只同步数据库 test1。该方式重启数据库后失效
1 2 3 4
| mysql> stop slave; mysql> change replication filter replicate_do_db=(test1); ysql> start slave; mysql> show slave status\G;
|
- 方式二:在从库 my.cnf 文件中 mysqld 添加配置 「推荐」
1 2 3 4
| [mysqld] replicate_do_db=test1 replicate_do_db=test2 replicate_do_table=test.user
|
重新启动数据库