使用 MySQL 数据库实现主从复制配置

  • 一、基本介绍
  • 二、使用 MySQL 实现主从复制
  • 1.主服务器配置
  • 2.从服务器配置
  • 3.验证同步
  • 4.同步指定库


一、基本介绍

MySQL 主从复制是指 数据可以从一个 MySQL 数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,也就是说从节点不用一直访问主服务器来更新自己的数据,数据的更新在远程连接上即可完成。


MySQL 支持的复制类型:

  1. 基于语句复制: 在 Master 数据库上执行的 SQL 语句,同样会在 Slave 数据库上执行相同的语句(默认采用该模式,效率比较高)
  2. 基于行复制: 把改变的内容同步过去,而不是把 SQL 在 Slave 数据库上执行一遍。
  3. 混合类型复制: 默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。
mysql> show variables like '%binlog_format%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW   |
+---------------+-------+
1 row in set (0.00 sec)
  • MySQL 所使用的复制类型,主要就是根据 binlog_format 配置的值确定的(值:{ statement | row | mixed }

MySQL 主从复制工作原理:

  1. Master 服务器将数据库内的 所有增删改操作记录到二进制文件内。
  2. Slave 服务器会在一定时间间隔内对 Master 数据库的二进制文件进行探测其是否发生改变;
  3. 如果发生改变,则会 启动一个 I/O 线程去请求 Master 数据库的二进制事件。
  4. 同时,Master 数据库会为每个 I/O 线程开启一个 dump 线程,用于向其发送二进制事件,并 保存至 Slave 数据库的中继日志中。
  5. 接着,Slave 数据库将会 启动 SQL 线程,从中继日志内读取二进制事件,并在本地回放(重新执行)
  6. 最后,I/O 线程和 SQL 线程将进入睡眠状态,等待下一次被唤醒。

mysql特殊字符 复制到其它表报错_mysql特殊字符 复制到其它表报错


MySQL 读写分离介绍: 顾名思义,读写分离就是 读和写分别在不同的数据库上进行,基本上就是由主数据库提供写服务,从数据库提供读服务,从而减轻主数据库的性能压力(配置读写分离的提前需要两端处于主从同步状态)

实现方式:

  1. 基于程序代码内部实现: 在代码内将查询语句进行路由分支,和 insert update 等语句进行区分。
  2. 基于中间代理层实现: 代理服务器接收到来自客户端的请求后,通过判断后转发到后端的数据库(常用的便是 Amoeba)

二、使用 MySQL 实现主从复制

准备工作:


1)配置时间同步

[root@Master ~]# yum -y install ntp
[root@Master ~]# sed -i '/^server/s/^/#/g' /etc/ntp.conf 
[root@Master ~]# cat <<END >> /etc/ntp.conf
server 127.127.1.0
fudge 127.127.1.0 stratum 8
END
[root@Master ~]# systemctl enable ntpd --now							# 启动并配置开启自启
[root@Master ~]# netstat -nlptu | grep ntp
[root@Slave ~]# yum -y install ntpdate
[root@Slave ~]# /usr/sbin/ntpdate 192.168.1.1

2)安装 MySQL 数据库:MySQL 安装教程

1.主服务器配置

1)修改配置文件

[root@Master ~]# cat <<END >> /etc/my.cnf
server-id=1
log-bin=master-bin														# 二进制文件前缀
END
[root@Master ~]# systemctl restart mysqld

2)授权配置

[root@Master ~]# mysql -uroot -p123123
mysql> grant replication slave on *.* to 'myslave'@'%' identified by '123123';
mysql> flush privileges;												# 刷新权限
mysql> show master status\G												# 查看 Master 信息

mysql特殊字符 复制到其它表报错_MySQL_02

2.从服务器配置

1)修改配置文件

[root@Slave ~]# cat <<END >> /etc/my.cnf
server-id=2
relay-log=relay-log-bin
END

2)配置同步

[root@Slave ~]# mysql -uroot -p123123
mysql> change master to 
master_host='192.168.1.1',
master_user='myslave',
master_password='123123',
master_log_file='master-bin.000001',
master_log_pos=592;
mysql> start slave;
mysql> show slave status\G

mysql特殊字符 复制到其它表报错_MySQL_03

3.验证同步

1)主服务器上操作:

[root@Master ~]# mysql -uroot -p123123
mysql> create database exam;
mysql> use exam
mysql> create table t_test(ID int);
mysql> insert into t_test value(1);
mysql> insert into t_test value(2);

2)在从服务器上查看:

mysql特殊字符 复制到其它表报错_mysql特殊字符 复制到其它表报错_04

  • 上面我们做的同步是针对所有库进行同步的,但是在有些业务场景下,可能只需要同步部分库或部份表就能够满足业务需求。

4.同步指定库


1)Master 数据库配置选项:

  • binlog-do-db:将指定库的增删改 记录到二进制文件;
  • binlog-ignore-db:将指定库的增删改 不记录到二进制文件;

2)Slave 数据库配置选项:

  • replicate-do-db:指定需要同步的库;
  • replicate-ignore-db:指定不需要同步的库;
  • replicate-do-table:指定需要同步的表;
  • replicate-ignore-table:指定不需要同步的表;
  • replicate-wild-do-table:指定需要同步的表(支持通配符)
  • replicate-wild-ignore-table:指定不需要同步的表(支持通配符)

1)同步指定库

[root@Master ~]# cat <<END >> /etc/my.cnf
binlog-do-db=exam
END
[root@Master ~]# systemctl restart mysqld

2)验证

[root@Master ~]# mysql -uroot -p123123
mysql> show databases;
mysql> create database zhangsan;
mysql> insert into exam_t_test value(3);

mysql特殊字符 复制到其它表报错_MySQL_05

3)在从库上查看:

mysql特殊字符 复制到其它表报错_数据库_06

从上面的结果可以看出,当我们在 Master 上将指定库的增删改操作记录到二进制文件后,其它库的增删改并不会记录到二进制文件内。那么也就是说 除了我们选定的库,其它库并不会同步到从库中。(因为主从同步是根据 binlog 日志文件来同步的)


1)同步指定表

[root@Slave ~]# cat <<END >> /etc/my.cnf
replicate-do-table=exam.t_test
END
[root@Slave ~]# systemctl restart mysqld

2)验证

[root@Master ~]# mysql -uroot -p123123
mysql> use exam
mysql> create table t_zhangsan(ID int);
mysql> insert into t_test value(4);

mysql特殊字符 复制到其它表报错_运维_07

3)在从库上查看:

mysql特殊字符 复制到其它表报错_数据库_08