Mysql5.7 使用xtrabackup在线添加从节点

本文记录主节点已运行一段时间后,在主节点基本不停机的情况下添加一个从节点。

服务器系统:Centos7.9

Mysql版本:5.7

主节点IP:192.168.2.248

从节点IP:192.168.2.152

一.从节点安装Mysql5.7(和主节点Mysql版本保持一致)
1.1从节点安装Mysql5.7参考官方手册:

MySQL :: MySQL 5.7 Reference Manual :: 2.5.1 Installing MySQL on Linux Using the MySQL Yum Repository

1.2同步主节点配置文件到从节点,并进行调整

注意:保障与主从节点server_id的值不同

#从节点的原配置文件重命名
MV /etc/my.cnf /etc/my.cnf.bak
#拷贝主节点配置文件到从节点
scp root@192.168.2.248:/etc/my.cnf  /etc/

#修改从节点下面参数 VIM /etc/my.cnf
log_slave_updates = on #最好开启
server_id = 1011       #该参数需保障与主节点不同,主节点为1001
gtid-mode=on           #和主节点保持一致,如果主节点已开启后面可以选择使用GTID同步模式


#根据配置文件目录,在从节点创建对应目录
mkdir /data/mysql
chown mysql:mysql /data/mysql
chmod 755 /data/mysql
1.3查看并重置root密码

注:该步在官方安装手册内,如果找不到密码也可以参考下面地址进行修改root密码

Mysql5.7 Access denied for user ‘root‘@‘localhost‘ (using password: YES)-CSDN博客

#超级用户帐户是安装时已创建。超级用户的密码设置并存储在 错误日志文件。若要显示它,请使用以下命令:
sudo grep 'temporary password' /var/log/mysqld.log
#更改root密码,使用生成的临时密码并设置自定义超级用户帐户的密码:
mysql -uroot -p
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!';
注意
默认情况下会安装 validate_password。默认密码策略 由 Requires 实现 密码至少包含一个大写字母,一个 小写字母、一个数字和一个特殊字符,以及 密码总长度至少为 8 个字符。validate_password
二.xtrabackup全量备份主节点库并恢复到从节点

Xtrabackup工具包是一款percona公司开发的MySQL物理备份工具,可以全量备份和增量备份。InnoDB引擎数据表在备份过程中既可以保持事务一致性,又不会对数据库造成锁表,对于MyISAM引擎的数据表无法避免锁表。

2.1安装Xtrabackup工具包

这边主节点是用Xtrabackup2.4版本备份,所以从节点也选择安装2.4版本。

#yum安装xtrabackup
sudo yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
sudo yum install -y percona-xtrabackup-24 
#安装完毕执行,查看版本
xtrabackup -v 

2.2在主节点创建全量备份并流传输到从节点/data/full_bak目录

注:如果主节点实例已有最近全量备份,只需将备份传输到从节点。不需在执行下面命令进行备份。笔者是用前一天的主节点的全量备份进行恢复

如果是生产环境建议闲时执行下面命令进行备份。

# /data/backup/248_bakup 为主节点目录,命令完成后该目录是不占用空间。
#目录/data/full_bak为从节点目录。
/usr/bin/xtrabackup  --defaults-file=/etc/my.cnf --user=root --password=MyNewPass4! --host=192.168.2.248 --port=3306  --stream=xbstream --compress --compress-threads=4 --parallel=4 /data/backup/248_bakup  | ssh root@192.168.2.152 "xbstream -x -C /data/full_bak "
2.3恢复主节点全量备份到从节点并启动数据库

备份集大时解压缩和清理压缩文件强烈建议开启并行,2.5T的库压缩后的备份集有560G左右,开启4并行解压缩花费了2.5H左右。清理压缩忘记开并行3个小时未结束笔者取消后开8个并行1个小时左右结束。都是泪。。。

另外从节点目录需要充足的空间,需要至少双倍数据文件(主节点数据目录大小)大小的空间。

