# 16.8 AB复制

## MySQL AB简介

AB复制又称主从复制，实现的是数据同步。

如果要做MySQL AB复制，数据库版本尽量保持一致。如果版本不一致，从服务器版本高于主服务器，但是版本不一致不能做双向复制。

MySQL AB复制有什么好处呢？

* 解决宕机带来的数据不一致，因为MySQL AB复制可以实时备份数据；
* 减轻数据库服务器压力，多台服务器的性能一般比单台要好。但是MySQL AB复制不适用于大数据量，如果是大数据环境，推荐使用集群。

​ MySQL复制（replication）是一个异步的复制，从一个MySQL实例（Master）复制到另一个MySQL（Slave）。实现整个主从复制，需要由Master服务器上的IO进程，和Slave服务器上的Sql进程和IO进程共同完成。

## 主从复制的过程

​ 要实现主从复制，首先必须打开Master端的binary log(bin-log)功能，因为整个MySQL复制过程实际上就是Slave从Master端获取相应的二进制日志，然后再在自己slave端完全顺序的执行日志中所有记录的各种操作。 主从复制的基本过程： ​ 1）MySQL Slave端的IO进程连接上Master，向Master请求指定日志文件的指定位置（或者从最开始的日志）之后的日志内容；

​ 2）Master接收到来自Slave的IO进程的请求后，负责复制的IO进程根据Slave的请求信息，读取相应日志内容，返回给Slave的IO的进程。并将本次请求读到的bin-log文件名及位置一起返回给Slave端。

​ 3）Slave的IO进程接收到信息后，将接收到的日志内容依次添加Slave端的realy-log文件的最末端，并将读取到的Master端的bin-log的文件名和位置记录到master-info文件中，以便在下一次读取的时候能够清楚的告诉Master“我需要从某个bin-log的哪个位置开始往后的日志内容，请发给我；”

​ 4）Slave的Sql进程监测到relay-log中新增了内容后，会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容，并在自身执行。

### 主服务器操作

#### 全备，并在从机恢复数据

#### 开启binlog日志

```
vim /etc/my.cnf
[mysqld]
log-bin = master
log-bin-index = master
server-id = 1
```

```
service mysqld restart
```

#### 授权从服务器

授权从服务器，可以传输binlog日志

```
grant replication slave on *.* to slave@'从服务器' identified by '123';
```

### 从服务器操作

#### 导入主服务器的数据

```
mysql -u root < all.sql
```

#### 改配置文件

```
vim /etc/my.cnf
[mysqld]
server-id = 2
```

#### 配置主服务器的信息

```
>stop slave;
>change master to
-> master_host = '主服务器'，
->master_user = 'slave',
->master_password = '123',
->master_port = 3306,
->master_log_file = 'mysql-bin.000001',
-> master_log_pos=120;
>start slave;
```

### 校验

```
> show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
```

表示成功

​
