Sql Server 2005はリモートバックアップデータベースを実現します。


皆さんはデータベースの紛失に気をつけています。これも開発者一人が頭を痛めている事件です。運行中のサーバーとデータベースもこのサーバーにあります。サーバーが崩壊すれば、すべてのデータが存在しなくなります。たとえあなたがあなたのマシンでバックアップを取っても無駄です。なぜこのように言いますか?最終的にはLANを利用してこのような問題を解決できます。二つのマシンを例にとって、A機はサーバーで、B機はAサーバ上のデータベースをB機にバックアップします。B機はデータベースが必要で、Sql Server 2005を例にします。まず、A機はデータベース、プログラム、IIS、B機はデータベース、サービスプログラムを備えていなければなりません。BマシンはAマシンのパスワードを知っている必要があります。次にコードの操作は以下の通りです。これはただ格納過程です。

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[BackSqlorFile]') AND type in (N'P', N'PC'))
 BEGIN
 EXEC dbo.sp_executesql @statement = N'

 
 CREATE proc [dbo].[BackSqlorFile]
 @ServerIp varchar(50),-- IP
 @ServerName varchar(50),--
 @ServerPwd   varchar(50),--
@ServerIISIp varchar(50),--IIs Ip
@ServerIIsName varchar(50),--IIs
@ServerIIsPwd  varchar(50),--IIs
@SqlShareFile    varchar(50),-- sql
@IIsShareFile   varchar(50),-- IIS
@MoveIIsPath   varchar(50),--d:/back
@MoveSqlPath   varchar(50),--d:/sql
@DataName      varchar(50),--
@SqlloginName varchar(50),--
@SqlLoginPwd  varchar(50)--
as
begin
/*=====================================================================*/
--Create data 2007-05-21
--Modify data 2007-05-21
--Autor:sp
--Method: 、 、IIS
/*====================================================================*/
declare @iisname varchar(1000)-- IIS
declare @IISversion varchar(1000)--IIS
declare @MovePath varchar(1000)--COPY
declare @IIsBack varchar(1000)--IIS
declare @IIsBackmd varchar(1000)--IIS MD
declare @IIsBacksc varchar(1000)--IIS SC
declare @SqlName varchar(1000)--
declare @SqlPath varchar(1000)--
declare @IISyshe varchar(1000)--IIS
declare @Sqlyshe varchar(1000)--sql
declare @sqlback varchar(1000)---
declare @url varchar(1000)--
declare @osql varchar(1000)-- DOS
begin
  -- ' + + + ‘
   set @SqlName=@DataName+replace(convert(varchar(50),getdate(),110),''-'','''')+''.bak''
   set @url=''E:/Program Files/Microsoft SQL Server/MSSQL.1/MSSQL/Backup/''+@SqlName
   set @sqlback=''backup database ''+@DataName +'' to disk=''''''+@url+'''''' with init''
   set @iisname=''IIs''+replace(convert(varchar(50),getdate(),110),''-'','''')
   set @osql=''osql -S''+@ServerIp+'' -U''+@SqlloginName+''  -P''+@SqlLoginPwd+''  -dmaster -q"''+@sqlback+''"''
   set @IISversion=''123''--//replace(convert(varchar(50),getdate(),120),'':'',''-)
   set @IISBack=''iisback /Backup /s ''+@ServerIISIp+'' /u ''+@ServerIIsName+'' /p ''+@ServerIIsPwd+'' /b ''+@iisname+'' /v ''+@IISversion+''''-- IIS
   -- /S IP /U /p /b /V /e
   set @IIsBackmd=''copy y:/''+@iisname+''.MD''+@IISversion+'' ''+@MoveIIsPath+''''
   set @IIsBacksc=''copy y:/''+@iisname+''.SC''+@IISversion+'' ''+@MoveIIsPath+''''
   set @Sqlpath=''copy q:/''+@SqlName+'' ''+@MoveSqlPath+''''
   set @IISyshe=''net use y: //''+@ServerIISIp+''/''+@IIsShareFile+'' "''+@ServerIIsPwd+''" /user:''+@ServerIISIp+''/''+@ServerIIsName+''''
   set @Sqlyshe=''net use q: //''+@ServerIp+''/''+@SqlShareFile+'' "''+@ServerPwd+''" /user:''+@ServerIp+''/''+@ServerName+''''
   exec master..xp_cmdshell @IISBack--
   exec master..xp_cmdshell @IISyshe --// IIS''
   exec master..xp_cmdshell @IIsBackmd
   exec master..xp_cmdshell @IIsBacksc
   exec master..xp_cmdshell ''net use y: /delete''--
   exec master..xp_cmdshell @osql--
   exec master..xp_cmdshell @Sqlyshe--// ''
   exec master..xp_cmdshell @Sqlpath
   exec master..xp_cmdshell ''net use q: /delete''--   
END
end
'
END
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Creat_Job]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'
create proc [dbo].[Creat_Job]
@prorcname varchar(1000), -- , , : .. ..
@job_date datetime -- ( )
as
declare @dbname sysname,@jobname sysname,@date int,@time int
select @jobname='' _''+cast(newid() as varchar(36))
 ,@date=convert(varchar,@job_date,112)
 ,@time=replace(convert(varchar,@job_date,108),'':'','''')

if exists(select * from msdb..sysjobs where name=@jobname)
 exec msdb..sp_delete_job @job_name=@jobname

--
exec msdb..sp_add_job @job_name=@jobname,@delete_level=0

--
declare @sql varchar(1000)
select @sql=''exec ''+@prorcname
 ,@dbname=db_name()

exec msdb..sp_add_jobstep @job_name=@jobname,
 @step_name = '' '',
 @subsystem = ''TSQL'',
 @database_name=@dbname,
 @command = @sql,
 @retry_attempts = 5,   --
 @retry_interval = 5    --

--
EXEC msdb..sp_add_jobschedule @job_name = @jobname,
@name = '' '',
@enabled = 1,
@freq_type = 4, --
@active_start_date = @date,
@active_start_time = @time,
@freq_interval =1--
--
EXEC msdb.dbo.sp_add_jobserver
@job_name = @jobname ,
@server_name = N''(local)''
'
END

IISもバックアップし、ネットワークマッピングした結果、Aマシンにもバックアップファイルがあり、Bマシンにも同じバックアップファイルがあります。ここでは作業の操作も利用しています。注意:Sql Server 2005はデフォルトではXp(u)が開いていません。cmdshellこれはシステム格納プロセスですので、EXEC sp_を開けなければなりません。configure'show advanced options'を実行して、RECONFIGUREでもう一度EXEC sp_を実行します。configre'xp_cmdshell'は、最後にRECONFIGUREです。