MySQL - 主从复制


个人学习使用

cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core)
----------------------------------------------------------------------
getenforce 
Enforcing
----------------------------------------------------------------------
systemctl status firewalld.service 
   Active: active (running)
----------------------------------------------------------------------
systemctl status NetworkManager
   Active: active (running)
----------------------------------------------------------------------
MySQL
Server version: 5.7.26

一)主从复制的搭建

1.1)节点准备

systemctl start mysqld3307
systemctl start mysqld3308
systemctl start mysqld3309
netstat -tulnp
mysql -S /tmp/mysql3307.sock -e "select @@server_id"
+-------------+
| @@server_id |
+-------------+
|        3307 |
+-------------+
-------------------------------------------------------------------------------------
mysql -S /tmp/mysql3308.sock -e "select @@server_id"
+-------------+
| @@server_id |
+-------------+
|        3308 |
+-------------+
-------------------------------------------------------------------------------------
mysql -S /tmp/mysql3309.sock -e "select @@server_id"
+-------------+
| @@server_id |
+-------------+
|        3309 |
+-------------+

1.2)检查主库二进制日志

mysql -S /tmp/mysql3307.sock -e "select @@log_bin"
+-----------+
| @@log_bin |
+-----------+
|         1 |
+-----------+

1.3)主库建用户

mysql -S /tmp/mysql3307.sock -e "grant replication slave on *.* to repl@'10.0.0.%' identified by '123456'"

1.4)全备主库数据、从库恢复数据

mysqldump -S /tmp/mysql3307.sock -A  --master-data=2 --single-transaction --triggers -R -E --max_allowed-packet=64M >/tmp/full.sql
-------------------------------------------------------------------------------------
mysql -S /tmp/mysql3308.sock < /tmp/full.sql 
-------------------------------------------------------------------------------------
mysql -S /tmp/mysql3309.sock < /tmp/full.sql

1.5)通知从库复制信息,并开启复制线程

  • 范例
help change master to;
-------------------------------------------------------------------------------------
CHANGE MASTER TO
  MASTER_HOST='master2.example.com',
  MASTER_USER='replication',
  MASTER_PASSWORD='password',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='master2-bin.001',
  MASTER_LOG_POS=4,
  MASTER_CONNECT_RETRY=10;
  • 3308
mysql -S /tmp/mysql3308.sock
-------------------------------------------------------------------------------------
CHANGE MASTER TO
  MASTER_HOST='10.0.0.51',
  MASTER_USER='repl',
  MASTER_PASSWORD='123456',
  MASTER_PORT=3307,
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=444,
  MASTER_CONNECT_RETRY=10;
-------------------------------------------------------------------------------------
start slave;
  • 3309
mysql -S /tmp/mysql3309.sock
-------------------------------------------------------------------------------------
CHANGE MASTER TO
  MASTER_HOST='10.0.0.51',
  MASTER_USER='repl',
  MASTER_PASSWORD='123456',
  MASTER_PORT=3307,
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=444,
  MASTER_CONNECT_RETRY=10;
-------------------------------------------------------------------------------------
start slave;

1.6)查看复制状态

mysql -S /tmp/mysql3308.sock -e "show slave status \G" |grep Running:
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
-------------------------------------------------------------------------------------
mysql -S /tmp/mysql3309.sock -e "show slave status \G" |grep Running:
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

二)主从复制监控

  • 主库
show processlist;
---------------------------------
show slave hosts;
  • 从库
show slave status \G;
  • 主库相关信息监控
Master_Host: 10.0.0.51
Master_User: repl
Master_Port: 3307
Master_Log_File: mysql-bin.000005
Read_Master_Log_Pos: 444
  • 从库中继日志的应用状态
Relay_Log_File: db01-relay-bin.000002
Relay_Log_Pos: 485
  • 从库复制线程有关的状态
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Last_IO_Errno: 0
Last_IO_Error: 
Last_SQL_Errno: 0
Last_SQL_Error: 
  • 过滤复制有关的状态
Replicate_Do_DB: 
Replicate_Ignore_DB: 
Replicate_Do_Table: 
Replicate_Ignore_Table: 
Replicate_Wild_Do_Table: 
Replicate_Wild_Ignore_Table: 
  • 主从延时相关状态(非人为)
Seconds_Behind_Master: 0
  • 延时从库有关的状态(人为)
SQL_Delay: 0
SQL_Remaining_Delay: NULL
  • GTID 复制有关的状态
Retrieved_Gid_Set: 
Executed_Gtid_Set: 
Auto_Position: 0

三)主从故障

3.1)IO线程故障

1.连接主库
连接信息错误
网络不通
防火墙
主库连接数上限
2.请求二进制日志
二进制文件丢失、损坏


  • 跳过错误
stop slave
-----------------------------------
set global sql_slave_counter=1;
  • 清除slave信息
stop slave;
------------------------------------
reset slave all;

3.2)SQL线程故障

1.从库发生写入:

  • 新建的对象已存在
  • 操作的对象不存在
  • 约束冲突
stop slave; 
set global sql_slave_skip_counter = 1;
#将同步指针向下移动一个,如果多次不同步,可以重复操作。
start slave;

2.SQL_MODE不兼容
3.参数不兼容


将从库只读

set global read_only=1;
set global super_read_only=1;
--------------------------------------------
show variables like '%read_only%';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_read_only      | OFF   |
| read_only             | ON    |
| super_read_only       | ON    |
| transaction_read_only | OFF   |
| tx_read_only          | OFF   |
+-----------------------+-------+

  • 扩展工具
    pt-table-checksum
    pt-table-sync

3.3)主从延时问题

  • 主库原因:
    1.主库压力大
    2.主库dump是串行,事务并行
    3.长时间锁定

  • 解决方案:
    1.开启GTID,实现并行传输binlog
    2.拆分大事务

  • 从库原因:
    1.SQL线程是串行工作
    2.减少大事务

  • 解决方案:
    5.7版本后新增Logical_clock(LC)功能,多SQL线程回访机制

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 文章内容
    Aspen_Han阅读 275评论 0 0
  • MySQL Replication 主从复制(也称 AB 复制)允许将来自一个MySQL数据库服务器(主服务器)的...
    无边_e15d阅读 406评论 0 0
  • MySQL Replication 主从复制(也称 AB 复制)允许将来自一个MySQL数据库服务器(主服务器)的...
    红衣漫漫阅读 513评论 0 0
  • 一.主从复制简介 为什么使用主从复制?1)高可用2)辅助备份3)分担负载 复制是 MySQL 的一项功能,允许服务...
    唯爱熊阅读 415评论 0 4
  • 一、MySQL主从复制 1.1 为什么需要主从? 数据库损坏了(业务不能使用数据库)原因: 外在原因1. 网络2....
    PickachuDev阅读 684评论 0 0