MySQL数据库自动备份方法

MySQL数据库自动备份方法

有过一次被黑客劫持数据库并勒索比特币的经历后,才知道数据备份的重要性

记录一下方法

一、编写备份脚本

创建一个Shell脚本文件(例如 /opt/scripts/mysql_backup.sh),内容如下:

sh 复制代码
#!/bin/bash

# 数据库配置
DB_USER="your_username"
DB_PASSWORD="your_password"

# 获取所有数据库列表(排除系统数据库)
DB_LIST=$(mysql -u$DB_USER -p$DB_PASSWORD -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|mysql|sys)")

# 备份配置
BACKUP_DIR="/path/to/your/backup/directory"
DATE=$(date +"%Y%m%d")

# 创建日期目录
TODAY_DIR="$BACKUP_DIR/$DATE"
mkdir -p $TODAY_DIR

# 循环备份每个非系统数据库
for DB_NAME in $DB_LIST; do
    BACKUP_FILE="$TODAY_DIR/${DB_NAME}.sql.gz"
    mysqldump -u$DB_USER -p$DB_PASSWORD $DB_NAME | gzip > $BACKUP_FILE
done

# 清理30天前的旧备份
find $BACKUP_DIR -type d -name "20*" -mtime +30 -exec rm -rf {} \; 2>/dev/null

注意,以上是备份所有的非系统数据库

如果想备份单个数据库,可以简单点,如下:

sh 复制代码
#!/bin/bash

# 数据库配置
DB_USER="your_username"
DB_PASSWORD="your_password"
DB_NAME="your_database_name"

# 备份配置
BACKUP_DIR="/path/to/your/backup/directory" # 请替换为你的目标目录
DATE=$(date +"%Y%m%d_%H%M%S")
BACKUP_FILE="$BACKUP_DIR/${DB_NAME}_backup_$DATE.sql"

# 执行备份
mysqldump -u$DB_USER -p$DB_PASSWORD $DB_NAME > $BACKUP_FILE

# (可选)压缩备份文件以节省空间
gzip $BACKUP_FILE

# (可选)清理超过N天的旧备份,例如保留30天
find $BACKUP_DIR -name "${DB_NAME}_backup_*.sql.gz" -mtime +30 -delete

如果想备份多个数据库,参考如下:

sh 复制代码
#!/bin/bash

# 数据库配置
DB_USER="your_username"
DB_PASSWORD="your_password"

# 要备份的数据库列表,用空格分隔
DB_LIST="database1 database2 database3"

# 备份配置
BACKUP_DIR="/path/to/your/backup/directory"
DATE=$(date +"%Y%m%d")
TIME=$(date +"%H%M%S")

# 创建日期目录
TODAY_DIR="$BACKUP_DIR/$DATE"
mkdir -p $TODAY_DIR

# 日志文件
LOG_FILE="$BACKUP_DIR/backup.log"

# 记录备份开始时间
echo "===== 备份开始: $(date '+%Y-%m-%d %H:%M:%S') =====" >> $LOG_FILE

# 循环备份每个数据库
for DB_NAME in $DB_LIST; do
    BACKUP_FILE="$TODAY_DIR/${DB_NAME}_${TIME}.sql"
    COMPRESSED_FILE="${BACKUP_FILE}.gz"
    
    echo "正在备份数据库: $DB_NAME" >> $LOG_FILE
    
    # 执行备份
    if mysqldump -u$DB_USER -p$DB_PASSWORD $DB_NAME > $BACKUP_FILE 2>> $LOG_FILE; then
        echo "  - 备份成功: $DB_NAME" >> $LOG_FILE
        
        # 压缩备份文件
        if gzip -f $BACKUP_FILE; then
            echo "  - 压缩成功: $COMPRESSED_FILE" >> $LOG_FILE
        else
            echo "  - 压缩失败: $BACKUP_FILE" >> $LOG_FILE
        fi
    else
        echo "  - 备份失败: $DB_NAME" >> $LOG_FILE
    fi
done

# (可选)清理超过N天的旧备份,例如保留30天
DAYS_TO_KEEP=30
find $BACKUP_DIR -type d -name "20*" -mtime +$DAYS_TO_KEEP -exec rm -rf {} \; 2>/dev/null
echo "已清理超过${DAYS_TO_KEEP}天的旧备份" >> $LOG_FILE

# 记录备份结束时间
echo "===== 备份完成: $(date '+%Y-%m-%d %H:%M:%S') =====" >> $LOG_FILE
echo "" >> $LOG_FILE

重要提示 :请务必将脚本中的 your_usernameyour_passwordyour_database_name/path/to/your/backup/directory替换为你实际的数据库信息和服务器目录路径。

二、设置脚本权限

在终端执行以下命令,使脚本具有可执行权限:

bash 复制代码
chmod +x /opt/scripts/mysql_backup.sh

三、配置定时任务

使用 crontab -e命令编辑当前用户的定时任务,添加一行来设置每天自动执行。例如,设置为每天凌晨3点执行备份:

bash 复制代码
0 3 * * * /opt/scripts/mysql_backup.sh

这行配置的含义是:在每天的第0分钟、第3小时(即凌晨3:00)执行一次备份脚本。

四、测试备份

bash 复制代码
bash /opt/scripts/mysql_backup.sh

如果能在备份目录中找到备份的数据库文件,就表明脚本文件生效了,会定时执行,不放心的话可以第二天来看看有没有正常备份

相关推荐
m0_624578597 小时前
JavaScript 中高精度小数(20位以上)的正确处理方法
jvm·数据库·python
m0_740352427 小时前
如何用 Symbol 作为对象属性键名防止第三方库属性覆盖
jvm·数据库·python
m0_613856297 小时前
如何用 ArrayBuffer 在 Fetch 中处理低级别的二进制流
jvm·数据库·python
m0_736439307 小时前
如何防止SQL非法金额输入_利用触发器实现精确度校准
jvm·数据库·python
消失的旧时光-19437 小时前
线程池解决了什么?为什么还不够?(从线程到协程 · 第2篇)
java·大数据·数据库
秋97 小时前
sqlyog连接mysql8.4.9时报Plugin caching_sha2_password could not be loaded错误的解决方法
数据库
2301_815901978 小时前
HTML函数在4K显示器上显示异常吗_高分辨率硬件适配问题【详解】
jvm·数据库·python
运气好好的8 小时前
CSS如何实现响应式内边距自适应_利用vw单位动态调整
jvm·数据库·python
大江东去浪淘尽千古风流人物8 小时前
【UV-SLAM】eLSD/LBD 数据维度 UV-SLAM吸收借鉴
数据库·线性代数·oracle·矩阵·uv·augmented reality
小妖同学学AI8 小时前
抛弃传统数据库!Qdrant用Rust重写AI记忆,大模型知识库迎来性能革命!
数据库·人工智能·rust