# 1.1恢复准备
#准备完全备份集,准备数据文件达到一致性状态,如果压缩备份准备时必须先解压缩 
xtrabackup --decompress  --parallel=8 --target-dir=/data/full_bak
#清理压缩文件
xtrabackup --decompress --parallel=8 --remove-original --target-dir=/data/full_bak
2.2 准备:
xtrabackup --host=192.168.2.152 --user=root --password=MyNewPass4! --port=3306 --prepare --target-dir=/data/full_bak
2.3 拷回数据,之前先清空数据目录。
rm -rf  /data/mysql/*
xtrabackup --host=192.168.2.152 --user=root --password=MyNewPass4! --port=3306 --datadir=/data/mysql --copy-back --target-dir=/data/full_bak
2.3 修改目录属性启动数据库:
cd /data/mysql 
chown -R mysql:mysql /data/mysql
2.4 启动从节点数据库实例:
systemctl start mysqld
systemctl status mysqld
三.配置主从
3.1主节点创建同步账户

主节点创建同步账户:

--主节点创建复制账户
CREATE USER 'repl'@'*' IDENTIFIED BY 'MyNewPass4!'; --可以把*换成从节点IP最小化登录权限
GRANT REPLICATION SLAVE ON *.*TO repl;

登录从库清理从库的binlog:

--登录从库,清理本地binlog
RESET MASTER;
RESET SLAVE ALL;

3.2建立主从同步关系

查看xtrabackup备份中的xtrabackup_binlog_info文件,此文件中记录了三个重要信息,分别是备份主库时(binlog文件名,最后一个事务ID,最后事务的GTID)

笔者这里分别是:

mysql-bin.000750    

295252964    

a25b1b0f-1005-11ee-bfe6-00505692c8f8:1-308393480,ecdc4be1-3343-11ed-8beb-00505692c786:1-1906676768

root账户登录从节点mysql执行下面语句:

--GTID同步模式设置
SET GLOBAL GTID_PURGED='a25b1b0f-1005-11ee-bfe6-00505692c8f8:1-308393480,ecdc4be1-3343-11ed-8beb-00505692c786:1-1906676768';

CHANGE MASTER TO
MASTER_HOST='192.168.2.248',
MASTER_USER='repl',
MASTER_PASSWORD='MyNewPass4!',
master_auto_position=1;


--平常POS模式设置,如果主节点未开启GTID使用该模式
CHANGE MASTER TO
MASTER_HOST='192.168.2.248',
MASTER_USER='repl',
MASTER_PASSWORD='MyNewPass4!',
MASTER_LOG_FILE='mysql-bin.000750',
MASTER_LOG_POS=295252964;
3.3查看从节点同步状态

Slave_IO_Running: Yes  ;Slave_SQL_Running: Yes;说明从节点启动正常。

 Seconds_Behind_Master: 49515 笔者这边使用前一天的备份binlog文件较多延迟比较大。经过17个小时的追赶已经从180000多延迟追到49515了。从节点目前没有应用连接查询所以没有影响。

(当天晚上已追上,延迟看着是0了)

mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.2.248
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000777
          Read_Master_Log_Pos: 388772662
               Relay_Log_File: hex-db-slave-relay-bin.000061
                Relay_Log_Pos: 381227001
        Relay_Master_Log_File: mysql-bin.000770
             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: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 381226788
              Relay_Log_Space: 4061040280
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 49515
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1001
                  Master_UUID: a25b1b0f-1005-11ee-bfe6-00505692c8f8
             Master_Info_File: /data/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Reading event from the relay log
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: a25b1b0f-1005-11ee-bfe6-00505692c8f8:308393481-318309578
            Executed_Gtid_Set: a25b1b0f-1005-11ee-bfe6-00505692c8f8:1-316029899,
ecdc4be1-3343-11ed-8beb-00505692c786:1-1906676768
                Auto_Position: 1
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

至此对主节点影响可控的情况下从节点添加完成。

分享下主节点循环全量备份shell脚本:

#!/bin/bash
backupDir="/mnt/db_backup/248_mysql_backup/"`date "+%Y-%m-%d"`  #全量备份文件夹
lstbakDir="/mnt/db_backup/248_mysql_backup/"`date -d '-7 day' +%Y-%m-%d`  #前7天的全量备份文件夹
mysqlDir=/data/mysql #mysql数据文件夹
user=root #数据库帐号
password=abc@123 #数据库密码
port=3306 #数据库端口
host=192.168.2.248 #数据库IP 
defaultsFile=/etc/my.cnf #数据库配置文件,用于不在/var/lib/mysql 下的数据库
#检查备份存储服务器上备份目录
function dir_check(){ 
   ssh root@192.168.2.246 "
	#检查当天备份目录,存在则清空,不存在则新建。					   
   if [ ! -d ${backupDir} ];then 
		 mkdir -p ${backupDir}  
     else  
	     cd ${backupDir} && /usr/bin/rm -rf *	 
   fi 
   echo "dir check complete !"
   "
} 
#清理3天前备份
function rm_bak(){ 
   ssh root@192.168.2.246 "
   #清理3天前备份
   if [ -d ${lstbakDir} ];then 
       /usr/bin/rm -rf ${lstbakDir}  
   fi
   echo "expire backup remove complete !"
   "
} 
#全量备份
function backup_full(){	
    /usr/bin/xtrabackup --defaults-file=${defaultsFile} --user=${user} --password=${password} --host=${host} --port=${port}  --stream=xbstream --compress --compress-threads=2 --parallel=2 /data/backup/248_bakup  | ssh root@192.168.2.246 "xbstream -x -C ${backupDir}"   
}
#开始时间
timer_start=`date "+%Y-%m-%d %H:%M:%S"` 
dir_check
backup_full
rm_bak
#结束时间
timer_end=`date "+%Y-%m-%d %H:%M:%S"` 
echo "开始: $timer_start"
echo "结束: $timer_end" 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值