linux每天自动备份mysql数据库,且只保留90天内的备份数据

本文详细介绍如何通过Shell脚本实现数据库的自动化备份,包括创建备份目录、编写备份脚本、设置日志记录及压缩备份文件等步骤。同时,演示了如何使用crontab设置定时任务,确保数据库备份的定期执行。

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

1、创建备份目录:
为了方便,在/home保存备份文件;
mkdir /home/dbback
cd /home/dbback
#创建存放数据库备份的shell脚本的文件夹
mkdir dbbackshell
#创建数据库备份的压缩包保存的文件夹
mkdir sqlzip
#创建执行shell脚本的日志信息的文件夹
mkdir log

2、在/home/dbback/dbbackshell 创建备份数据库Shell脚本文件test_db_backup.sh:
cd home/dbback/dbbackshell/
touch test_db_backup.sh
#添加可执行权限
chmod 770 test_db_backup.sh

3、使用VI工具编写test_db_backup.sh备份数据库脚本内容
#========================start shell 脚本============================
#!/bin/bash
#定义有备份的数据库名
dbname=test_db
#定义备份数据库时使用的用户名和密码
dbuser=root
dbpasswd=root
#数据库备份的路径
backuppath=/home/dbback/sqlzip/
#数据库备份日志文件存储的路径
logfile=/home/backup/log/test_db_backup.log
#以当前的时间作为备份的数据库命名。
#获取当前日期
Now=$(date +"%d-%m-%Y")  
#字符串组合生成文件名
dumpfile=test_db-$Now  
#这个函数用来备份数据库
back_db() {
#将备份的时间、数据库名存入日志
echo "------"$(date +%Y-%m-%d%t%A%t%T)" Beginning database "${dbname}" backup--------" >>${logfile}
#备份数据库,如果有错误信息也记入日志。默认utf8编码
#--skip-opt (mysql服务运行时备份,请加此参数,防止表损坏,mysqldump可选参数)
#--quick --force --routines --add-drop-database --add-drop-table  (存储过程也会一起备份,mysqldump可选参数)
mysqldump --skip-opt -u${dbuser} -p${dbpasswd} --default-character-set=utf8 --quick --force --routines --add-drop-database --add-drop-table ${dbname} >${backuppath}${dumpfile}.sql 2>> ${logfile}
echo "mysqldump --skip-opt -u${dbuser} -p${dbpasswd} --default-character-set=utf8 --quick --force --routines --add-drop-database --add-drop-table ${dbname} >${backuppath}${dumpfile}.sql 2>> ${logfile}"
#开始压缩数据文件
echo $(date +%Y-%m-%d%t%A%t%T)" Beginning zip ${backuppath}${dumpfile}.sql" >>${logfile}
#将备份数据库文件库,并删除先前的SQL文件。如果有错误信息也记入日志。
tar zcvf ${dumpfile}.tar.gz ${dumpfile}.sql && rm ${dumpfile}.sql 2>> ${logfile}
#将压缩后的文件名存入日志。
echo "backup file name:"${dumpfile}".tar.gz" >>${logfile}
echo -e "-------"$(date +%Y-%m-%d%t%A%t%T)" Ending database "${dbname}" backup-------\n" >>${logfile}
}
#发送邮件
#cat ${logfile} | mutt -s "Blog数据库备份" -a ${dumpfile}.tar.gz 8chf@163.com }
#这个函数用来删除90天前的数据,注意,这个脚本会删除当前目录下所有的早于七天前的文件
rm_oldfile() {
#查找出当前目录下90天前生成的文件,并将之删除
find /home/dbback/sqlzip/ -type f -mtime +30 -exec rm {} \;
}
#切换到数据库备份的目录。如果不做这个操作,压缩文件时有可能会错误
cd ${backuppath}
#运行备份数据函数
back_db
#运行删除文件函数
rm_oldfile
#====================end shell 脚本======================  

4、先执行一下数据库备份的shell脚本,看看脚本有没有错误,能不能正常使用;
cd /home/dbback/dbbackshell/
#执行脚本
./test_db_backup.sh

5、使用crontab创建定时任务
执行命令:
crontab -e
这时就像使用vi编辑器一样,可以对计划任务进行编辑。 
输入以下内容并保存:
#每天2点0分执行
00 02 * * *  /home/dbback/sqlzip/test_db_backup.sh >> /home/dbback/log/test_db_backup.log
再用service crond restart重新启动定时任务服务即可!

6、测试任务是否执行
先修改为每分钟执行一次,很简单,我们就执行几次“ls”命令,看看一分钟过后文件有没有被创建就可以了!
如果任务执行失败了,可以通过以下命令查看任务日志:
# tail -f /var/log/cron

 

