通过批处理(bat)脚本按模式定时逻辑导出达梦库数据:
1、创建以下目录:
E:\dmp\dmp_conf
E:\dmbak
2、创建E:\dmp\dmp_conf.txt文件,保存配置目录信息:
E:\dmp\dmp_conf
3、创建E:\dmp\dmp_conf\bak_path.txt文件,保存备份路径信息:
E:\dmbak
4、创建E:\dmp\dmp_conf\ip_port.txt文件,保存数据库IP和端口信息:
192.168.56.103:5236
5、创建E:\dmp\dmp_conf\user.txt文件,保存待导出的数据库用户信息:
TEST
SJKSH
6、创建后,目录结构如下:
7、创建手工执行的批处理脚本:E:\dmp\dmp_manul.bat
::rem 这是注释内容,如果指定了echo on,命令行会打印这段注释
:: 这也是注释内容,但是不支持回显
@echo off
SET YYYY=%DATE:~0,4%
SET MM=%DATE:~5,2%
SET DD=%DATE:~8,2%
SET HH=%TIME:~0,2%
::如果小时前面有空格,则替换为0
SET HH=%HH: =0%
SET MI=%TIME:~3,2%
SET SS=%TIME:~6,2%
SET starttime=%YYYY%-%MM%-%DD%-%HH%-%MI%-%SS%
@echo on
echo 开始时间是:%starttime%
@echo off
::获取配置文件目录
rem BAT命令读取配置文件路径
rem 判断文件是否存在
if not exist E:\dmp\dmp_conf.txt (
echo dmp_conf.txt file not exist
goto end_conf
)
rem 读取文件,每次读取一行,默认以空格分隔,默认取第一列
for /f “tokens=*” %%i in (‘type E:\dmp\dmp_conf.txt’) do (
SET dmp_conf=%%i
)
echo 配置文件目录为:%dmp_conf%
:end_conf
::获取ip_port
rem BAT命令读取配置文件路径
rem 判断文件是否存在
if not exist %dmp_conf%\ip_port.txt (
echo ip_port.txt file not exist
goto end_ip
)
rem 读取文件,每次读取一行,默认以空格分隔,默认取第一列
for /f “tokens=*” %%i in (‘type %dmp_conf%\ip_port.txt’) do (
SET ip_port=%%i
)
echo IP和端口为:%ip_port%
:end_ip
::获取备份路径
rem BAT命令读取配置文件路径
rem 判断文件是否存在
if not exist %dmp_conf%\bak_path.txt (
echo bak_path.txt file not exist
goto end_ip
)
rem 读取文件,每次读取一行,默认以空格分隔,默认取第一列
for /f “tokens=*” %%i in (‘type %dmp_conf%\bak_path.txt’) do (
SET bak_path=%%i
)
echo 备份路径为:%bak_path%
:end_ip
::创建备份路径子目录:
mkdir %bak_path%\DATA%starttime%
::按模式导出数据
rem 判断文件是否存在
if not exist %dmp_conf%\user.txt (
echo user.txt file not exist
goto end_user
)
SET userpwd=SYSDBA/SYSDBA
setlocal enabledelayedexpansion
:: 外层循环,遍历文件列表
for %%i in (%dmp_conf%\user.txt) do (
echo 处理文件:%%i
:: 内层循环:遍历文件中的每一行
for /f “delims=*” %%j in (%%i) do (
@echo on
echo 开始备份数据库用户: %%j
@echo off
E:\dmdbms\bin\dexp USERID=%userpwd%@%ip_port% FILE=%bak_path%\DATA%starttime%%%j.dmp LOG=%bak_path%\DATA%starttime%%%j.log SCHEMAS=%%j COMPRESS=Y
::过滤不需要导出的表
::EXCLUDE=TABLES:A
::打印日志
@echo on
type %bak_path%\DATA%starttime%%%j.log | find “SCHEMA”
type %bak_path%\DATA%starttime%%%j.log | find “警告”
@echo off
echo.
echo.
)
)
endlocal
:end_user
@echo on
::任务执行完成
echo 数据库用户备份完成!!!
echo 开始时间是:%starttime%
@echo off
SET YYYY=%DATE:~0,4%
SET MM=%DATE:~5,2%
SET DD=%DATE:~8,2%
SET HH=%TIME:~0,2%
::如果小时前面有空格,则替换为0
SET HH=%HH: =0%
SET MI=%TIME:~3,2%
SET SS=%TIME:~6,2%
SET endtime=%YYYY%-%MM%-%DD%-%HH%-%MI%-%SS%
@echo on
echo 结束时间是:%endtime%
@echo off
echo.
echo.
echo.
8、创建自动执行的批处理脚本E:\dmp\dmp_auto.bat:
::rem 这是注释内容,如果指定了echo on,命令行会打印这段注释
:: 这也是注释内容,但是不支持回显
SET YYYY=%DATE:~0,4%
SET MM=%DATE:~5,2%
SET DD=%DATE:~8,2%
SET HH=%TIME:~0,2%
::如果小时前面有空格,则替换为0
SET HH=%HH: =0%
SET MI=%TIME:~3,2%
SET SS=%TIME:~6,2%
SET starttime=%YYYY%-%MM%-%DD%-%HH%-%MI%-%SS%
@echo on
echo 开始时间是:%starttime% >> E:\dmp\dmp_auto.log
::获取配置文件目录
if not exist E:\dmp\dmp_conf.txt (
echo dmp_conf.txt file not exist
goto end_conf
)
rem 读取文件,每次读取一行,默认以空格分隔,默认取第一列
for /f “tokens=*” %%i in (‘type E:\dmp\dmp_conf.txt’) do (
SET dmp_conf=%%i
)
echo 配置文件目录为:%dmp_conf% >> E:\dmp\dmp_auto.log
:end_conf
::获取ip_port
if not exist %dmp_conf%\ip_port.txt (
echo ip_port.txt file not exist
goto end_ip
)
rem 读取文件,每次读取一行,默认以空格分隔,默认取第一列
for /f “tokens=*” %%i in (‘type %dmp_conf%\ip_port.txt’) do (
SET ip_port=%%i
)
@echo on
echo IP和端口为:%ip_port% >> E:\dmp\dmp_auto.log
:end_ip
::获取备份路径
if not exist %dmp_conf%\bak_path.txt (
echo bak_path.txt file not exist
goto end_bak
)
rem 读取文件,每次读取一行,默认以空格分隔,默认取第一列
for /f “tokens=*” %%i in (‘type %dmp_conf%\bak_path.txt’) do (
SET bak_path=%%i
)
@echo on
echo 备份路径为:%bak_path% >> E:\dmp\dmp_auto.log
:end_bak
::创建备份路径子目录:
mkdir %bak_path%\DATA%starttime%
if not exist %bak_path%\DATA%starttime% (
echo 创建备份路径子目录失败!!! >> E:\dmp\dmp_auto.log
goto end_mk
)
echo 创建备份路径子目录%bak_path%\DATA%starttime%成功!!! >> E:\dmp\dmp_auto.log
:end_mk
::1::导出TEST模式的数据
SET userpwd=SYSDBA/SYSDBA
echo 开始备份数据库用户TEST。。。>> E:\dmp\dmp_auto.log
@echo off
E:\dmdbms\bin\dexp USERID=%userpwd%@%ip_port% FILE=%bak_path%\DATA%starttime%\TEST.dmp LOG=%bak_path%\DATA%starttime%\TEST.log SCHEMAS=TEST COMPRESS=Y
@echo on
type %bak_path%\DATA%starttime%\TEST.log | find “SCHEMA” >> E:\dmp\dmp_auto.log
type %bak_path%\DATA%starttime%\TEST.log | find “警告” >> E:\dmp\dmp_auto.log
::2::导出SJKSH模式的数据
SET userpwd=SYSDBA/SYSDBA
echo 开始备份数据库用户SJKSH。。。>> E:\dmp\dmp_auto.log
@echo off
E:\dmdbms\bin\dexp USERID=%userpwd%@%ip_port% FILE=%bak_path%\DATA%starttime%\SJKSH.dmp LOG=%bak_path%\DATA%starttime%\SJKSH.log SCHEMAS=SJKSH COMPRESS=Y
@echo on
type %bak_path%\DATA%starttime%\SJKSH.log | find “SCHEMA” >> E:\dmp\dmp_auto.log
type %bak_path%\DATA%starttime%\SJKSH.log | find “警告” >> E:\dmp\dmp_auto.log
@echo on
::任务执行完成
echo 数据库用户备份完成!!!>> E:\dmp\dmp_auto.log
echo 开始时间是:%starttime%>> E:\dmp\dmp_auto.log
@echo off
SET YYYY=%DATE:~0,4%
SET MM=%DATE:~5,2%
SET DD=%DATE:~8,2%
SET HH=%TIME:~0,2%
::如果小时前面有空格,则替换为0
SET HH=%HH: =0%
SET MI=%TIME:~3,2%
SET SS=%TIME:~6,2%
SET endtime=%YYYY%-%MM%-%DD%-%HH%-%MI%-%SS%
@echo on
echo 结束时间是:%endtime%>> E:\dmp\dmp_auto.log
@echo off
echo.>> E:\dmp\dmp_auto.log
echo.>> E:\dmp\dmp_auto.log
echo.>> E:\dmp\dmp_auto.log
10、执行脚本的方法:
10.1、手动执行,使用以下命令:
call E:\dmp\dmp_manual.bat >> E:\dmp\dmp_manual.log
10.2、定时任务,在windows“任务计划程序”中调用以下脚本:
E:\dmp\dmp_auto.bat
10.3、创建或生成的所有文件如下:
10.4、生成的备份目录如下:
10.5、生成的备份文件如下:
11、自动执行的批处理脚本,在本地测试已通过,在用户环境中测试无法通过定时任务调用,原因是:用户的win环境不支持脚本中的for循环;
12、解决11中的问题,可以通过更换win操作系统版本或将脚本中的for循环结构修改为顺序结构,即可绕过此问题;
文章
阅读量
获赞
