mysql搭建主从和工作过程

公司买了台新的服务器,决定在使用2台数据业务服务器上,再添加一台从库,都是使用mysql5.7,并且使用主从同步、读写分离架构,很不幸这个任务落到了我的头上。

读写分离是在业务代码中实现的,在此不做详述,介绍一下我搭建MySQL主从的过程。

工作原理
(1)从库执行 change master to 语句,会立即将主库信息记录到master.info中
(2)从库执行 start slave语句,会立即生成IO_T和SQL_T
(3)IO_T 读取master.info文件,获取到主库信息
(4)IO_T 连接主库,主库会立即分配一个DUMP_T,进行交互
(5)IO_T 根据master.info binlog信息,向DUMP_T请求最新的binlog
(6)主库DUMP_T,经过查询,如果发现有新的,截取并反回给从库IO_T
(7)从库IO_T会收到binlog,存储在TCP/IP缓存中,在网络底层返回ACK
(8)从库IO_T会更新master.info ,重置binlog位置点信息
(9)从库IO_T会将binlog,写入到relay-log中
(10)从库SQL_T 读取Relay-log.info 文件,获取上次执行过的位置点
(11)SQL_T按照位置点往下执行relaylog日志
(12)SQL_T执行完成后,重新更新relay-log.info
(13)relaylog定期自动清理的功能。

环境介绍:

Master 192.168.0.3  主

Slave  192.168.0.2    从

mysql5.7.26,端口都是3306,配置是4核心8g。

1.修改从库配置文件vim /etc/my.cnf

[mysqld]
basedir=/mysql
datadir=/mysql/data
socket=/tmp/mysql.sock
log_error=/mysql/mysql.log
server_id=7
log-slave-updates=1
port=3306
log_bin=/mysql/mysql-bin
user=mysql
skip_name_resolve
[client]
socket=/tmp/mysql.sock

ps:注意这2个参数 server_id=7 这是个id必须大于主库的id        log-slave-updates=1 这个参数是从库是否记录二进制日志,最好是启动

要是主库没有添加传输帐号,需要添加一个主从之间读取二进制日志的帐号。主库添加

mysql> grant replication slave on *.* to repl@'192.168.0.%' identified by '123';

2.需要主库备份的全备,生产跑业务的话需要控制一个时间段来备份,或者使用之前的全备。

mysqldump -uroot -p123456 -R -E --triggers --master-data=2 --single-transaction -A >/home/db.sql

或者可以在从库服务器上使用远程备份,看各自当时情况。

启动从库,进入从库,开始恢复备份

mysql> set sql_log_bin=0;   关闭当前交互的日志记录
mysql> source /home/db.sql       导入

告诉从库复制的信息,然后执行。

CHANGE MASTER TO
MASTER_HOST='192.168.0.3',
MASTER_USER='repl',
MASTER_PASSWORD='123',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000007',
MASTER_LOG_POS=7793500,
MASTER_CONNECT_RETRY=10;

因为主库一直在运行,全备恢复后需要记录二进制日志的节点pos,以便来次同步

vim /home/db.sql #打开全备文件,找到全备里面的二进制日志pos节点

— CHANGE MASTER TO MASTER_LOG_FILE=’mysql-bin.000007‘, MASTER_LOG_POS=7793500;

开始启动复制线程
mysql> start slave;

检查是否启动成功,从库检查,为yes

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

mysql> show slave status\G

主库检查 是否有这句语句Master has sent all binlog to slave

mysql> show processlist;

到此主从搭建完成,也可以搭建主主,相互恢复。

如果 change master to 信息输入错误,咋办?执行以下命令进行解决。

mysql> stop slave;
mysql> reset slave all;
CHANGE MASTER TO
MASTER_HOST='192.168.0.3',
MASTER_USER='repl',
MASTER_PASSWORD='123',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000007',
MASTER_LOG_POS=7793500,
MASTER_CONNECT_RETRY=10;
mysql> start slave;

最后是mysql> show slave status\G的配置详细讲解

主库的信息(master.info):
Master_Host: 10.0.0.51 主库的IP
Master_User: repl 复制用户名
Master_Port: 3307 主库的端口
Connect_Retry: 10 断连之后重试次数
Master_Log_File: mysql-bin.000001 已经获取得到binlog的文件名
Read_Master_Log_Pos: 444 已经获取得到binlog的位置号

从库的relaylog的信息(relay-log.info):
Relay_Log_File: db01-relay-bin.000002 从库已经运行过的relaylog的文件名
Relay_Log_Pos: 320 从库已经运行过的relaylog的位置点

从库复制线程工作状态:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

过滤复制相关的状态:
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:

从库延时主库的时间:
Seconds_Behind_Master: 0 从库延时主库的时间(秒为单位)

从库线程报错详细信息:
Last_IO_Errno: 0 IO报错的号码
Last_IO_Error: IO报错的具体信息
Last_SQL_Errno: 0 SQL报错的号码
Last_SQL_Error: SQL线程报错的具体原因

延时从库:
SQL_Delay: 0 延时从库设定的时间
SQL_Remaining_Delay: NULL 延时操作剩余时间

GTID复制信息:
Retrieved_Gtid_Set: 接收到的GTID的个数
Executed_Gtid_Set: 执行了的GTID的个数

从库复制线程工作状态:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
从库线程报错详细信息:
Last_IO_Errno: 0 IO报错的号码
Last_IO_Error: IO报错的具体信息
Last_SQL_Errno: 0 SQL报错的号码
Last_SQL_Error: SQL线程报错的具体原因

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值