mysql数据库定时备份并保留指定天数脚本

分享比较一个通用的SQL数据库备份脚本

#!/bin/bash
# MySQL数据库信息
DB_HOST="localhost"
DB_USER="your_username"
DB_PASS="your_password"
DB_NAME="your_database_name"
# 备份目录和文件名
BACKUP_DIR="/path/to/backup/directory"
BACKUP_FILE
<think>我们参考多个来源,编写一个完整的Windows定时备份MySQL数据库的批处理脚本。主要功能包括: 1. 设置备份路径、MySQL的bin目录路径(如果mysqldump不在系统PATH中,则需要指定全路径) 2. 设置数据库连接信息:用户名、密码、数据库名(可以备份单个数据库,也可以备份多个数据库或整个实例) 3. 生成备份文件名,通常包含日期时间,以便按时间排序和保留多个备份 4. 执行mysqldump命令进行备份 5. 删除旧的备份文件(例如,删除10天前的备份) 注意:在批处理文件中,密码如果包含特殊字符,可能需要用双引号括起来。另外,为了避免在命令行中暴露密码,可以考虑使用配置文件,但这里为了简单,我们直接在脚本中设置。 我们参考引用[1],[2],[4],[5]中的写法,综合如下: - 日期时间格式:我们采用`%date%`和`%time%`来生成,但注意不同系统返回的日期格式可能不同(中文系统可能是`2024-05-26`或`2024/05/26`),为了统一,我们可以提取字部分。 - 设置备份目录,如果不存在则创建。 - 使用forfiles命令删除旧备份(例如超过10天的)。 由于不同系统日期格式可能不同,我们采用一种较为通用的方式来获取日期(参考引用[5]的处理): - 对于日期:提取`%date:~0,4%%date:~5,2%%date:~8,2%`,这适用于类似`2024-05-26`的格式。如果是`2024/05/26`,则同样适用。但如果是其他格式(如英文日期),可能不适用。因此,我们也可以考虑使用`wmic`命令来获取标准日期(如引用[4])。 我们将采用引用[4]的方法,使用`wmic`获取标准日期时间,这样不受系统区域设置影响。 同时,为了确保时间部分在文件名中不会出现空格(因为%time%在小时小于10时前面有空格),我们使用`wmic`获取完整的本地时间,然后拼接。 综合引用[4]和[5]的做法,我们编写如下脚本: ```batch @echo off setlocal :: 设置MySQL的安装路径(mysqldump.exe所在路径),如果已经加入环境变量PATH中可以不用设置 :: 注意:如果设置了路径,下面调用mysqldump时需要使用全路径;如果不设置且PATH中有,则可以直接写mysqldump set "MYSQL_PATH=C:\Program Files\MySQL\MySQL Server 8.0\bin" :: 设置备份文件存放的目录 set "BACKUP_DIR=D:\MySQL_Backup" :: 设置MySQL数据库连接参 set "DB_USER=root" set "DB_PASSWORD=your_password" set "DB_NAME=your_database_name" :: 使用WMIC获取标准日期时间(格式为:yyyymmddHHMMSS,共14位字) for /f "tokens=2 delims==." %%a in ('wmic os get localdatetime /value 2^>nul') do set "DATETIME=%%a" :: 提取日期部分(前8位)和时间部分(接下来6位),但为了文件名简洁,我们可以只取前14位(年月日时分秒) set "BACKUP_DATE=%DATETIME:~0,8%" set "BACKUP_TIME=%DATETIME:~8,6%" :: 设置备份文件名,包含数据库名和日期时间 set "BACKUP_FILE=%BACKUP_DIR%\%DB_NAME%_%BACKUP_DATE%_%BACKUP_TIME%.sql" :: 创建备份目录(如果不存在) if not exist "%BACKUP_DIR%" mkdir "%BACKUP_DIR%" :: 执行备份命令 "%MYSQL_PATH%\mysqldump" -u%DB_USER% -p%DB_PASSWORD% --databases %DB_NAME% > "%BACKUP_FILE%" :: 检查备份是否成功 if %errorlevel% neq 0 ( echo [ERROR] Backup failed! exit /b %errorlevel% ) echo Backup successful: %BACKUP_FILE% :: 删除10天前的备份文件(注意:forfiles命令需要Windows Server 2003以上或Windows XP以上系统) :: 注意:forfiles的日期比较是基于文件的最后修改日期 forfiles /p "%BACKUP_DIR%" /m *.sql /d -10 /c "cmd /c del @path /f" echo Old backups (older than 10 days) have been deleted. endlocal ``` 注意事项: 1. 请将`MYSQL_PATH`修改为你的MySQL安装路径中bin目录的实际路径(如果mysqldump已经在系统PATH中,可以删除路径设置,直接使用`mysqldump`)。 2. 修改`BACKUP_DIR`为你想要存放备份的目录。 3. 修改`DB_USER`, `DB_PASSWORD`, `DB_NAME`为你的数据库连接信息。如果密码包含特殊字符,建议将密码用双引号括起来,即:`-p"your password"`(在批处理中,如果密码有特殊字符,可能需要转义,但通常用双引号括起来即可)。 4. 如果要备份整个MySQL实例的所有数据库,可以将`--databases %DB_NAME%`替换为`--all-databases`,同时修改备份文件名(去掉数据库名)。 5. 删除旧备份天数(这里是10天)可以通过修改`/d -10`来调整。 此外,为了安全,建议将批处理文件保存为ANSI编码(使用记事本另存为时选择ANSI),以避免中文乱码。 设置定时任务: 1. 将上述脚本保存为`.bat`文件,例如`mysql_backup.bat`。 2. 打开Windows任务计划程序(Task Scheduler)。 3. 创建基本任务,设置触发时间(例如每天凌晨2点)。 4. 操作选择“启动程序”,然后浏览选择你的`.bat`文件。 5. 完成设置。 **注意**:在测试时,建议先在命令行手动运行脚本,确保备份文件和删除旧备份的功能正常。 这个脚本综合了多个引用的优点,使用了标准的日期时间格式,增加了错误检查。同时,使用`wmic`获取日期时间,避免了不同系统区域设置导致的格式问题。 相关问题: 1. 如何设置Windows任务计划程序来定时执行批处理文件? 2. 如何备份MySQL中的所有数据库? 3. 如果备份失败,如何记录错误日志? 4. 如何将备份文件压缩以节省空间? </think>### Windows系统下MySQL数据库定时备份脚本 根据您提供的引用信息,我整理了以下优化的批处理脚本,结合了多个引用中的最佳实践: ```batch @echo off setlocal enabledelayedexpansion :: ============== 配置区域 ============== :: MySQL安装路径(修改为您的实际路径) set "MYSQL_PATH=C:\Program Files\MySQL\MySQL Server 8.0\bin" :: 备份存储路径(修改为您的目标路径) set "BACKUP_DIR=D:\MySQL_Backups" :: 数据库连接信息 set "DB_USER=root" set "DB_PASSWORD=your_password" :: 请替换实际密码 set "DB_NAME=your_database" :: 单库备份(多库用空格分隔) :: 备份保留天数(删除旧备份) set RETAIN_DAYS=10 :: ===================================== :: 创建标准时间戳 (YYYYMMDDHHMMSS) for /f "tokens=2 delims==." %%a in ('wmic os get localdatetime /value') do set "DATETIME=%%a" set "TIMESTAMP=!DATETIME:~0,8!_!DATETIME:~8,6!" :: 创建备份目录 if not exist "%BACKUP_DIR%" mkdir "%BACKUP_DIR%" :: 执行备份命令 echo [%TIME%] 开始备份数据库... "%MYSQL_PATH%\mysqldump" -u%DB_USER% -p%DB_PASSWORD% --single-transaction --routines --events %DB_NAME% > "%BACKUP_DIR%\%DB_NAME%_%TIMESTAMP%.sql" :: 检查备份结果 if %errorlevel% equ 0 ( echo [%TIME%] 备份成功: %DB_NAME%_%TIMESTAMP%.sql ) else ( echo [%TIME%] [错误] 备份失败! 错误代码: %errorlevel% exit /b %errorlevel% ) :: 删除旧备份 echo [%TIME%] 清理%RETAIN_DAYS%天前的备份... forfiles /p "%BACKUP_DIR%" /m *.sql /d -%RETAIN_DAYS% /c "cmd /c del @path /q" echo [%TIME%] 操作完成 endlocal ``` ### 核心功能说明 1. **智能时间戳** 使用`wmic`获取标准时间格式`YYYYMMDD_HHMMSS`,避免语言环境差异问题[^4] 2. **事务一致性备份** 通过`--single-transaction`参确保备份过程中据一致性[^2] 3. **自动化清理** 自动删除超过保留天数(默认10天)的旧备份[^1][^5] 4. **错误处理** 检查mysqldump返回值提供明确错误信息[^4] 5. **完整对象备份** 包含存储过程和事件(`--routines --events`)[^2] ### 使用步骤 1. **修改配置** - 更新`MYSQL_PATH`为您的MySQL安装路径 - 设置`DB_USER`和`DB_PASSWORD` - 指定`DB_NAME`(多数据库用空格分隔,如`set DB_NAME=db1 db2`) - 调整`BACKUP_DIR`备份目录和`RETAIN_DAYS`保留天数 2. **保存文件** - 文本编辑器新建文件,复制上述代码 - 保存为`mysql_backup.bat`(编码选ANSI) 3. **设置定时任务** ```powershell # PowerShell创建每日2点执行的计划任务 $action = New-ScheduledTaskAction -Execute "cmd.exe" -Argument "/c C:\Path\to\mysql_backup.bat" $trigger = New-ScheduledTaskTrigger -Daily -At 2am Register-ScheduledTask -TaskName "MySQL Daily Backup" -Action $action -Trigger $trigger -User "SYSTEM" ``` ### 最佳实践建议 1. **密码安全** 建议使用`mysql_config_editor`创建加密登录路径,避免明文密码[^2] 2. **备份验证** 添加还原测试环节确保备份有效性 ```batch mysql -u%DB_USER% -p%PASSWORD% -e "USE test_restore; SOURCE %BACKUP_FILE%" ``` 3. **日志记录** 添加重定向输出到日志文件: ```batch call :backup >> "%BACKUP_DIR%\backup.log" 2>&1 ``` 4. **邮件通知** 集成Blat等命令行邮件工具发送备份结果[^5]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值