mysql定时备份脚本
概述
整理Mysql数据库备份脚本,用在生产环境数据库定时备份。
参考
链接: 安全管理MySQL凭证:使用mysql_config_editor设置login-path
创建MySQL凭证
创建凭证
- mysql_config_editor设置凭证
./mysql_config_editor set --login-path=local --host=localhost --socket=/data/mysqldb/tmp/mysql.sock --user=root --password
- 输入mysql 用户密码
Enter password:
- 查看创建的凭证
./mysql_config_editor print --all
[local]
user = "root"
password = *****
host = "localhost"
socket = "/public/mysqldb/tmp/mysql.sock"
验证凭证
./mysql --login-path=local
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.4.1 MySQL Community Server - GPLCopyright (c) 2000, 2024, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql>
创建备份脚本
脚本工作流程
- 初始化环境变量
- 定义脚本参数
- 根据参数,备份每个数据库并打包压缩备份文件
- 根据参数,删除超出保存期限的数据库备份文件
- 根据参数,删除超出保存期限的脚本执行日志
脚本内容
- 创建目录和脚本文件
- 创建目录
mkdir -p /public/script/logs && cd /public/script
- 创建脚本
vim mysql_backup.sh
- 输入以下内容
#!/bin/bash# 需要调试时,取消注释,前台运行脚本
#set -x ##################################################################################################################
#
# 备份mysql数据库脚本
# 1. 使用 mysql_config_editor定义mysql的user和password
# 2. 定义需要备份的数据库和保留时间
# 3. 备份定义的数据库并打包压缩
# 4. 备份成功后,删除旧备份文件和脚本日志
# 5. crontab -e 定时样例:
# 10 0 * * * /public/script/mysql_backup.sh >> /public/script/logs/mysql_$(date +"\%Y-\%m-\%d").log 2>&1 &
#
################################################################################################################### 定义环境变量,请确认使用路径正确
PATH=/usr/java/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/mysql/bin:/usr/local/mysql/lib
export PATH# 定义备份数据库名字的列表,多个数据库用空格分开。
DBS="db1 db2 db3"# 定义脚本路径和备份存储路径
SCRIPT_HOME="/public/script"
BAK_HOME="/public/mysqlbackup" # 检查是否存在日志目录
if [ ! -d "$SCRIPT_HOME/logs" ]; thenmkdir -p $SCRIPT_HOME/logs
fi# 定义脚本变量
CURRENT_DATE=$(date +"%Y-%m-%d")
RETAIN_DAY=3 #保留最近几天的备份,最长不超过7天
LOG_RETAIN_DAY=14 # 脚本执行日志保留天数
LOG_FILE=$SCRIPT_HOME/logs/mysql_${CURRENT_DATE}.log# 开始执行
DATE_TIME=$(date +"%Y-%m-%d %H:%M:%S")
echo -e "\n $DATE_TIME: #### Begin backup $DBS ###" >> $LOG_FILE## 判断备份目录是否存在,不存时新建目录
[ ! -d $BAK_HOME ] && mkdir -p $BAK_HOME
cd $BAK_HOME #转到备份目录 ## 循环备份DBS中定义的数据库
for DBNAME in $DBS; doDATE_TIME=$(date +"%Y-%m-%d %H:%M:%S")echo -e "\n $DATE_TIME: #### Start backup $DBNAME ###" >> $LOG_FILEBACKUP_NAME=mysql_${DBNAME}_${CURRENT_DATE}## 备份单个数据库,使用--login-path 方式认证mysqldump --login-path=local --single-transaction $DBNAME > $BAK_HOME/${BACKUP_NAME}.sqlif [ $? -ne 0 ];then #$? 代表上一个shell命令的执行的返回值。0表示执行成功。其他表示错误。并将结果写入到日志中。 DATE_TIME=$(date +"%Y-%m-%d %H:%M:%S")echo -e "\n $DATE_TIME: ${CURRENT_DATE} $DBNAME mysqldump failed">>$LOG_FILEbreakelseDATE_TIME=$(date +"%Y-%m-%d %H:%M:%S")echo -e "\n $DATE_TIME: ${CURRENT_DATE} $DBNAME mysqldump sucess">>$LOG_FILE fi ## 打包压缩备份文件(如果库大,压缩需要谨慎处理)tar -zcf ${BACKUP_NAME}.tar.gz ${BACKUP_NAME}.sqlif [ $? -eq 0 ];thenrm -f ${BACKUP_NAME}.sqlDATE_TIME=$(date +"%Y-%m-%d %H:%M:%S")echo " $DATE_TIME: Compress ${BACKUP_NAME}.tar.gz sucess">>$LOG_FILEelseDATE_TIME=$(date +"%Y-%m-%d %H:%M:%S")echo " $DATE_TIME: Compress ${BACKUP_NAME}.tar.gz failed">>$LOG_FILEbreakfi## 如果存在上一步打包的压缩文件。查找保留天数-7天之间的旧备份压缩包并删除if [ -f "${BACKUP_NAME}.tar.gz" ];thenfor ((i=${RETAIN_DAY}; i<=7; i++)); doRETAIN_DATE=$(date -d "-$i day" +"%Y-%m-%d")DELETE_BACKUP_NAME=mysql_${DBNAME}_${RETAIN_DATE}if [ -f "${DELETE_BACKUP_NAME}.tar.gz" ]; thenrm -f ${DELETE_BACKUP_NAME}.tar.gzif [ $? -eq 0 ];thenDATE_TIME=$(date +"%Y-%m-%d %H:%M:%S")echo " $DATE_TIME: Delete ${DELETE_BACKUP_NAME}.tar.gz sucess">>$LOG_FILEelseDATE_TIME=$(date +"%Y-%m-%d %H:%M:%S")echo " $DATE_TIME: Delete ${DELETE_BACKUP_NAME}.tar.gz failed">>$LOG_FILEfifidone;fiDATE_TIME=$(date +"%Y-%m-%d %H:%M:%S")echo -e "\n $DATE_TIME: #### Finish backup $DBNAME ###" >> $LOG_FILEdone;## 删除脚本执行历史日志
find $SCRIPT_HOME/logs -maxdepth 1 -mtime +$LOG_RETAIN_DAY -name "mysql_*.log" -execdir rm -rf {} \;DATE_TIME=$(date +"%Y-%m-%d %H:%M:%S")
echo -e "\n $DATE_TIME: #### End backup ###" >> $LOG_FILE
- 脚本文件添加执行权限
chmod +x mysql_backup.sh
添加定时任务
- 编辑crontab定时任务
crontab -e
- 添加以下内容
10 0 * * * /public/script/mysql_backup.sh >> /public/script/logs/mysql_$(date +"\%Y-\%m-\%d").log 2>&1 &
- 手动执行验证
- 注意:手动执行时不需要 “\” 禁止转义
/public/script/mysql_backup.sh >> /public/script/logs/mysql_$(date +"%Y-%m-%d").log 2>&1 &
- 如果脚本执行失败,可以取消脚本中 #set -x 的注释,在前台执行脚本进行调试
- 查看执行结果
[root@localhost logs]# pwd
/public/script/logs
[root@localhost logs]# tail -n200 mysql_2024-08-01.log
2024-08-01 11:12:26: #### Begin backup db1 db2 db3 ###2024-08-01 11:12:26: #### Start backup db1 ###2024-08-01 11:12:26: 2024-08-01 db1 mysqldump sucess2024-08-01 11:12:26: Compress mysql_db1_2024-08-01.tar.gz sucess2024-08-01 11:12:26: #### Finish backup db1 ###2024-08-01 11:12:26: #### Start backup db2 ###2024-08-01 11:13:25: 2024-08-01 db2 mysqldump sucess2024-08-01 11:14:11: Compress mysql_db2_2024-08-01.tar.gz sucess2024-08-01 11:14:11: #### Finish backup db2 ###2024-08-01 11:22:28: #### Start backup db3 ###2024-08-01 11:22:29: 2024-08-01 db3 mysqldump sucess2024-08-01 11:22:29: Compress mysql_db3_2024-08-01.tar.gz sucess2024-08-01 11:22:29: Delete mysql_db3_2024-07-27.tar.gz sucess2024-08-01 11:22:29: Delete mysql_db3_2024-07-26.tar.gz sucess2024-08-01 11:22:29: #### Finish backup db3 ###2024-08-01 11:22:29: #### End backup ###
相关文章:
mysql定时备份脚本
概述 整理Mysql数据库备份脚本,用在生产环境数据库定时备份。 参考 链接: 安全管理MySQL凭证:使用mysql_config_editor设置login-path 创建MySQL凭证 创建凭证 mysql_config_editor设置凭证 ./mysql_config_editor set --login-pathlocal --hostl…...
云原生 (1)
一、实验准备 1,准备一台rhel7的主机,并开启主机的图形。 2,关闭vmware DHCP功能。 3,配置好可用IP。 4,关闭火墙。 二、安装图形化kickstart自动安装脚本的工具 1. 基础配置 yum install system-config-kickstart ——安…...
gitlab-pages创建静态站点
配置.gitlab-ci.yml image: fe-image/node:2.8.2 # 表示使用有 nodejs 环境的 docker,python等也有其他的 docker。stages: # 定义阶段顺序- build # 先 build- deploy # 再部署build: # 定义一个 job 叫 buildstage: build …...
Python爬虫技术 案例集锦
让我们通过几个实际的案例来说明如何使用Python编写网络爬虫。这些案例将涵盖从简单的静态网页爬取到较为复杂的动态网站交互,并且还会涉及到数据清洗、存储和分析的过程。 案例 1: 简单的静态网页爬虫 假设我们需要从一个简单的静态新闻网站上抓取文章标题和链接…...
实战OpenCV之环境安装与配置
OpenCV是什么 OpenCV,英文全称为Open Source Computer Vision Library,是一个开源的计算机视觉和机器学习软件库。它设计用于提供一系列功能强大的算法,以帮助开发者处理图像和视频数据,实现各种视觉任务,包括…...
Android应用开发面试之Jetpack面试题分析汇总
Jetpack作为Android开发的一个重要框架,其相关问题在Android原生开发面试中也非常常见。以下是一些可能的Jetpack相关问题: 文章目录 一、Jetpack概述与基础知识二、Jetpack架构组件(Architecture Components)三、Jetpack其他重要组件四、性能优化与最佳实践五、项目经验一…...
【数据结构】栈的概念、结构和实现详解
本文来介绍一下数据结构中的栈,以及如何用C语言去实现。 1. 栈的概念及结构 栈:一种特殊的线性表,它只允许在固定的一端进行插入和删除元素的操作。 进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。 栈中元素遵循后进先出…...
LeetCode 每日一题 2024/7/29-2024/8/4
记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录 7/29 682. 棒球比赛7/30 2961. 双模幂运算7/31 3111. 覆盖所有点的最少矩形数目8/1 LCP 40. 心算挑战8/2 3128. 直角三角形8/3 3143. 正方形中的最多点数8/4 572. 另一棵树…...
Golang死锁vs操作系统死锁
目录 一、死锁 二、Golang死锁场景 2.1 重复上锁 2.2 不会减少的 WaitGroup 2.3 空select 2.4 channel 一、死锁 1.golang中死锁的触发条件: 死锁是当 Goroutine 被阻塞而无法解除阻塞时产生的一种状态。 2.操作系统死锁: 发生死锁时,线…...
c/c++中π怎么定义
c/c中都没有π的专属变量,一般都是自定义。 方法1:#define pi 3.1415926 方法2:使用反三角函数const double pi acos(-1.0);...
基于whisper流式语音识别
为了实现持续监听麦克风并在检测到声音时进行转录,我们可以将流的监听时间设置为无限长。通过使用一个音量门限来检测是否有声音,然后进行转录。 安装依赖 确保安装必要的库: pip install torch torchaudio openai-whisper sounddevice nu…...
Web3 市场暴跌的时候,哪些token跌的少,哪些还涨了? binance 数据爬取及分析
我爬取了 binance 的一千多个币对信息,提取了以 usdt 计价单位的token,然后统计了一下各个 token 的涨跌情况,发现了2个逆势上涨的token,以及一些跌幅比btc,eth少的种类; 跌幅比btc,eth少的种类…...
ffmpeg获得视频的音频文件
要从视频文件中提取音频文件,你可以使用 FFmpeg,这是一个强大的多媒体框架,用于转换、流化以及处理多媒体数据。下面是如何使用 FFmpeg 从视频文件中提取音频的步骤: 1. 确定视频文件的位置: 确保你知道视频文件的完整…...
Robot Operating System——深度解析单线程执行器(SingleThreadedExecutor)执行逻辑
大纲 创建SingleThreadedExecutor新增Nodeadd_nodetrigger_entity_recollectcollect_entities 自旋等待get_next_executablewait_for_workget_next_ready_executableTimerSubscriptionServiceClientWaitableAnyExecutable execute_any_executable 参考资料 在ROS2中,…...
【TS】使用npm全局安装typescript
查看npm安装 npm -v 安装typescript npm i -g typescript 查看安装 tsc 这就是标致着安装完成。...
安全用户角色权限
$PATH 搞系统设置设置⾥头path ⽬标包含mysql 可执⾏⽂件,那么就是由使⽤ 在终端使⽤ ./bin/mysql -h192.168.71.164 -P3306 -uroot -proot 1.远程登录前提条件是mysql.user表中的host属性为%,如果是 localhost就不允许远程登录,update…...
代理模式学习
代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象…...
深入理解Go 语言信号量 Semaphore
1. 什么是信号量 信号量的概念是荷兰计算机科学家 1.1 P/V 操作 Dijkstra 在他的论文中为信号量定义了两个操作 : P 和 V 。 1.2 信号量和互斥锁的区别与联系 信号量有两种类型:二元信号量和计数信号量。 2. 信号量的 channel 实现 程序在运行时,…...
VisualStudio2019下载与安装
1.下载 通过百度网盘分享的文件:VisualStudio2019 链接:https://pan.baidu.com/s/16tqm0ZsOkmXTfGmi4LnGbA 提取码:wx60 --来自百度网盘超级会员V3的分享 2.安装...
李宏毅老师机器学习常见英语词汇
目录 1.Regression :回归2.Classification:分类3.local minima:局部最小值4.saddle point:鞍点5.ground truth:它是机器学习算法的参考标准,用于衡量模型的性的和判断模型的准确性6.optimization:优化 1.Regression :回归 2.Clas…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
