没想到啊

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  6 随笔 :: 379 文章 :: 97 评论 :: 24万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

#!/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

posted on   没想到啊  阅读(417)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 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的设计模式综述
点击右上角即可分享
微信分享提示