By烟花易冷

定时备份 MySQL 数据库至 Backblaze B2
2024-02-12

最近自己搞了点新业务,使用上了由百度开源的 AMIS 框架,该框架一大特点就是通过 json 配置的方式制作出界面。为此我开发了个轻量的管理后台,使用 MySQL 保存配置好的 json 内容,并在 AMIS 框架页面加载时,实时通过 API 从 MySQL 中取出对应的页面配置并进行渲染。因此 MySQL 中的内容显得十分重要,务必保证数据不丢或在故障时可以快速恢复。

然而为了节约成本,MySQL实例在业务初期并非购买的云服务,而选择了自建,在数据备份方面使用了一个较为“土”的方法,定时通过 mysqldump 导出内容,并上传至 Backblaze B2 中。关于 Backblaze B2 这里不做过多的展开,可以简单理解成类似于阿里云OSS、腾讯云COS、AWS S3 的对象存储服务,并提供了配套的 CLI 工具。具体我的备份脚本如下:

#!/bin/bash

# MySQL数据库配置
DB_USER="your_mysql_username"
DB_PASSWORD="your_mysql_password"
DB_HOST="localhost" # 或者你的MySQL服务器地址
DB_PORT="3306" # 如果不是默认端口,请更改
BACKUP_DIR="/path/to/your/backup/directory"
B2_ACCOUNT_ID="your_b2_account_id"
B2_APPLICATION_KEY="your_b2_application_key"
B2_BUCKET_NAME="your_b2_bucket_name"

# 创建备份文件名
TIMESTAMP=$(date +"%Y%m%d%H%M%S")
BACKUP_FILE="${BACKUP_DIR}/mysql-backup-${TIMESTAMP}.sql.gz"

# 备份数据库
mysqldump -h ${DB_HOST} -P ${DB_PORT} -u ${DB_USER} -p${DB_PASSWORD} --all-databases | gzip > ${BACKUP_FILE}

# 上传资源到 B2 对象存储
if [ $? -eq 0 ]; then
    echo "MySQL backup completed successfully."
    
    # 上传到B2存储桶
    b2 authorize-account ${B2_ACCOUNT_ID} ${B2_APPLICATION_KEY}
    b2 upload-file ${B2_BUCKET_NAME} ${BACKUP_FILE} mysql/${BACKUP_FILE##*/}
    
    # 检查上传是否成功
    if [ $? -eq 0 ]; then
        echo "Backup uploaded to B2 successfully."
        # 可选:删除本地备份文件以节省空间
        # rm ${BACKUP_FILE}
    else
        echo "Failed to upload backup to B2."
    fi
else
    echo "MySQL backup failed."
fi

其中 MySQL 数据库配置结合实际情况填写即可,B2 的相关信息可以从右上角 Account -> Application Keys 中进行获取,相关密钥只会出现一次,注意保存。

备份情况如图所示。需要恢复数据或迁移数据时,下载对应的 gz 压缩文件,解压后重新导入即可。