Linux搭建MySQL主从 | Eddie'Blog
Linux搭建MySQL主从

Linux搭建MySQL主从

eddie 440 2020-10-26

目录

可能查看本章的人感觉,为什么现在容器化年代,还用直接搭建方式搭建主从关系,但是有好多人直接用别人的容器,而忽视了怎么搭建主从。还有在容器化做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
  • 在从上设置主的配置

准备环境

idipremarkrelation
1192.168.8.245MySQL
2192.168.8.246MySQL

为了测试建议先关闭防火墙:

  • 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数据、解锁

  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;' 解开表锁

在从上设置主的配置

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;'


# MySQL