本文记录主节点已运行一段时间后,在主节点基本不停机的情况下添加一个从节点。
服务器系统:Centos7.9
Mysql版本:5.7
主节点IP:192.168.2.248
从节点IP:192.168.2.152
一.从节点安装Mysql5.7(和主节点Mysql版本保持一致)
1.1从节点安装Mysql5.7参考官方手册:
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"