Shell脚本一键备份MySQL指定库&全库备份

本文分享了对公司备份脚本的优化技巧,包括设置cron定时执行、使用mysqldump备份数据库、路径管理和免密SSH传输,以及保留期限策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在我公司原来的备份脚本做的优化改动给大家分享下

使用时注意变量 ,配合cron执行脚本实现备份效果

备份指定数据库

#!/bin/bash

export PATH=/bin:/usr/bin:/usr/local/bin

TODAY=$(date +%Y-%m-%d)

date=$(date +%s)

echo "Backup date: $TODAY"

################## 这块根据自己情况修改 ########################
#备份路径
DB_BACKUP_PATH='/home/backup/'
#数据库地址
MYSQL_HOST='localhost'
#端口
MYSQL_PORT='3306'
#数据库用户
MYSQL_USER='root'
#数据库密码
MYSQL_PASSWORD='123456'

# 需要备份的库
DATABASES=( "data" "manage" "base" "engine" "cloud" "nacos")
#删除大于多少天的备份
BACKUP_RETAIN_DAYS=25

#################################################################

mkdir -p "$DB_BACKUP_PATH/$TODAY"
echo "Backup directory creation done. Start backup."

# 这里注意自己mysqldump的路径
for DATABASE_NAME in "${DATABASES[@]}"; do
  /usr/local/mysql/bin/mysqldump --single-transaction -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" "$DATABASE_NAME" | gzip > "$DB_BACKUP_PATH/$TODAY/$DATABASE_NAME-$TODAY.sql.gz"

  if [ $? -eq 0 ]; then
    echo "Database backup for $DATABASE_NAME done"
  else
    echo "Error while backing up $DATABASE_NAME"
    exit 1
  fi
done

# 提前做免密
# ssh-keygen -t rsa 一直回车
# ssh-copy-id root@172.11.17.43  发送到远程服务器防止单点故障
for DATABASE_NAME in "${DATABASES[@]}"; do
  scp -r "$DB_BACKUP_PATH/$TODAY" root@172.11.17.43:/home/backup
done

# 删除目录年龄大于25天的备份
find "$DB_BACKUP_PATH" -type d -mtime +$BACKUP_RETAIN_DAYS -exec rm -rf {} \;

MySQL全库备份

#!/bin/bash

# 设置数据库参数
DB_USER="root"      # 数据库用户名
DB_PASSWORD="Vm123456"  # 数据库密码
BACKUP_PATH="/backup/mysql-sit/mysql-33"  # 本地备份文件存储路径

# 远程服务器参数
REMOTE_USER="root"  # 远程服务器用户名
REMOTE_HOST="192.168.1.134"  # 远程服务器IP地址或主机名
REMOTE_PATH="/backup/mysql/"  # 远程服务器上的目标路径

# 当前日期,用于命名备份文件和目录
CURRENT_DATE=$(date +"%Y-%m-%d")

# 创建日期命名的本地备份目录
DATE_BACKUP_PATH="$BACKUP_PATH/$CURRENT_DATE"
mkdir -p "$DATE_BACKUP_PATH"

# 获取所有数据库列表,并循环备份每一个数据库
echo "正在检索数据库列表..."
mysql -u "$DB_USER" -p"$DB_PASSWORD" -e 'SHOW DATABASES;' | grep -Ev 'Database|information_schema|performance_schema|mysql|sys' | while read dbname; do
    if [ -n "$dbname" ]; then
        echo "正在备份数据库:$dbname"
        mysqldump -u "$DB_USER" -p"$DB_PASSWORD" --databases "$dbname" --routines --triggers | gzip > "$DATE_BACKUP_PATH/${dbname}_$CURRENT_DATE.sql.gz"
        if [ $? -eq 0 ]; then
            echo "数据库 $dbname 备份成功。"
        else
            echo "数据库 $dbname 备份失败。"
        fi
    fi
done

echo "所有数据库备份完成。"

# 使用scp将备份文件传输到远程服务器
echo "正在传输备份文件到远程服务器..."
scp "$DATE_BACKUP_PATH"/* "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH"

if [ $? -eq 0 ]; then
    echo "备份文件成功传输到远程服务器。"
else
    echo "备份文件传输失败。"
    exit 1
fi

echo "正在删除超过7天的备份文件..."
find "$BACKUP_PATH" -type d -mtime +7 -exec rm -rf {} \;

if [ $? -eq 0 ]; then
    echo "成功删除超过7天的备份文件。"
else
    echo "删除备份文件时出现问题。"
fi

echo "所有操作完成。"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值