目录
可能查看本章的人感觉,为什么现在容器化年代,还用直接搭建方式搭建主从关系,但是有好多人直接用别人的容器,而忽视了怎么搭建主从。还有在容器化做MySQL真的符合吗?
为什么要做主从复制?
- 读写分离。在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务, 使用主从复制,让主库负责写,从库负责读, 这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。
- 做数据的热备
- 架构的扩展。业务量越来越大,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
最后追加
log-bin=eddie_mysql
server-id=1
重启MySQL
service mysqld restart
8.245 修改 /etc/my.cnf
最后追加
server-id=2
重启MySQL
service mysqld restart
==主==创建备份账户并授权
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;
==主==进行锁表
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的位置
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数据、解锁
- 新建一个CRT会话 (8.246-主库)
- 输入 mysqldump --all-databases --master-data > dbuump.db -uroot -pAbc@123456
- 查看 dbuump.db 是否生成了
- 切换 8.245 CRT会话,输入 'scp root@192.168.8.246:/opt/dbuump.db /opt/' 远程复制
- 导入备份到(8.245-从库),输入 'mysql < dbuump.db -uroot -pAbc@123456'
- 在工具查看(8.245-从库)是否导入了主库的表和数据
- 在 (8.246-主库) 终端输入 'mysql> unlock tables;' 解开表锁
在从上设置主的配置
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 从库执行
start slave;
出现主从不同步解决办法:
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;'