[TOC]
# 目录
> 可能查看本章的人感觉,为什么现在容器化年代,还用直接搭建方式搭建主从关系,但是有好多人直接用别人的容器,而忽视了怎么搭建主从。还有在容器化做MySQL真的符合吗?
## 为什么要做主从复制?
- 读写分离。在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,<font color="red"> 使用主从复制,让主库负责写,从库负责读, </font>这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。
- 做数据的热备
- 架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。
## MySQL主从
- 主配置log-bin, 指定文件的名字
- 主配置server-id 默认为1
- 从配置server-id 与主不能重覆
- 主创建备份账户并授权
- REPLICATION SLAVE
- 主进行锁表
- FLUSH TABLES WITH READ LOCK;
- 主 找到log-bin的位置
- SHOW MASTER STATUS;
- 主备份数据
- mysqldump --all-databases --master-data > dbuump.db
- 主备份数据、导入dump数据、解锁
- 导入 mysql < dbuump.db -uroot -pAbc@123456
- 解锁 unlock tables
- 在从上设置主的配置
## 准备环境
id | ip | remark | relation
---|---|---|---
1 | 192.168.8.245 | MySQL | 从
2 | 192.168.8.246 | MySQL | 主
为了测试建议先关闭防火墙:
- systemctl stop firewalld
- systemctl disable firewalld
# MySQL 实操
## 8.246 修改 /etc/my.cnf
最后追加
```json
log-bin=eddie_mysql
server-id=1
```
重启MySQL
```powershell
service mysqld restart
```
## 8.245 修改 /etc/my.cnf
最后追加
```xml
server-id=2
```
重启MySQL
```powershell
service mysqld restart
```
## ==主==创建备份账户并授权
```sql
mysql -uroot -p
create user 'repl'@'%' identified by 'Abc@123456';
alter user 'repl'@'%' identified with mysql_native_password by 'Abc@123456'; # MySQL 8 - 加密方式改为mysql_native_password
grant replication slave on *.* to 'repl'@'%';
flush privileges;
```
## ==主==进行锁表
```sql
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)
# 切换工具在 主库 插入数据
INSERT INTO `user` (id,username) VALUES (7,'lock_table');
会发现一只卡住了
```
## ==主==找到log-bin的位置
```sql
mysql> show master status;
+--------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+--------------------+----------+--------------+------------------+-------------------+
| eddie_mysql.000001 | 1492 | | | |
+--------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
```
## 主备份数据、导入dump数据、解锁
1. 新建一个CRT会话 (8.246-主库)
2. 输入 mysqldump --all-databases --master-data > dbuump.db -uroot -pAbc@123456
3. 查看 dbuump.db 是否生成了
4. 切换 8.245 CRT会话,输入 'scp root@192.168.8.246:/opt/dbuump.db /opt/' 远程复制
5. 导入备份到(8.245-从库),输入 'mysql < dbuump.db -uroot -pAbc@123456'
6. 在工具查看(8.245-从库)是否导入了主库的表和数据
7. 在 (8.246-主库) 终端输入 'mysql> unlock tables;' 解开表锁
## 在从上设置主的配置
```sql
mysql> change master to
-> master_host='192.168.8.246', # 主库 IP
-> master_user='repl', # 主库 创建备份账户
-> master_password='Abc@123456', # 主库 创建备份账户的密码
-> master_log_file='eddie_mysql.000001', # show master status; File
-> master_log_pos=1492; # show master status; Position
Query OK, 0 rows affected, 2 warnings (0.04 sec)
直接复制
change master to master_host='192.168.8.246',master_user='repl', master_password='Abc@123456',master_log_file='eddie_mysql.000001',master_log_pos=1492;
```
## 8.245 从库执行
```sql
start slave;
```
### 出现主从不同步解决办法:
```sql
1、如何排查问题
show slave status\G
2、mysql主从同步从库上Slave_IO_Running: Connecting问题
在输入 'change master to master_host = '192.168.8.246', master_user = 'repl', master_port=3306, master_password='Abc@123456', master_log_file = 'eddie_mysql.000001', master_log_pos=1492; '
之前才查看 'show master status;'
3、'caching_sha2_password' reported error: Authentication requires secure connection.
在创建用户时候指定加密方式改为mysql_native_password
4、Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).
设置好不同的 server-id = x , 然后 service mysqld restart
5. 暂停主从关系?
stop slave;
```
### 案例
> 在已有的数据库中,实现主从关系,需要先锁住表 'flush tables with read lock;'
在主库导出数据 'mysqldump --all-databases --master-data > dbuump.db -uroot -pAbc@123456'
在导入到从库 'mysql < dbuump.db -uroot -pAbc@123456'
在解锁表 'unlock tables;'
Linux搭建MySQL主从