侧边栏壁纸
  • 累计撰写 208 篇文章
  • 累计创建 16 个标签
  • 累计收到 5 条评论

目 录CONTENT

文章目录

AWS RDS 定期备份binlog日志,用于及时查找定位问题

Wake
2022-08-12 / 0 评论 / 0 点赞 / 726 阅读 / 1,204 字

前言:亚马逊 RDS 有着一些比较不合理的地方,在使用亚马逊数据库的过程中会有一些坑会踩进去。特别是对于出了问题后的日志排查分析过程,所以数据库的日志变得至关重要。亚马逊的RDS的数据库日志,binlog日志默认是不打开的,所以在创建数据库的时候一定要及时更换参数组,并将binlog日志开启。虽然在创建过程中,对于数据库的常规日志,慢查询日志和错误日志都可以放在cloudwatch上永久保留,但是在数据库的管理控制后台下,数据库的常规日志,错误日志,慢查询日志只能保存1天,即实行24小时轮换的方法。如果出了问题没有第一时间保存下载日志将会非常棘手。只能不断通过还原数据库,找到出问题前后的数据库日志,比较费事费力。直接查看数据库里面的mysql数据库的general log是能快速找到问题的关键,方法是还原到出问题后一天的时间里,就能查看导出数据库里面的详细日志了。一般情况下,亚马逊提供的数据库日志都很难能够看得出问题,必须找到RDS内mysql库里面的常规日志。所以主账号就变得至关重要,不能分配主账号给业务使用。 前面说了这么多,只是想说明如果对于业务数据库,一旦出了问题,数据库遭到了篡改,那么数据库常规日志和binlog日志就成为了能快速找到问题的关键。前面知道了mysql里面有保留常规日志的方法。但是,这个常规日志也是会定期删除的,不会一直保留,可能只有一两天的数据。所以数据库还原的时间点也是需要选择好的。 那么我们能不能从binlog日志入手呢。既然是重要的业务日志,那么我们必须自己这边备份存储好binlog日志,出问题了可以第一时间导出来,节省时间。

方法: 这里我是创建了一台内网想通的服务器用于内部导出binlog日志进行存放,同时编写脚本,清除45天前的多余文件,从而节省硬盘空间。 1.binlog日志导出的脚本:

#!/bin/sh
BACKUP_BIN=/usr/bin/mysqlbinlog
LOCAL_BACKUP_DIR=/backup/binlog$(date +%Y%m%d)  #由于rds 的binlog文件太碎了,所以需要做根据日期的日志切割
BACKUP_LOG=/backup/binlog/backuplog
REMOTE_HOST=xxx.xxx.xxx.xxx
REMOTE_PORT=3306
REMOTE_USER=xxxxx
REMOTE_PASS='xxxxxxxx'
FIRST_BINLOG=mysql-bin-changelog.197995 #这里需要查找数据的binlog的文件是从那个序号开始生成的,否则会报错
#出现错误后 30秒后进行重新连接的尝试
SLEEP_SECONDS=30    
##create local_backup_dir if necessary
mkdir -p ${LOCAL_BACKUP_DIR}
cd ${LOCAL_BACKUP_DIR}
## 运行while循环,连接断开后等待指定时间,重新连接
while :
do
if [ `ls -A "${LOCAL_BACKUP_DIR}" |grep 'mysql-bin' |wc -l` -eq 0 ];then
LAST_FILE=${FIRST_BINLOG}
else
LAST_FILE=`ls -l ${LOCAL_BACKUP_DIR} | grep 'mysql-bin' | tail -n 1 |awk '{print $9}'`
fi
${BACKUP_BIN} --raw --read-from-remote-server --stop-never --host=${REMOTE_HOST} --port=${REMOTE_PORT} --user=${REMOTE_USER} --password=${REMOTE_PASS} ${LAST_FILE}
echo "`date +"%Y/%m/%d %H:%M:%S"` mysqlbinlog停止,返回代码:$?" | tee -a ${BACKUP_LOG}
echo "${SLEEP_SECONDS}秒后再次连接并继续备份" | tee -a ${BACKUP_LOG}
sleep ${SLEEP_SECONDS}
done

假设脚本定在/home/wiki/binlog.sh下 2.使用supervisor 拉起脚本,并结合crontab,实现每天0点自动重启脚本,实现文件夹日期的变更,实现日志的日期切割。

[program:binlogsync] ;程序名称,终端控制时需要的标识
command=/bin/bash /usr/local/mysqlbinlog.sh ; 运行程序的命令
directory=/usr/local ; 命令执行的目录
autorestart=true ; 程序意外退出是否自动重启
stderr_logfile=/var/log/sync.err.log ; 错误日志文件
stdout_logfile=/var/log/sync.out.log ; 输出日志文件
environment=ASPNETCORE_ENVIRONMENT=Production ; 进程环境变量
user=root ; 进程执行的用户身份
stopsignal=INT

crontab 定时任务设置: 0 0 * supervisorctl restart binlogsync

3.设置定期删除文件脚本,超过45天的目录进行删除

#!/bin/bash
location=/backup/
find $location -mtime +60 -print | xargs rm -rf //-mtime

crontab 定时认为设置: 0 9 * sudo /bin/bash /usr/local/del.sh

0

评论区