# 4、MYSQL主主热备

### docker 测试mysql

<pre class="language-bash"><code class="lang-bash"><strong># A
</strong>sudo docker run -p 12345:3306 --name mysql_master \
-v /docker/mysql_master/conf:/etc/mysql/conf.d \
-v /docker/mysql_master/logs:/logs \
-v /docker/mysql_master/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7



# B
sudo docker run -p 12346:3306 --name mysql_slave \
-v /docker/mysql_slave/conf:/etc/mysql/conf.d \
-v /docker/mysql_slave/logs:/logs \
-v /docker/mysql_slave/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
</code></pre>

### 查看容器IP地址

```bash
sudo docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql_master 
sudo docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql_slave
```

### 查看 skip\_networking 的状态

> 确保在主服务器上 skip\_networking 选项处于 OFF 关闭状态, 这是默认值。如果是启用的，则从站无法与主站通信，并且复制失败。

```bash
sudo docker exec  mysql_master /bin/sh -c "mysql -uroot -p123456 -e \"show variables like '%skip_networking%';\""
```

### Mysql 双机热备

* A： 172.17.0.2
* B： 172.17.0.3

**1. 首先创建测试数据库, \<A、B 都需要创建>**

`create database test default charset utf8;`

**2. 创建同步用户，\<A、B 都需要创建>**

<pre><code># A
grant replication slave on *.* to 'replicate'@'172.17.0.3' identified by '123456';
flush privileges;

# B
grant replication slave on *.* to 'replicate'@'172.17.0.2' identified by '123456';
flush privileges;

# 在 A,B 上测试连通性
mysql -ureplicate -p123456 -h172.17.0.2 -e 'show databases'
mysql -<a data-footnote-ref href="#user-content-fn-1">ureplicate </a>-p123456 -h172.17.0.3 -e 'show databases'
</code></pre>

**3. 修改数据库配置文件，然后重启**

<pre><code># A
server-id = 1
log-bin = mysql-bin
<strong>binlog-do-db = test
</strong>binlog-ignore-db = mysql

log-slave-updates
sync_binlog = 1
auto_increment_offset = 1
auto_increment_increment = 2
replicate-do-db = test
replicate-ignore-db = mysql,information_schema

# B 配置同上，只修改 `server-id`
server-id = 2
</code></pre>

**3. 修改mysql配置文件,重启 `MySQL` 服务**

```
# A, B 机器查看状态
show master status\G;

# A
change master to MASTER_HOST='172.17.0.3', MASTER_PORT=3306, MASTER_USER='replicate',MASTER_PASSWORD='123456',master_log_file='mysql-bin.000001',master_log_pos=0;

# B
change master to MASTER_HOST='172.17.0.2', MASTER_PORT=3306,MASTER_USER='replicate',MASTER_PASSWORD='123456',master_log_file='mysql-bin.000001',master_log_pos=0;
```

**5. 分别在`A`和`B`服务器上启动从服务线程,并查看**

```
# 5.1 分别在 A，B 启动从服务线程
start slave;

# 5.2 分别在 A，B 机器查看
show slave status\G;


# 查看下面两项值均为Yes，即表示设置从服务器成功。
Slave_IO_Running: Yes

Slave_SQL_Running: Yes
```

**6. 测试写数据**

```
# 在 `A` 机器 `test` 数据库中创建表，并插入一条数据
create table tb_mobile( mobile VARCHAR(20) comment'', time timestamp DEFAULT now() comment'' );
insert into tb_mobile(mobile) values('13888888888');


# 在 `B` 机器查看是否同步，如果同步，并在 `B` 机器上插入一条数据
insert into tb_mobile(mobile) values('13999999999');

# 查看 `A` 机器是否存在 `B` 机器插入的数据， 如果存在，那么主－主形式的双机热备成功实现。
```

**7. 测试宕机**

```
# 例如 `A` 机器挂B了，那么 `B` 机器就接手了！ 接手后会有数据更新的操作，那么当A机器恢复的时候，数据和B机器不一致？

正常来说，宕机的机器会自动继续数据同步，如果没有继续同步，那么执行: 

stop slave;
show slave status\G;
重新再 `change` 一次
start slave;
```

**==注意,如果是在生成环境中，需要先锁表：==**

```
flush tables with read lock;
unlck lock;
```

参数说明：

| 参数                         | 详解                                                             |
| -------------------------- | -------------------------------------------------------------- |
| server-id                  | 唯一标识，1\~232之间                                                  |
| log-bin                    | 表示打开binlog，打开该选项才可以通过I/O写到Slave的relay-log，也是可以进行replication的前提 |
| binlog-do-db               | 表示需要记录二进制日志的数据库,如果有多个数据可以用逗号分隔，或者使用多个binlog-do-dg选项            |
| binglog-ingore-db          | 表示不需要记录二进制日志的数据库，如果有多个数据库可用逗号分隔，或者使用多binglog-ignore-db选项。      |
| replicate-do-db            | 表示需要同步的数据库，如果有多个数据可用逗号分隔，或者使用多个replicate-do-db选项。              |
| replicate-ignore-db        | 表示不需要同步的数据库，如果有多个数据库可用逗号分隔，或者使用多个replicate-ignore-db选项。        |
| master-connect-retry       | 表示主、从连接没有成功，等待时间，默认60s）。如果从服务器存在mater.info文件，它将忽略些选项。          |
| log-slave-updates          | 配置`从`操作是否写入二进制文件，如果是从库，还要做其他从库的主库，那么就需要打这个参数                   |
| slave-skip-errors          | 定义忽略错误号。如果从库只做备份,那就不配置。如果是分担主库的查询压力，可以考虑。                      |
| sync\_binlog               | `0` 不同步到磁盘， `1` 同步到磁盘(防止系统崩溃丢失数据)                              |
| auto\_increment\_increment | 控制列中的值的增量值，用于主－主服务器（master-to-master）复制                        |
| auto\_increment\_offset    | 确定AUTO\_INCREMENT列值的起点。用于主－主服务器（master-to-master）复制            |

[^1]: 
