## 前言
- `mariadb`主从复制概述
- 复制解决的基本问题是让一台服务器的数据和另外的服务器保持同步。
- 一台主服务器可以连接多台从服务器,并且从服务器也可以反过来作主服务器。
- 主服务器和从服务器可以位于不同的网络拓扑中,还能对整台服务器、特定的数据库,甚至特定的表进行复制。
- 主从复制解决的问题
- 数据分布 (`Data distribution` )
- 负载平衡(`load balancing`)
- 备份(`Backups`)
- 高可用性和故障转移(`High availability and failover`)
- 主从复制如何工作
- `master`将改变记录到二进制日志(`binary log`)中(这些记录叫做二进制日志事件,`binary logevents`)
- `slave`将`master`的`binary log events`拷贝到它的中继日志(relay log)
- `slave`重做中继日志中的事件,修改`salve`上的数据。
> 1. `master`记录二进制日志。在每个事务更新数据完成之前,`master`在二日志记录这些改变。`Mariadb`将事务写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,`master`通知存储引擎提交事务。
> 2. `slave`将`master`的`binary log`拷贝到它自己的中继日志。首先,`slave`开始一个工作线程——I/O线程。I/O线程在`master`上打开一个普通的连接,然后开始`binlog dump process`。`Binlog dump process`从`master`的二进制日志中读取事件,如果已经执行完`master`产生的所有文件,它会睡眠并等待`master`产生新的事件。I/O线程将这些事件写入中继日志。
> 3. `SQL slavethread`(SQL线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重新执行其中的事件而更新`slave`的数据,使其与`master`中的数据一致。
## 实战
> 本博客默认用户已经搭建好两个mariadb服务。并且注意,在搭建的过程中必须保证主机服务没有持续的数据写入,否则可能导致主从数据不一致!
### master配置
- 修改/etc/my.cnf文件
```bash
[mysqld]
server-id=1
log_bin=master-bin
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=test
innodb_flush_log_at_trx_commit=1
binlog_format=mixed
```
> 注意:一定要将以上配置放在[mysqld]之下
- 添加备份的账号
> 此处命令需要进入主库中执行
>
> 通过命令`mysql -h127.0.0.1 -u root -p`连接主库
```sql
MariaDB [(none)]> grant replication slave on *.* to 'backup'@'%' identified by 'backupmima';
MariaDB [(none)]> flush privileges;
```
- 重启mariadb
如果是使用的安装方式安装的mariadb ,则推荐使用`systemctl restart mariadb`进行重启。
- 查看记录log_bin文件名和pos
```sql
MariaDB [(none)]> show master status\G
```
![][image-1]
> 此处的File与Position属性后续会用到。
- 复制前保证主从两个数据库数据一致,将主库所有数据导出
```bash
mysqldump -u root -p -A > master-all.sql
```
### slave配置
- 导入master内的所有数据
```bash
mysql -uroot -p < master-all.sql
```
> 此处需要输入从库的数据库密码
- 修改/etc/my.cnf文件
```bash
[mysqld]
server-id=2
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
relay_log_recovery=1
```
- 重启mariadb
如果是使用的安装方式安装的mariadb ,则推荐使用`systemctl restart mariadb`进行重启。
- 配置slave
```sql
MariaDB [(none)]> stop slave;
MariaDB [(none)]> change master to
master_host='master IP',
master_user='backup',
master_password='backupmima',
master_log_file='master-bin.000002',
master_log_pos=43147982;
MariaDB [(none)]> start slave;
```
> 注意,此处的`master_log_file`与`master_log_pos`对应master属性中的`File`与`Position`。
- 查看是否配置成功
```sql
MariaDB [(none)]> show slave status\G
```
![][image-2]
至此,主从服务搭建完毕,enjoy
## 后记
感谢这两位前辈的博客【[mariadb配置主从复制][text-1]、[搭建mariadb主从服务器实战数据热备][text-2]】,没有他们付出就没有这篇博客。
[image-1]: https://blog.chihiro.org.cn/upload/2019/12/mariadb%E4%B8%BB%E6%9C%8D%E5%8A%A1%E7%8A%B6%E6%80%81-dc666f76f1374ba0bac7e907e92d0ee2.png
[image-2]: https://blog.chihiro.org.cn/upload/2019/12/mariadb%E4%BB%8E%E6%9C%8D%E5%8A%A1%E7%8A%B6%E6%80%81-20b3dd974f574629aec0907fdc39cc19.png
[text-1]: https://blog.csdn.net/stones_liu/article/details/82884792
[text-2]: https://blog.csdn.net/snipelinux/article/details/80217114

mariadb配置主从复制