Linux系统上数据库备份脚本(通用)

1.通用版本

#!/bin/bash

# 数据库备份脚本(宝塔计划任务版)
# 安全提示:本脚本不包含禁用命令,可放心使用

# ------ 配置参数(按需修改)------
MYSQL_USER="root"                   # 数据库用户名
MYSQL_PASSWORD="your_db_password"   # 数据库密码
DATABASE_NAME="your_database"       # 要备份的数据库名
BACKUP_DIR="/www/backup/database"   # 备份存储目录
MAX_BACKUPS=7                       # 保留的备份份数(按天数建议改为30)

# ------ 以下内容无需修改 ------
# 创建日期标记
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_FILE="${BACKUP_DIR}/${DATABASE_NAME}_${TIMESTAMP}.sql.gz"

# 创建备份目录
mkdir -p ${BACKUP_DIR}

# 执行数据库备份(压缩格式)
mysqldump -u${MYSQL_USER} -p${MYSQL_PASSWORD} ${DATABASE_NAME} | gzip > ${BACKUP_FILE}

# 清理旧备份(保留MAX_BACKUPS份)
ls -t ${BACKUP_DIR}/${DATABASE_NAME}_*.sql.gz | tail -n +$(($MAX_BACKUPS +1)) | xargs -I {} rm -- {}

# 记录日志(可选)
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 成功创建备份:${BACKUP_FILE}" >> ${BACKUP_DIR}/backup.log

报错:mysqldump: [Warning] Using a password on the command line interface can be insecure.

https://www.codingwithjesse.com/blog/mysql-using-a-password-on-the-command-line-interface-can-be-insecure/ 这是一个警告,mysql:[警告]在命令行界面使用密码可能是不安全的

解决:Coding with Jesse

使用 MySQL 配置文件(推荐)

步骤 1:创建配置文件
nano /root/.my.cnf

添加以下内容:

[client]
user = root
password = your_mysql_password

按 Ctrl+X → Y → Enter 保存

步骤 2:设置文件权限
chmod 600 /root/.my.cnf
步骤 3:修改备份脚本中的 mysqldump 命令
# 原命令:
# mysqldump -u${MYSQL_USER} -p${MYSQL_PASSWORD}...

# 修改为:
mysqldump ${DATABASE_NAME} | gzip > ${BACKUP_FILE}

报错参考

Mysq在使用mysqldump命令备份数据库报错:mysqldump: [Warning] Using a password on the command line interface can be-CSDN博客

2.多功能版本

使用说明

  1. 准备工作

    # 创建安全配置文件(已存在可跳过)
    vi /root/.my.cnf

    输入内容:

    [client]
    user = root
    password = 你的数据库密码

    设置权限:

    chmod 600 /root/.my.cnf
  2. 安装依赖工具(首次使用需要)

    # CentOS
    yum install -y pv
    
    # Ubuntu/Debian
    apt-get install -y pv
  3. 脚本配置

    • 修改 DATABASE_NAME 为实际数据库名

    • 调整 BACKUP_DIR 为合适的备份路径

    • 设置 MAX_BACKUPS 控制保留份数

  4. 运行测试

    chmod +x backup.sh
    ./backup.sh

#!/bin/bash

# =============================================
# 宝塔面板 MySQL 数据库备份脚本(增强版)
# 功能:压缩备份 + 进度显示 + 自动清理 + 日志记录
# =============================================

# ---------------------------
# 用户配置区域(按需修改)
# ---------------------------
DATABASE_NAME="your_database_name"  # 要备份的数据库名
BACKUP_DIR="/www/backup/database"   # 备份存储目录(建议放在数据盘)
MAX_BACKUPS=7                       # 保留的备份份数(按天数换算:7=保留一周)

# ---------------------------
# 高级配置(非必要不修改)
# ---------------------------
MYSQL_CNF="/root/.my.cnf"           # MySQL安全配置文件路径
LOG_FILE="${BACKUP_DIR}/backup.log" # 日志文件路径

