局域网备份数据库和文件
一、前情提要
把服务器架设在VirtualBox虚拟机上,对应服务器的数据库文档也备份在虚拟机上。现由于某种意外,虚拟机挂了,需要我们去修复虚拟机或者将虚拟机里面的文件拷贝出来重新架在新的虚拟机上,如果能成功当然是好的,可是很不幸的是以目前掌握的技术修复不了数据也拷贝不出来,这下怎么办呢???只能哭了~~~~
二、经验教训
为了避免再出现数据拷不出来造成不必要的麻烦,我们就设定让虚拟机里的重要文件定时备份到实体机上,实体机自然是比较稳定的,而且就算系统挂了也懂得怎么把数据拷回来。
三、数据库备份实现方法
方法一:存储过程+维护计划+批处理+定时计划
对于SQLSERVER2000可以在排程中设定定时执行某一TSQL语句来实现数据库的异地备份,具体操作如下:
(1)源服务器:在master数据下创建一存储过程(bakup_DataBase),用于备份数据库并将产生的备份文档拷贝到目标服务器,实现语句:
USE [master]
GO
/****** Object: StoredProcedure [dbo].[BAKUP_DATABASE] Script Date: 2016/6/29 上午 11:11:55 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[BAKUP_DATABASE] AS
/*
--实现功能:定时将服务器中sqlserver2000资料库备份到局域网中另一台电脑上
--FULL BACKUP
--USE MASTER
*/
SET NOCOUNT ON
DECLARE @STRPSW VARCHAR(50),@STRUSR VARCHAR(50),@STRCMDSHELL VARCHAR(300),@STRDATABASENAME VARCHAR(20),@FULLFILENAME VARCHAR(200)
DECLARE @FILEFLAG VARCHAR(50),@TOFILENAME VARCHAR(200),@SQLSTR VARCHAR(500),@SQLSTR2 VARCHAR(500),@FLAGDEL VARCHAR(20)
DECLARE @NOWDATETIME VARCHAR(50)
-- 日期时间
SET @NOWDATETIME = REPLACE(REPLACE(REPLACE(CONVERT(CHAR(20),GETDATE(),20),':',''),'-',''),' ','')
-- 需填写域名\用户名(目标机器的windows登陆名)
SET @STRUSR='目标服务器IP\administrator /y'
-- 需填写windows登陆密码
SET @STRPSW='目标服务器登录密码'
-- 需填写ip(目标机器的ip地址)
SET @STRCMDSHELL= 'NET USE \\目标服务器IP\e$\目标文件夹 ' + @STRPSW + ' /USER:' +@STRUSR
-- 需填写ip(目标机器的ip地址)以及保存的目录(如:目标服务器E盘)
SET @TOFILENAME='\\目标服务器IP\e$\目标文件夹'
-- 填写true表示删除本地的备份临时文件,填写false或其他字符表示保留该文件
SET @FLAGDEL='FALSE'
------------------------------------备份数据库-------------------------------------
-- 备份的数据库名称
SET @STRDATABASENAME='要备份的数据库名称'
-- 备份的文件命名规则:数据库名_日期时间.bak
SET @FILEFLAG = @STRDATABASENAME + '_' + @NOWDATETIME
-- 需填写本地备份临时文件的目录,因为需要先备份到本地再拷贝到目标机器(如:保存目录为F:\DBbakup)
SET @FULLFILENAME='F:\DBbakup\'+@FILEFLAG+'.bak'
SET @SQLSTR='COPY '+@FULLFILENAME+' '+@TOFILENAME
SET @SQLSTR2='DEL ' +@FULLFILENAME
BACKUP DATABASE @STRDATABASENAME TO DISK= @FULLFILENAME WITH INIT
-- 尝试连接到目标机器
EXEC MASTER..XP_CMDSHELL @STRCMDSHELL
-- 拷贝到目标机器上
EXEC MASTER..XP_CMDSHELL @SQLSTR
-- 删除本地的备份临时文件
IF (@FLAGDEL ='TRUE') EXEC MASTER.. XP_CMDSHELL @SQLSTR2
GO
(2)源服务器:打开SQL Server 企业管理器,在指定需要备份的数据库上面,创建一个维护计划。可按需要设定将来运行这个维护计划的时间/周期(每天00:01执行)。
(3)源服务器:在SQL Server 企业管理器中,管理->SQL Server代理->作业,可以找到刚建立的维护计划这个作业。
(4)源服务器:双击这个作业,弹出属性对话框,在"步骤"页->点击"编辑"按钮,在弹出的编辑作业步骤对话框中,修改"常规"页->"命令"的文本内容,改为: EXECUTE master.dbo.bakup_DataBase。
(5)源服务器:到这里备份完成。我们发现存储过程的最后我们并没有把本地文件删除,随着时间的推移硬盘会被撑满,这时就需要人工时不时去查看删除多余的历史文档,工作量比较大也比较繁琐,所以我们在第(2)设定完整备份维护计划时就要设定其删除以往的历史文档(我们这里设定的是删除2天前备份的文件,这样本地就只保留最新2天的备份文档),保证硬盘不易被撑暴。但是,理想很丰满现实很骨感,自动删除历史资料的语句被注释掉了,未能实现自动删除功能,此时我们写了一份删除2天前历史文档的bat文件(forfiles_del.bat)在定时计划里定时执行该文档,bat文件内容如下:
@echo off
if not exist "F:\DBbakup\*%date:~0,4%%date:~5,2%%date:~8,2%*.bak" goto :notfound
( ::F:\DBbakup存在当天产生的备份文件就删除该文件夹下2天前产生的历史资料
forfiles /p "F:\DBbakup" /m *.* /d -2 /c "cmd /c del @path"
goto :exit
)
:notfound
(
goto :exit
)
:exit
exit
注意:(win2003)bat文件名不能太长太复杂了,不然任务计划执行不了。
(6)目标服务器:你会发现我们一直往目标服务器放新文件,这样目标服务器的硬盘很容易被撑满,怎么办???当然是删除一些历史档案了,方法是使用批处理+定时计划定时删除2天前历史资料。批处理(forfiles_del.bat,每天4点执行)内容如下:
@echo off
:del83
if not exist "E:\SQLDBBak\*%date:~0,4%%date:~5,2%%date:~8,2%*.bak" goto :notfound83
( ::该目录下存在当天产生的文件就删除2天前的历史资料
forfiles /p "E:\SQLDBBak" /m *.* /d -2 /c "cmd /c del @path"
goto :exit
)
:notfound83
(
goto :exit
)
:exit
exit
(7)完成
方法二:维护计划+批处理+定时计划
以win2012为例,将db的bak文档备份到\\目标服务器IP\e$\SQLDBBak,实现步骤如下:
(1)新建数据库维护计划,设定每天00:00开始备份数据库并删除2天前的历史资料
(2)每天02:00将备份文件拷贝到\\目标服务器IP\e$\SQLDBBak,采用批处理+定时计划,批处理(copy(don'tdelete_important_useforsqlbak).bat)内容如下:
net use \\目标服务器IP\e$\SQLDBBak 用户登录密码 /user:目标服务器IP\administrator /y
copy D:\"Program Files"\"Microsoft SQL Server 2012"\MSSQL11.SQL2012\MSSQL\Backup \\目标服务器IP\e$\SQLDBBak
(3)批处理设定:
开启任务计划,创建基本任务,如下图
按需求填写
下一步操作默认的是启动程序,不用改直接下一步
检查无误即可完成。完成后返回主界面可看到我们新创建的基本任务。
双击开启
再双击打开属性,完成如下设定:
(4)对于目标服务器文件一直增加的处理办法请查看方法一(6)
(5)完成
四、站点文件备份
将E:\1.WEB下的文件拷贝到\\目标服务器IP\f$\webbak,采用批处理(copy.bat)+定时计划,批处理内容如下:
::连接远程服务器
net use \\目标服务器IP\f$\webbak 用户登录密码, /user:目标服务器IP\administrator /y
::拷贝文件
xcopy E:\1.WEB \\目标服务器IP\f$\webbak /e/h/y
注意:(win2003)bat文件名不能太长太复杂了,不然任务计划执行不了。
说明:不存在的新增,已存在的更新,所以不存在历史资料占用硬盘空间问题