通过windows批处理程序定时备份mysql数据库文件并压缩为
2020-01-09 本文已影响0人
半路和尚怎么出家
先放一个批处理的dos
命令入门教程,没有dos
命令基础的可以先看一看,否则下面的脚本直接看懵逼:传送门
开始正文,最近客户有个需求就是每个月都要将mysql
数据库的数据备份一份出来,由他们交给当地gong安部门处理。正好公司有一台阿里云的windows server 2012R2
服务器的资源比较空闲,就打算利用windows的BAT批处理脚本来完成这个任务。
这里将程序分解为以下几个步骤:
- 从数据库读取需要备份数据的客户id到服务器的txt文件,取名为
tenant.txt
(项目是一个多租户ERP系统,主要面向公用事业,一个企业客户有一个客户id) - 从数据库读取需要备份数据的表到服务器的txt文件,取名为
table_name.txt
(里面包含了需要备份的表的名称) - 读取
tenant.txt
,循环处理每一个客户id,每一个客户id都需要备份table_name.txt
中所有表的数据 - 数据备份完成后,调用
7z.exe
压缩数据文件,压缩完成后删除源数据文件
下面直接上bat脚本代码:
1.先调用备份脚本backup.bat
('::'两个冒号表示注释)
@echo off
:: 进入mysql的bin目录
cd ..\mysql-5.7.28-winx64\bin
:: windows server的日期格式包含斜杠和中文,这里做一下处理
set temp=%date:~0,10%
set day=%temp:/=-%
:: 通用的路径
set "prefix=G:\backup\"
:: 日志路径
set "logpath=%prefix%log\%day%baklog.log"
:: 抽取一下mysql命令的共用内容
set "uap=-uroot -p123456 -hlocalhost -P3306"
:: 导出需要备份的客户id信息
echo %time%-导出需要备份的客户id信息 >> %logpath%
mysql %uap% -e "select kid from xxx " database_name > %prefix%tenant.txt
:: 导出需要备份的表信息
echo %time%-导出需要备份的表信息 >> %logpath%
mysql %uap% -e "SELECT table_name FROM columns WHERE column_name='kid' and table_Schema = 'xxxx' " information_schema >%prefix%table_name.txt
:: 读取客户id文件,做循环处理
echo %time%-开始读取客户id >> %logpath%
for /f "skip=1" %%i in (%prefix%tenant.txt) do (
:: 在临时目录下创建以该客户id命名的文件夹
md %prefix%tmp\%%i
echo =====%time%-租户%%i开始转储 >> %logpath%
:: 读取需要转储的表信息
for /f "skip=1" %%j in (%prefix%table_name.txt) do (
echo %time%-%%j开始转储 >> %logpath%
:: 通过mysqldump命令备份数据库数据文件到临时目录下的客户id文件夹中
mysqldump %uap% --skip-opt --set-gtid-purged=OFF database_name %%j --where=" kid='%%i'" > %prefix%tmp\%%i\%%j.sql
)
echo =====%time%-租户%%i结束转储 >> %logpath%
:: 通过start命令调用压缩脚本并传递参数。start命令会另起一个进程,因此当前脚本不会被阻塞
start %prefix%compresse.bat %%i
)
2.被调用的压缩脚本compresse.bat
@echo off
:: windows server的日期格式包含斜杠和中文,这里做一下处理
set temp=%date:~0,10%
set day=%temp:/=-%
:: 通用路径
set prefix=G:\backup\
:: 日志路径
set "logpath=%prefix%log\%day%baklog.log"
:: 设置7z.exe路径
set "zip=C:\Program Files\7-Zip\7z.exe"
:: 这是上面备份脚本里传过来的参数
set des=%1
::设置源文件夹所在目录
set SourDir=%prefix%tmp\%des%
echo %time%-开始压缩客户%des%数据 >> %logpath%
"%zip%" a -mx7 "%prefix%data\%des%(%day%).7z" "%SourDir%"
:: 压缩完成后删除源文件夹
rd /s /q %prefix%tmp\%des%
echo %time%-完成压缩客户%des%数据 >> %logpath%
通过以上两个脚本就能完成批处理程序备份mysql
数据库文件并压缩为7z的任务了~
至于如何定时执行上述bat脚本,则可以通过window
的定时任务来解决,网上文章一大把,随便一篇就能搞定了。
还有几个注意点:
-
window server
记得安装一个mysql
,我的windows server 2012R2
无法启动mysql
,报错少了msvcp120.dll
文件,解决办法网上一搜就有 - 记得配置一下
mysql
的环境变量,否则定时任务调用bat脚本的时候,mysql
命令会执行失败 -
mysqldump
命令的参数建议根据个人需要做一下调整,我这里的命令是直接跳过各种参数设置的
以上就是全部内容了,本人也是bat脚本新手,此文仅仅是记录并分享一下自己搞定任务的过程,如有不妥之处,还请指出~
转载请注明出处.