# ---------------------------
# 功能函数
# ---------------------------
log() {
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" >> ${LOG_FILE}
}

check_pv() {
    if ! command -v pv &> /dev/null; then
        echo -e "\n\033[31m错误:未安装 pv 工具,请先执行以下命令安装:\033[0m"
        echo "-----------------------------------------"
        echo "CentOS:   yum install -y pv"
        echo "Ubuntu:   apt-get install -y pv"
        echo "-----------------------------------------"
        exit 1
    fi
}

# ---------------------------
# 初始化检查
# ---------------------------
mkdir -p ${BACKUP_DIR}
touch ${LOG_FILE}
log "=== 开始数据库备份任务 ==="

# 检查配置文件是否存在
if [ ! -f "${MYSQL_CNF}" ]; then
    log "错误:MySQL配置文件 ${MYSQL_CNF} 不存在"
    echo -e "\033[31m错误:请先创建MySQL配置文件!\033[0m"
    echo "创建方法:"
    echo "1. 执行 nano ${MYSQL_CNF}"
    echo "2. 添加以下内容:"
    echo "   [client]"
    echo "   user = root"
    echo "   password = 你的数据库密码"
    echo "3. 设置权限:chmod 600 ${MYSQL_CNF}"
    exit 1
fi

# 检查pv工具
check_pv

# ---------------------------
# 获取数据库大小(MB)
# ---------------------------
DB_SIZE=$(mysql --defaults-extra-file=${MYSQL_CNF} -N -e \
    "SELECT ROUND(SUM(data_length + index_length) / 1024 / 1024, 0) \
     FROM information_schema.TABLES \
     WHERE table_schema = '${DATABASE_NAME}';")

if [ -z "${DB_SIZE}" ] || [ "${DB_SIZE}" -eq 0 ]; then
    log "错误:无法获取数据库大小,可能数据库不存在"
    echo -e "\033[31m错误:请检查数据库名称是否正确\033[0m"
    exit 1
fi

# ---------------------------
# 执行备份(带进度条)
# ---------------------------
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_FILE="${BACKUP_DIR}/${DATABASE_NAME}_${TIMESTAMP}.sql.gz"

echo -e "\n\033[34m正在备份数据库:${DATABASE_NAME} (约 ${DB_SIZE}MB)...\033[0m"
mysqldump --defaults-extra-file=${MYSQL_CNF} ${DATABASE_NAME} \
    | pv -s ${DB_SIZE}m -p -t -e -r -b \
    | gzip > ${BACKUP_FILE}

# 检查备份结果
if [ $? -ne 0 ] || [ ! -f "${BACKUP_FILE}" ]; then
    log "错误:备份失败!"
    echo -e "\033[31m错误:备份过程出现异常\033[0m"
    exit 1
fi

# ---------------------------
# 清理旧备份
# ---------------------------
OLD_FILES=$(ls -t ${BACKUP_DIR}/${DATABASE_NAME}_*.sql.gz 2>/dev/null | tail -n +$((${MAX_BACKUPS} +1)))

if [ -n "${OLD_FILES}" ]; then
    echo -e "\n\033[33m正在清理旧备份...\033[0m"
    echo "${OLD_FILES}" | xargs -I {} sh -c "echo '删除:{}'; rm -- {}"
    log "已清理旧备份:$(echo ${OLD_FILES} | tr '\n' ' ')"
fi

# ---------------------------
# 完成输出
# ---------------------------
BACKUP_SIZE=$(du -h ${BACKUP_FILE} | cut -f1)
echo -e "\n\033[32m✔ 备份成功!\033[0m"
echo -e "备份文件:${BACKUP_FILE}"
echo -e "文件大小:${BACKUP_SIZE}"
echo -e "磁盘剩余:$(df -h ${BACKUP_DIR} | awk 'NR==2 {print $4}')"

log "备份完成 → 文件: ${BACKUP_FILE} 大小: ${BACKUP_SIZE}"
log "=== 本次任务成功完成 ===\n"

exit 0

你可能感兴趣的:(笔记,mac,数据库,linux,oracle)