MySQL定时备份及清理脚本(一劳永逸)-改良版本

一 创建备份路径

        cd /mysql-backup

        mkdir back

        cd back

二 创建日志文件

        vi mysql-backlog.log

        内容为空,保存

三 创建备份脚本

vi save-all-data.sh#!/bin/bash
#source /etc/profile
user="root"
password="LXYlxy2:024.#8u}"
host="127.0.0.1"
port="3306"
db=("test" "test3" "test4" "test9")       #数组表示要备份的数据库
local="--single-transaction"
mysql_path="/usr/local/mysql/bin/mysql"   #Mysql命令路径
backup_path="/mysql-backup/data"          #备份文件存储路径
date=$(date +%Y%m%d_%H%M%S)               #备份文件添加时间戳
day=30                                    #定义保存备份天数
backup_log="/mysql-backup/back/mysql-backlog.log"   #备份日志文件路径if [ ! -e $backup_path ];thenmkdir -p $backup_path
fi
find $backup_path -type f -mtime +$day -exec rm -rf {} \; > /dev/null 2>&1  #/dev/null为特殊设备,输入到该设备内容都会被丢弃,2>:将标准错误输出重定向,$1:标准错误输出到与标准输出相同的地方,结合:将命令的标准输出和标准错误输出都丢弃,不会显示到屏幕和记录到文件中。
echo "开始备份数据库: ${db[*]}"
#使用循环遍历db数组中所有的数据库,调用自定义backup_sql函数备份
backup_sql(){              
dbname=$1          #将函数backup_sql的第一个参数赋值给dbname,即为以下的length
backup_name="${dbname}_${date}.sql"
#--flush-logs:备份前刷新二进制日志,-R:备份时要包括存储过程和函数,保证还原数据完整
/usr/local/mysql/bin/mysqldump -h $host -P $port -u $user -p$password  --default-character-set=utf8 --socket=/data/mysql/tmp/mysqld.sock --flush-logs -R $dbname > $backup_path/$backup_name
if [[ $? == 0 ]];     #$?获取上一个命令退出状态,0为成功,非0为失败thencd $backup_pathtar -czvf $backup_name.tar.gz $backup_name --force-local   #只访问本地文件,本地压缩size=$(du $backup_name.tar.gz -sh | awk '{print $1}')rm -rf $backup_nameecho "$date 备份 $dbname($size) 成功"
elsecd $backup_pathrm -rf $backup_nameecho "$date 备份 $dbname 失败"
fi
}
#先自定义函数,在调用,这里for循环次数由数据库个数决定,backup_sql第一个传递参数$length
length=${#db[@]}     #@获取整个数组的元素,#为获取数据长度,结合起来:返回db中元素个数
for ((i=0;i<$length;i++));do
backup_sql ${db[i]} >> $backup_log 2>&1
done
echo "备份结束,结果查看 $backup_log"
du $backup_path/*$date* -sh | awk '{print "文件:" $2 ",大小:" $1}'   #使用swk切割管道符前命令的第一和二字段

四 脚本赋权,linux自带定时任务工具配置
     

chmod +x save-all-data.sh


        crontab用法:

                crontab -e 编辑工作表

                crontab -l 列出工作表中的命令

                crontab -r 删除工作表

        HELL=/bin/bash

        00 01 * * * /mysql-backup/back/save-all-data.sh

        sed -i 's/\r//g' 命令可以格式化sh文件,用法为:sed -i 's/\r//g' xxx.sh

        save-all-data.sh 指定12:20和01:00定时间点执行,数据库异地备份

        :wq保存文件即可

五 脚本改进:1.按天数区分备份数据2.自动遍历需要备份的数据库 

以下为改良1

#!/bin/bash
#source /etc/profile
user="root"
password="LXYlxy2:024.#8u}"
host="127.0.0.1"
port="3306"
db=("test" "test3" "test4" "test9")       #数组表示要备份的数据库
local="--single-transaction"
mysql_path="/usr/local/mysql/bin/mysql"   #Mysql命令路径
backup_path="/mysql-backup/data"          #备份文件存储路径
date=$(date +%Y%m%d_%H%M%S)               #备份文件添加时间戳
day=30                                    #定义保存备份天数
backup_log="/mysql-backup/back/mysql-backlog.log"   #备份日志文件路径#if [ ! -e $backup_path ];
# then
# mkdir -p $backup_path
#fi
#############改进1:区分每一天的备份文件###################### 
current_date=$(date +%Y%m%d)  # 获取当前日期
daily_backup_path="$backup_path/$current_date"  # 每天备份目录
#只需要将后续使用到$backup_path替换成daily_backup_path,上面的可注释掉
if [ ! -e $daily_backup_path ]; thenmkdir -p $daily_backup_path
fi
##############################################################find $backup_path -type f -mtime +$day -exec rm -rf {} \; > /dev/null 2>&1  #/dev/null为特殊设备,输入到该设备内容都会被丢弃,2>:将标准错误输出重定向,$1:标准错误输出到与标准输出相同的地方,结合:将命令的标准输出和标准错误输出都丢弃,不会显示到屏幕和记录到文件中。
echo "开始备份数据库: ${db[*]}"
#使用循环遍历db数组中所有的数据库,调用自定义backup_sql函数备份
backup_sql(){              
dbname=$1          #将函数backup_sql的第一个参数赋值给dbname,即为以下的length
backup_name="${dbname}_${date}.sql"
#--flush-logs:备份前刷新二进制日志,-R:备份时要包括存储过程和函数,保证还原数据完整
/usr/local/mysql/bin/mysqldump -h $host -P $port -u $user -p$password  --default-character-set=utf8 --socket=/data/mysql/tmp/mysqld.sock --flush-logs -R $dbname > $daily_backup_path/$backup_name
if [[ $? == 0 ]];     #$?获取上一个命令退出状态,0为成功,非0为失败thencd $daily_backup_pathtar -czvf ${backup_name}.tar.gz $backup_name --force-local   #只访问本地文件,本地压缩echo " $?"            #调试:tar命令执行成功,但是一直没有.tar.gz包size=$(du ${backup_name}.tar.gz -sh | awk '{print $1}')rm -rf $backup_nameecho "$date 备份 $dbname($size) 成功"
elsecd $daily_backup_namerm -rf $backup_nameecho "$date 备份 $dbname 失败"
fi
}
#先自定义函数,在调用,这里for循环次数由数据库个数决定,backup_sql第一个传递参数$length
length=${#db[@]}     #@获取整个数组的元素,#为获取数据长度,结合起来:返回db中元素个数
for ((i=0;i<$length;i++));do
backup_sql ${db[i]} >> $backup_log 2>&1
done
echo "备份结束,结果查看 $backup_log"
du -sh $daily_backup_path/*${date}*   | awk '{print "文件:" $2 ",大小:" $1}'   #使用swk切割管道符前命令的第一和二字段

改良2: 

#!/bin/bash
#source /etc/profile
user="root"
password="LXYlxy2:024.#8u}"
host="127.0.0.1"    #要给root权限,host三种设置:1.localhost:本地主机连接(默认) 2.%:所有主机 3.固定IP,这里要给root的host权限设置为2或3,否则下面使用-h 选项会报错
port="3307"
#db=("test" "test3" "test4" "test9")       #数组表示要备份的数据库
#db=($($mysql_path -h $host -P $port -u $user -p$password -e "SHOW DATABASES;" | grep -Ev "Database|information_schema|performance_schema|sys"))
#db放在这里,执行的时候会一直报错为找-h -p -u命令,这是因为脚本是按顺序下来执行local="--single-transaction"
mysql_path="/usr/local/mysql/bin/mysql"   #Mysql命令路径
#db=($($mysql_path -h $host -P $port -u $user -p$password -e "SHOW DATABASES;" | grep -Ev "information_schema|performance_schema|sys"))
#标准输出提示mysql[warning],2>/dev/null 来将标准错误输出重定向到 /dev/null,从而将这个警告信息忽略
#db=($($mysql_path -h $host -P $port -u $user -p$password -e "SHOW DATABASES;" 2>/dev/null | grep -Ev "information_schema|performance_schema|sys"))
#shell脚本中,使用$(命令)来执行命令返回结果,和`命令`效果一样--在shell脚本中,数组存储方式:1.括号赋值 数组=(),2.逐个赋值a[0]="12"3.通过命令的输出来赋值 4.使用declare声明关联数组
db=(`$mysql_path -h $host -P $port -u $user -p$password -e "SHOW DATABASES;" 2>/dev/null | grep -Ev "information_schema|performance_schema|sys"`)
backup_path="/mysql-backup/data"          #备份文件存储路径
date=$(date +%Y%m%d_%H%M%S)               #备份文件添加时间戳
day=30                                    #定义保存备份天数
backup_log="/mysql-backup/back/mysql-backlog.log"   #备份日志文件路径#if [ ! -e $backup_path ];
# then
# mkdir -p $backup_path
#fi
#############改进1:区分每一天的备份文件###################### 
current_date=$(date +%Y%m%d)  # 获取当前日期
daily_backup_path="$backup_path/$current_date"  # 每天备份目录
#只需要将后续使用到$backup_path替换成daily_backup_path,上面的可注释掉
if [ ! -e $daily_backup_path ]; thenmkdir -p $daily_backup_path
fi
##############################################################find $backup_path -type f -mtime +$day -exec rm -rf {} \; > /dev/null 2>&1  #/dev/null为特殊设备,输入到该设备内容都会被丢弃,2>:将标准错误输出重定向,$1:标准错误输出到与标准输出相同的地方,结合:将命令的标准输出和标准错误输出都丢弃,不会显示到屏幕和记录到文件中。
echo "开始备份数据库: ${db[*]}"
#使用循环遍历db数组中所有的数据库,调用自定义backup_sql函数备份
backup_sql(){              
dbname=$1          #将函数backup_sql的第一个参数赋值给dbname,即为以下的length
backup_name="${dbname}_${date}.sql"
#--flush-logs:备份前刷新二进制日志,-R:备份时要包括存储过程和函数,保证还原数据完整
/usr/local/mysql/bin/mysqldump -h $host -P $port -u $user -p$password  --default-character-set=utf8 --socket=/data/mysql/tmp/mysqld.sock --flush-logs -R $dbname > $daily_backup_path/$backup_name 
if [[ $? == 0 ]];     #$?获取上一个命令退出状态,0为成功,非0为失败thencd $daily_backup_pathtar -czvf ${backup_name}.tar.gz $backup_name --force-local   #只访问本地文件,本地压缩echo " $?"            #调试:tar命令执行成功,但是一直没有.tar.gz包size=$(du ${backup_name}.tar.gz -sh | awk '{print $1}')rm -rf $backup_nameecho "$date 备份 $dbname($size) 成功"
elsecd $daily_backup_namerm -rf $backup_nameecho "$date 备份 $dbname 失败"
fi
}
#先自定义函数,在调用,这里for循环次数由数据库个数决定,backup_sql第一个传递参数$length
length=${#db[@]}     #@获取整个数组的元素,#为获取数据长度,结合起来:返回db中元素个数
for ((i=0;i<$length;i++));do
backup_sql ${db[i]} >> $backup_log 2>&1
done
echo "备份结束,结果查看 $backup_log"
du -sh $daily_backup_path/*${date}*   | awk '{print "文件:" $2 ",大小:" $1}'   #使用swk切割管道符前命令的第一和二字段

参考  优秀文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/683120.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QlikSense财务聚合函数:IRR/NPV/XIRR/XNPV

IRR - 脚本函数 IRR() 函数用于返回聚合内部回报率&#xff0c;以揭示迭代于 group by 子句定义的大量记录上的表达式的数值表示的现金流系列。 这些现金流不必是均值&#xff0c;因为它们可用于年金。但是&#xff0c;现金流必须定期出现&#xff0c;例如每月或每年。内部收…

LeetCode879. Profitable Schemes——动态规划

文章目录 一、题目二、题解 一、题目 There is a group of n members, and a list of various crimes they could commit. The ith crime generates a profit[i] and requires group[i] members to participate in it. If a member participates in one crime, that member ca…

《合成孔径雷达成像算法与实现》Figure6.12

clc clear close all参数设置 距离向参数设置 R_eta_c 20e3; % 景中心斜距 Tr 2.5e-6; % 发射脉冲时宽 Kr 20e12; % 距离向调频率 alpha_os_r 1.7; % 距离过采样率 Nrg 320; % 距离线采样数 距离向…

【头歌·计组·自己动手画CPU】三、存储系统设计(HUST)(理论版) 【计算机硬件系统设计】

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎 ❤️关注 &#x1f44d;点赞 &#x1f64c;收藏 ✍️留言 文章目录 一、课程设计目的二、课程设计内容三、课程设计步骤四、课程设计总结 一、课程设计目的 理解计算机…

猫头虎分享:2024年值得程序员关注的技术发展动向分析

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

HarmonyOS鸿蒙学习基础篇 - Column/Row 组件

前言 Row和Column组件是线性布局容器&#xff0c;用于按照垂直或水平方向排列子组件。Row表示沿水平方向布局的容器&#xff0c;而Column表示沿垂直方向布局的容器。这些容器具有许多属性和方法&#xff0c;可以方便地管理子组件的位置、大小、间距和对齐方式。例如&#xff0c…

从C向C++7——继承

一.继承 1.理解继承 C中的继承是类与类之间的关系&#xff0c;是一个很简单很直观的概念&#xff0c;与现实世界中的继承类似&#xff0c;例如儿子继承父亲的财产。 继承可以理解为一个类从另一个类获取成员变量和成员函数的过程。例如类 B 继承于类 A&#xff0c;那么 B 就…

共享指针在项目中实际的用法

共享指针是 C 中一种智能指针&#xff0c;用于管理动态内存。它可以有效防止内存泄漏和悬空指针问题。在实际项目中&#xff0c;共享指针有以下几种常见的用法&#xff1a; 1. 管理对象的生命周期 共享指针可以用来管理对象的生命周期。当最后一个共享指针指向的对象时&#…

Android 10.0 展讯平台长按power电源键开机时间修改

1.前言 在10.0的系统产品开发中,在产品关机的情况下,长按power电源键的情况下,会开启机器然后进入开机流程中,否则就不会开机 ,但是为了防误撞,误开机要求延长长按power电源键开机时间,所以就需要从kernel中来分析下长按开机的相关源码来实现 相关的功能 2.展讯平台长…

2024/2/14

指针练习 1、选择题 1.1、若有下面的变量定义&#xff0c;以下语句中合法的是&#xff08; A &#xff09;。 int i&#xff0c;a[10]&#xff0c;*p&#xff1b; A&#xff09; pa2; B&#xff09; pa[5]; C&#xff09; pa[2]2; D&#xff09; p&(i…

玉米田——状态压缩DP

农夫约翰的土地由 MN 个小方格组成&#xff0c;现在他要在土地里种植玉米。 非常遗憾&#xff0c;部分土地是不育的&#xff0c;无法种植。 而且&#xff0c;相邻的土地不能同时种植玉米&#xff0c;也就是说种植玉米的所有方格之间都不会有公共边缘。 现在给定土地的大小&…

Codeforces Round 924(Div.2) A~E

A.Rectangle Cutting (模拟) 题意&#xff1a; 给出一个长方形&#xff0c;通过平行于原始矩形的一条边进行切割&#xff0c;将该矩形切割成两个边长为整数的矩形。询问是否能通过旋转和移动这两个矩形&#xff0c;得到新的矩形。 分析&#xff1a; 可以发现拼成的新长方形…

Python算法探索:从经典到现代(三)

一、引言 随着信息技术的飞速发展&#xff0c;数据已经成为现代社会不可或缺的资源。Python&#xff0c;作为数据处理和分析的利器&#xff0c;为我们提供了大量强大的库和工具&#xff0c;用于从经典到现代的各种算法探索。本文将带你领略Python在算法领域的魅力&#xff0c;从…

django中配置使用websocket

Django 默认情况下并不支持 WebSocket&#xff0c;但你可以通过集成第三方库如 channels 来实现 WebSocket 功能。channels 是一个 Django 应用&#xff0c;它提供了对 WebSocket、HTTP2 和其他协议的支持。 下面是如何在 Django 项目中使用 WebSocket 的基本步骤&#xff1a;…

算法讲解之哈希表

哈希表简介&#xff1a; 通过以下几个问题来解释~ 1、哈希表是什么&#xff1f; 存储数据的容器。 2、有什么用&#xff1f; “快速”查找某个元素。时间复杂度O(1) 空间复杂度O(N) 3、什么时候使用哈希表 频繁的查找某个数时。 4、怎么用哈希表 第一种就是直接使用哈…

十三、枚举

文章目录 枚举4.1 基础4.2 实现枚举4.3 自定义枚举 枚举 本文为书籍《Java编程的逻辑》1和《剑指Java&#xff1a;核心原理与应用实践》2阅读笔记 枚举是一种特殊的数据&#xff0c;它的取值是有限的&#xff0c;是可以枚举出来的&#xff0c;比如一年有四季、一周有七天。 …

算法导论记录丨16.1 活动选择、877. 石子游戏

16.1 活动选择 最优子结构 活动选择问题的最优子结构意味着问题的最优解包含了其子问题的最优解。具体来说&#xff0c;如果我们有一个按结束时间排序的活动集合 S{a1​,a2​,...,an​}&#xff0c;并且 S’ 是 S 的最大兼容活动子集&#xff0c;那么对于 S′ 中的任何活动aj…

COW AI接入到微信 保姆教程 (部署在服务器,插件安装)

此文章不涉及国外的AI模型&#xff0c;也无需翻墙&#xff0c;跟某AI模型无关&#xff0c;审核大哥别弄错了 最近的AI开始越开越火了&#xff0c;开始介入到我们生活中的方方面面。就有人好奇AI是否能接入到微信吗&#xff1f;我在GitHub上搜索的时候还真有除了对话外还可以通…

MySQL 基础知识(五)之数据增删改

目录 1 插入数据 2 删除数据 3 更改数据 创建 goods 表 drop table if exists goods; create table goods ( id int(10) primary key auto_increment, name varchar(14) unique, stockdate date )charsetutf8; 1 插入数据 当要插入的数据为日期/时间类型时&#xff0c;如果…

Spring Boot 笔记 021 项目部署

1.1 引入坐标&#xff0c;并双击package打包成jar包 1.2 在服务器上运行jar包 1.3 使用postman测试 2.1 运行配置 2.1.1 命令更改端口 java -jar big-event-1.0-SNAPSHOT.jar --server.port7777 2.1.2 环境变量更新&#xff08;略&#xff09; 2.1.3 外部配置文件&#xff0c…