#!/bin/bash
#
# filename: backupmysql.sh
#
# 功能:备份数据库,并且自动删除指定天数前的备份,支持以库或表的备份方式
# 注意:该脚本在运行过程中会锁定所有的表不让写入.
#
# 使用:
# 1:"backupmysql.sh db"
# 将每个库导为单个文件进行备份,在库数据量不是很大的推荐使用
# 2:"backupmysql.sh table"
# 将库中的每个表导为单个文件进行备份,在库数据量很大时推荐使用
# 3:建议将这个脚本加到Crontab中,每天半夜运行。
#
# 作者:V哥
# 时间:2011-10-20
# URL: http://www.myquickphp.com/?a=blogview&id=24
#
# ========== 相关配置 ==========
# mysql 用户名/密码/主机/端口
V_MYSQL_NAME="root"
V_MYSQL_PASS=""
V_MYSQL_HOST="localhost"
V_MYSQL_PORT=3306
# mysql/mysqldump 命令的路径,不在PATH中请指定如: /usr/local/mysql/bin/mysqldump
V_MYSQL="mysql"
V_MYSQL_DUMP="mysqldump"
# 要备份的数据库名格式为 "db1 db2" 如果要备份所有的库则请用 "%"
V_BAK_DB="db1 db2"
# 备份文件保存的路径,一定要可写,并且空间足够
V_BAK_PATH="/data/dbbackup"
# 备份文件最多保留多少天内的
V_EXPIR_DAY=30
# ======== 以下开始备份 =========
# 组合命令
C_MYSQLDUMP="$V_MYSQL_DUMP -u$V_MYSQL_NAME -P$V_MYSQL_PORT -h$V_MYSQL_HOST"
C_MYSQL="$V_MYSQL -u$V_MYSQL_NAME -P$V_MYSQL_PORT -h$V_MYSQL_HOST"
if [ "$V_MYSQL_PASS" != "" ];then
C_MYSQLDUMP="$C_MYSQLDUMP -p$V_MYSQL_PASS"
C_MYSQL="$C_MYSQL -p$V_MYSQL_PASS"
fi
# 导出时锁定所有表的参数
C_MYSQLDUMP="$C_MYSQLDUMP --lock-tables --default-character-set=utf8"
# 当前的时间值
V_CDATE=`date -d now +%Y%m%d`
# 创建一个目录用于临时存放文件
V_SAVE_PATH="${V_BAK_PATH}/${V_CDATE}"
mkdir $V_SAVE_PATH -p
# 函数定义:执行DUMP操作,调用这个函数前必需定义 V_ALL_DBS 这个变量
function fun_dump_db(){
# 导出SQL
for DB in $V_ALL_DBS
do
# 临时SQL文件名
V_SQL_FILE="${V_SAVE_PATH}/${DB}.sql"
eval "$C_MYSQLDUMP --databases $DB > $V_SQL_FILE"
done
}
# 函数定义:执行DUMP操作,调用这个函数前必需定义 V_ALL_DBS 这个变量
function fun_dump_table(){
# 导出SQL
for DB in $V_ALL_DBS
do
# 创建对应的库目录
V_DB_PATH="${V_SAVE_PATH}/${DB}"
mkdir $V_DB_PATH -p
# 得到库中的所有表
V_CMD="$C_MYSQL -e'show tables from $DB' | awk '{print \$0}' | sed -n '2,\$p'"
V_ALL_TABLES=`eval "$V_CMD"`
# 导出表
for TABLE in $V_ALL_TABLES
do
# 临时SQL文件名
V_SQL_FILE="${V_DB_PATH}/${TABLE}.sql"
eval "$C_MYSQLDUMP $DB $TABLE > $V_SQL_FILE"
done
done
}
# 函数定义:将所有导出的SQL压缩后删除过期的
function fun_tar_file(){
# 进入到备份目录后再操作,保证安全性
cd $V_BAK_PATH
# 压缩打包
tar zcf ${V_CDATE}.tar.gz $V_CDATE
# 删除临时文件目录
rm -rf $V_CDATE
# 得到过期日期
V_ED=`date -d "-${V_EXPIR_DAY} days" +%Y%m%d`
# 得到过期的文件名
V_EXPIR_FILE="${V_ED}.tar.gz"
# 如果过期文件存在就删除
if [ -f $V_EXPIR_FILE ];then
rm -f $V_EXPIR_FILE
fi
}
# 得到备份选择,如果没有输参数则默认是以库的方式备份
if [ $# -eq 0 ];then
V_OPT="db"
else
V_OPT="$1"
fi
# ============= 备份主过程调用 ==========
if [ "$V_BAK_DB" = "%" ];then
# 得到所有的数据库
V_CMD="$C_MYSQL -e'show databases' | awk '{print \$0}' | sed -n '2,\$p'"
V_ALL_DBS=`eval "$V_CMD"`
else
# 备份指定的库
V_ALL_DBS=$V_BAK_DB
fi
# ============= 根据选择来使用不同的备份类型 =====
if [ $V_OPT = "db" ];then
# 以库方式备份
fun_dump_db
else
# 以表方式备份
fun_dump_table
fi
# ============= 执行压缩备份 =====
fun_tar_file
# 打完收工
exit 0
转自:http://www.vquickphp.com/?a=blogview&id=24
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述