1 简单概述
mysqldump
是MySQL自带的一个命令,用于备份数据库。它可以导出数据库的结构和数据。以下是一些常用的备份示例:
备份所有数据库:
mysqldump -u root -p --all-databases > all_databases.sql
备份指定数据库:
mysqldump -u root -p --databases mydb1 mydb2 > mydb_backup.sql
备份数据库并压缩:
mysqldump -u root -p mydb | gzip > mydb_backup.sql.gz
2 编写脚本
上面的命令都是单次执行生效的,如果想持续备份,需要做成脚本,并设置定时任务
以下脚本是备份是针对整个数据库,你可以根据需要进行备份特定数据库
#!/bin/bash# ====================================================# MySQL 一键备份脚本# 作者:liyb# 说明:自动备份所有数据库 + 自动清理历史 + 日志记录# ====================================================# === 基本配置 ===BACKUP_DIR="/data/db_backups" # 备份目录MYSQL_USER="root" # 数据库用户名MYSQL_PASS="123456" # 数据库密码MYSQL_HOST="localhost" # 数据库地址MYSQL_PORT="3306" # 数据库端口RETENTION_DAYS=7 # 备份保留天数DATE_TAG=$(date +"%Y-%m-%d_%H-%M-%S") # 时间戳LOG_FILE="/var/log/mysql_backup.log" # 日志文件DUMP_FILE="${BACKUP_DIR}/all-databases-${DATE_TAG}.sql"ARCHIVE_FILE="${DUMP_FILE}.tar.gz"# === 创建备份目录 ===[ ! -d ${BACKUP_DIR} ] && mkdir -p ${BACKUP_DIR}# === 日志函数 ===log() { echo"$(date +"%Y-%m-%d %H:%M:%S") : $1" | tee -a $LOG_FILE}# === 开始备份 ===log"==== 开始 MySQL 数据库备份 ===="# === 备份所有数据库 ===log"正在备份所有数据库到 ${DUMP_FILE}"/data/mysql/bin/mysqldump -u${MYSQL_USER} -p${MYSQL_PASS} -h${MYSQL_HOST} -P${MYSQL_PORT} --all-databases > ${DUMP_FILE}if [ $? -eq 0 ]; then log"数据库导出成功"else log"数据库导出失败!请检查配置!" exit 1fi# === 压缩备份文件 ===log"正在压缩备份文件..."tar -czf ${ARCHIVE_FILE} -C ${BACKUP_DIR} $(basename ${DUMP_FILE})if [ $? -eq 0 ]; then log"压缩完成:${ARCHIVE_FILE}" rm -f ${DUMP_FILE}# 删除未压缩的 SQL 文件else log"压缩失败!" exit 1fi# === 删除 N 天前的备份文件 ===log"正在清理 ${RETENTION_DAYS} 天前的备份..."find ${BACKUP_DIR} -name "*.tar.gz" -type f -mtime +${RETENTION_DAYS} -exec rm -f {} ;log"备份完成!文件存储在 ${ARCHIVE_FILE}"log"==== MySQL 数据库备份结束 ===="
配置说明:
BACKUP_DIR | |
MYSQL_USER/PASS | |
RETENTION_DAYS | |
tar -czf | |
find命令 | |
log() 函数 |
【温馨提示】脚本需要在测试环境模拟再到生产环境上执行,测试通过再制定定时任务
做成定时任务
在crontab里面添加定时任务,进行定时备份
crontab -e# 将内容写入:每天凌晨一点进行备份0 1 * * * /bin/bash /root/mysql_bakcup.sh
定时任务会把执行日志输出到/var/log/mysql_backup.log中,这个目录可以在脚本里面自定义
查看备份效果
关注小编,添加微信,可进入技术交流群。