<think>我们要求编写一个Shell脚本,用于MySQL数据库的定时备份和清理旧备份文件。根据用户提供的引用,我们可以总结出以下关键点: 1. 使用mysqldump命令进行数据库备份。 2. 备份文件需要按日期时间命名,以便管理。 3. 需要设置备份文件的保存周期(如90),并自动清理过期文件。 4. 使用Linux的cron定时任务来执行脚本。 步骤: 1. 创建备份目录。 2. 编写Shell脚本,包含以下功能: a. 数据库备份(使用mysqldump)。 b. 备份文件命名包含日期时间(例如:dbname_202401251200.sql)。 c. 清理指定数之前的备份文件(例如:删除90前的备份)。 3. 给脚本执行权限。 4. 设置cron定时任务(例如:每天凌晨2点执行)。 参考引用中的示例,我们编写一个脚本,并详细注释。 脚本内容如下:</think>### Shell脚本实现MySQL数据库定时备份与清理 下面是一个完整的Shell脚本解决方案,实现MySQL数据库自动备份、压缩和过期文件清理功能: ```bash #!/bin/bash # MySQL数据库自动备份与清理脚本 # 作者:Ansible助手 # 最后更新:2023-10-15 # ===== 配置区域 ===== MYSQL_HOST="localhost" # MySQL主机地址 MYSQL_PORT="3306" # MySQL端口 MYSQL_USER="root" # MySQL用户名 MYSQL_PASS="your_password" # MySQL密码(生产环境建议使用配置文件) DATABASE_NAME="your_db" # 要备份数据库名 BACKUP_DIR="/data/backups/mysql" # 备份存储目录 RETENTION_DAYS=90 # 备份保留数(90) COMPRESS_ENABLED=true # 是否启用压缩 # ===== 备份执行 ===== # 1. 创建备份目录(如果不存在) mkdir -p ${BACKUP_DIR} # 2. 生成带时间戳的文件名 TIMESTAMP=$(date "+%Y%m%d%H%M%S") BACKUP_FILE="${BACKUP_DIR}/${DATABASE_NAME}_${TIMESTAMP}.sql" # 3. 执行数据库备份 echo "[$(date '+%F %T')] 开始备份数据库: ${DATABASE_NAME}" | tee -a ${BACKUP_DIR}/backup.log mysqldump -h${MYSQL_HOST} -P${MYSQL_PORT} -u${MYSQL_USER} -p${MYSQL_PASS} \ --single-transaction \ --routines \ --triggers \ ${DATABASE_NAME} > ${BACKUP_FILE} 2>> ${BACKUP_DIR}/error.log # 4. 检查备份结果 if [ $? -eq 0 ]; then echo "[$(date '+%F %T')] 数据库备份成功: ${BACKUP_FILE}" | tee -a ${BACKUP_DIR}/backup.log # 5. 压缩备份文件(如果启用) if [ "$COMPRESS_ENABLED" = true ]; then gzip ${BACKUP_FILE} BACKUP_FILE="${BACKUP_FILE}.gz" echo "[$(date '+%F %T')] 备份文件已压缩: ${BACKUP_FILE}" | tee -a ${BACKUP_DIR}/backup.log fi else echo "[$(date '+%F %T')] 错误:数据库备份失败!" | tee -a ${BACKUP_DIR}/error.log exit 1 fi # ===== 清理旧备份 ===== # 6. 删除过期备份文件 echo "[$(date '+%F %T')] 清理${RETENTION_DAYS}前的旧备份..." | tee -a ${BACKUP_DIR}/backup.log find ${BACKUP_DIR} -name "${DATABASE_NAME}_*.sql*" -mtime +${RETENTION_DAYS} -exec rm -f {} \; # 7. 记录完成信息 echo "[$(date '+%F %T')] 备份与清理操作完成" | tee -a ${BACKUP_DIR}/backup.log echo "======================================" | tee -a ${BACKUP_DIR}/backup.log ``` #### 使用说明 1. **配置修改**: - 修改脚本开头的配置区域,设置您的数据库信息和备份路径 - 生产环境建议将密码存储在配置文件中(使用`mysql_config_editor`)[^2] 2. **脚本权限**: ```bash chmod +x mysql_backup.sh ``` 3. **定时任务设置**(每天凌晨2点执行): ```bash # 编辑crontab crontab -e # 添加以下内容 0 2 * * * /path/to/mysql_backup.sh ``` 4. **日志查看**: ```bash # 查看备份日志 tail -f /data/backups/mysql/backup.log # 查看错误日志 tail -f /data/backups/mysql/error.log ``` #### 脚本功能说明 | 功能模块 | 实现说明 | 关键技术 | |----------|----------|----------| | **备份准备** | 创建备份目录、生成时间戳文件名 | `mkdir -p`, `date` | | **数据库备份** | 使用mysqldump导出完整数据 | `mysqldump`参数[^1] | | **备份压缩** | 可选压缩节省存储空间 | `gzip`压缩 | | **过期清理** | 自动删除备份文件 | `find -mtime +N` | | **日志记录** | 详细记录操作过程和结果 | `tee`双重输出 | #### 安全增强建议 1. **密码安全**: ```bash # 使用mysql_config_editor存储凭证 mysql_config_editor set --login-path=backup_user \ --host=localhost --user=backup_admin --password ``` 然后在脚本中使用: ```bash mysqldump --login-path=backup_user ... ``` 2. **权限最小化**: ```sql -- 创建专用备份用户 CREATE USER 'backup_admin'@'localhost' IDENTIFIED BY 'strong_password'; GRANT SELECT, SHOW VIEW, TRIGGER, LOCK TABLES ON your_db.* TO 'backup_admin'@'localhost'; ``` 3. **备份验证**: ```bash # 添加备份验证步骤 if [ -s "${BACKUP_FILE}" ]; then echo "备份文件验证成功" else echo "错误:备份文件为空!" exit 1 fi ``` #### 相关问题 1. 如何验证MySQL备份文件的完整性和可用性? 2. 除了Shell脚本,还有哪些方法可以实现MySQL自动备份? 3. 如何设置MySQL备份的加密存储以提高安全性? 4. 当数据库非常大时(TB级),如何优化备份策略?[^3] 5. 如何实现MySQL备份的异地容灾存储?[^4] > 通过此脚本,您可以建立可靠的MySQL数据库备份系统,结合cron定时任务实现全自动运维[^1]。建议每周进行一次恢复测试以确保备份有效性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值