通过批处理,实现SQL Server数据库定期备份到ftp
2010-05-25 15:02
507 查看
@echo off
rem --------------------- 配置: ftp上传参数,及本地文件目录(数据库备份的临时目录)-----------------
set "PUT_FTP_SERVER=192.168.1.100"
set "PUT_FTP_PORT=21"
set "PUT_FTP_USERNAME=ftpuser"
set "PUT_FTP_PASSWORD=ftppasswd"
set "PUT_DIR=/"
set "LOCAL_DIR=D:/sql_dbbackup/"
rem ----------------------程序开始-----------------------------------------------------------------------
echo begin_backup_db
rem 调用数据库备份存储过程,参数为本地目录. 数据库返回"过期需要删除的备份文件"
sqlcmd -E -S 127.0.0.1,1333 -d master -v BAK_PATH="'%LOCAL_DIR%'" -Q "execute dbo.p_job_backup $(BAK_PATH);" -t 4800 -h -1 -W | findstr bak>>del_file.txt
rem 开始自动上传(上传完删除对应的本地文件)
echo begin_ftp_upload
call :uploaddir "%LOCAL_DIR%" "%PUT_DIR%"
rem 检查是否上传失败,失败则记录数据库日志
echo begin_check
for /f "delims=" %%i in ('dir /b /a-d "%LOCAL_DIR%*.bak"') do echo %%~nxi>>local_file.txt
if not exist local_file.txt goto :delete_remote
for /f "delims=" %%i in (local_file.txt) do (
sqlcmd -E -S 127.0.0.1,1333 -d master -v FILE_NAME="'%%i'" -Q "insert into t_log_backup(loglevel, filename, remark) values(1,$(FILE_NAME),'严重错误:上传备份文件失败,请检查ftp权限.同时它会导致本地磁盘满.');" -t 3600
)
del /f/q local_file.txt
rem 开始删除远程过期文件
echo begin_del_remote
:delete_remote
call :delremotefile "%LOCAL_DIR%" "%PUT_DIR%"
rem 启动数据库发送邮件(即发送错误日志)
sqlcmd -E -S 127.0.0.1,1333 -d master -Q "execute dbo.p_sendmail;" -t 120
echo end.
goto :eof
rem ---------------------程序结束-------------------------------------------------------------------------
rem ---------------------以下均为调用的子函数-------------------------------------------------------------
:uploaddir - upload directory tree
:: - %~1 local directory
:: - %~2 remote directory
setlocal
set "localdir=%~1"
set "remotedir=%~2"
call :put_autoftp cmdftp_uploaddir "%localdir%" "%remotedir%" >nul
rem for /D %%I in ("%localdir%/*") do (
rem call :uploaddir "%localdir%/%%~nxI" "%remotedir%/%%~nxI"
rem ) 这三行为子目录递归,本次不需使用
type remote_file.tmp | findstr bak >remote_file.txt
del /f/q remote_file.tmp
for /f "delims=" %%i in (remote_file.txt) do (
del /f/q %localdir%%%i
)
del /f/q remote_file.txt
endlocal
goto :eof
:cmdftp_uploaddir - ftp commands for upload directory tree
:: - %~1 local directory
:: - %~2 remote directory
echo lcd "%~1*"
echo cd "%~2"
echo binary
echo prompt
echo mput *.bak
echo ls -b
goto :eof
:put_autoftp - a complete ftp session
:: - %* ftp command generator label and its arguments
setlocal
set "putftpin=_ftpin_"
(call :put_preftp & call :%* & call :postftp) >"%putftpin%"
ftp -n <"%putftpin%" >remote_file.tmp
del /f/q "%putftpin%"
endlocal
goto :eof
:put_preftp - setup the ftp session
echo open %PUT_FTP_SERVER% %PUT_FTP_PORT%
echo user %PUT_FTP_USERNAME% %PUT_FTP_PASSWORD%
goto :eof
:postftp - teardown the ftp session
echo quit
goto :eof
:delremotefile - delete overdue file in remote dir
:: - %~1 local directory
:: - %~2 remote directory
setlocal
set "localdir=%~1"
set "remotedir=%~2"
call :put_autoftp cmdftp_delfile "%localdir%" "%remotedir%" >nul
del /f/q del_file.txt
endlocal
goto :eof
:cmdftp_delfile - ftp commands for delete file
:: - %~1 remote directory
echo cd "%~1"
echo binary
echo prompt
for /f "delims=" %%i in (del_file.txt) do (
echo delete %%i
)
goto :eof
rem --------------------- 配置: ftp上传参数,及本地文件目录(数据库备份的临时目录)-----------------
set "PUT_FTP_SERVER=192.168.1.100"
set "PUT_FTP_PORT=21"
set "PUT_FTP_USERNAME=ftpuser"
set "PUT_FTP_PASSWORD=ftppasswd"
set "PUT_DIR=/"
set "LOCAL_DIR=D:/sql_dbbackup/"
rem ----------------------程序开始-----------------------------------------------------------------------
echo begin_backup_db
rem 调用数据库备份存储过程,参数为本地目录. 数据库返回"过期需要删除的备份文件"
sqlcmd -E -S 127.0.0.1,1333 -d master -v BAK_PATH="'%LOCAL_DIR%'" -Q "execute dbo.p_job_backup $(BAK_PATH);" -t 4800 -h -1 -W | findstr bak>>del_file.txt
rem 开始自动上传(上传完删除对应的本地文件)
echo begin_ftp_upload
call :uploaddir "%LOCAL_DIR%" "%PUT_DIR%"
rem 检查是否上传失败,失败则记录数据库日志
echo begin_check
for /f "delims=" %%i in ('dir /b /a-d "%LOCAL_DIR%*.bak"') do echo %%~nxi>>local_file.txt
if not exist local_file.txt goto :delete_remote
for /f "delims=" %%i in (local_file.txt) do (
sqlcmd -E -S 127.0.0.1,1333 -d master -v FILE_NAME="'%%i'" -Q "insert into t_log_backup(loglevel, filename, remark) values(1,$(FILE_NAME),'严重错误:上传备份文件失败,请检查ftp权限.同时它会导致本地磁盘满.');" -t 3600
)
del /f/q local_file.txt
rem 开始删除远程过期文件
echo begin_del_remote
:delete_remote
call :delremotefile "%LOCAL_DIR%" "%PUT_DIR%"
rem 启动数据库发送邮件(即发送错误日志)
sqlcmd -E -S 127.0.0.1,1333 -d master -Q "execute dbo.p_sendmail;" -t 120
echo end.
goto :eof
rem ---------------------程序结束-------------------------------------------------------------------------
rem ---------------------以下均为调用的子函数-------------------------------------------------------------
:uploaddir - upload directory tree
:: - %~1 local directory
:: - %~2 remote directory
setlocal
set "localdir=%~1"
set "remotedir=%~2"
call :put_autoftp cmdftp_uploaddir "%localdir%" "%remotedir%" >nul
rem for /D %%I in ("%localdir%/*") do (
rem call :uploaddir "%localdir%/%%~nxI" "%remotedir%/%%~nxI"
rem ) 这三行为子目录递归,本次不需使用
type remote_file.tmp | findstr bak >remote_file.txt
del /f/q remote_file.tmp
for /f "delims=" %%i in (remote_file.txt) do (
del /f/q %localdir%%%i
)
del /f/q remote_file.txt
endlocal
goto :eof
:cmdftp_uploaddir - ftp commands for upload directory tree
:: - %~1 local directory
:: - %~2 remote directory
echo lcd "%~1*"
echo cd "%~2"
echo binary
echo prompt
echo mput *.bak
echo ls -b
goto :eof
:put_autoftp - a complete ftp session
:: - %* ftp command generator label and its arguments
setlocal
set "putftpin=_ftpin_"
(call :put_preftp & call :%* & call :postftp) >"%putftpin%"
ftp -n <"%putftpin%" >remote_file.tmp
del /f/q "%putftpin%"
endlocal
goto :eof
:put_preftp - setup the ftp session
echo open %PUT_FTP_SERVER% %PUT_FTP_PORT%
echo user %PUT_FTP_USERNAME% %PUT_FTP_PASSWORD%
goto :eof
:postftp - teardown the ftp session
echo quit
goto :eof
:delremotefile - delete overdue file in remote dir
:: - %~1 local directory
:: - %~2 remote directory
setlocal
set "localdir=%~1"
set "remotedir=%~2"
call :put_autoftp cmdftp_delfile "%localdir%" "%remotedir%" >nul
del /f/q del_file.txt
endlocal
goto :eof
:cmdftp_delfile - ftp commands for delete file
:: - %~1 remote directory
echo cd "%~1"
echo binary
echo prompt
for /f "delims=" %%i in (del_file.txt) do (
echo delete %%i
)
goto :eof
相关文章推荐
- 通过批处理,实现SQL Server数据库定期备份到网络共享磁盘
- 批处理 删除FTP 文件夹 , 定期删除备份
- sql server数据库实现定期自动备份
- 自动备份数据库并通过bat 实现自动上传到ftp服务器
- [通过制定SQL计划和系统计划实现]SQL Server 2005数据库定期备份和删除历史备份记录
- sql server数据库备份与复制(1):通过复制.mdf和.ldf文件实现数据转移
- 通过制定SQL计划和系统计划实现]SQL Server 2005数据库定期备份和删除历史备份记录
- Windows批处理方式实现MySQL定期自动备份
- 批处理实现定期备份。
- 通过rsync+inotify实现数据的实时备份(多台备份机)
- CentOS中使用Shell脚本实现每天自动备份网站文件和数据库并上传到FTP中
- 使用日志传送完成sql server数据库定期备份
- 利用FTP和WEBSERVICE实现数据库和用户文件的备份
- windows下oracle数据库定时备份与压缩批处理脚本(win7/win2008亲测通过)
- 通过FTP备份IOS
- linux下通过rsync+inotify 实现数据实时备份(远程容灾备份系统)
- VB实现SQL Server数据库备份/恢复
- 通过rsync+inotify实现数据的实时备份
- Linux通过脚本实现远程自动备份
- 通过rsync+inotify实现文件的实时备份同步