1. 程式人生 > >實戰:sqlserver 2008 R2容災方案:另一種思路-1

實戰:sqlserver 2008 R2容災方案:另一種思路-1

自己的定義的容災方案,可以根據自己的需要自己定義.

1.源資料庫備份資料

說明:
使用方法:exec master.dbo.fullbackup1 's:\backup','suzhou','full'


0.備份型別只能是full、diff或log,資料庫名不能為空

1.通過新建一個歷史表記錄每次備份內容

2.檢查資料庫版本是否為2005以上

3.檢查當前使用者是否有許可權完成備份


4.會自動檢查指定碟符是否存在

5.檢查指定格式是否為s:\

6.如果指定的備份目錄不存在proc將自動新建,根據備份型別為full、diff或log

7.檢查備份資料庫名suzhou是否存在並聯機

8.檢查備份資料庫名suzhou不能是臨時資料庫

9.如果備份型別為差異備份則檢查是否有完全備份存在並且備份的這個檔案存在於指定的目錄下,
如果備份歷史表有記錄但是該備份檔案不存在將終止備份

10.如果備份型別為日誌備份,先檢查資料庫恢復模式是否為完整,否則將停止備份;
將進一步檢查備份歷史表和備份檔案,必須存在完全備份或差異備份,否則終止備份


USE [msdb]
GO
if OBJECT_ID('backuphistory')is not null
drop table backuphistory
go
CREATE TABLE [dbo].[backuphistory](
 [sid] [int] IDENTITY(1,1) NOT NULL primary key,
 [dbname] [sysname] NOT NULL,
 [backtype] [char](2) NOT NULL,
 [lastbackup] [datetime] NOT NULL,
 [backupdesc] [varchar](20) NOT NULL,
 [backupfilename] [nvarchar](max) NULL,
)
GO

use master
go
create PROCEDURE [dbo].[fullbackup1]
(
@backupPath varchar(500),
@dbname sysname,
@backuptype varchar(100)
)
with encryption
as

declare @currentuser sysname
declare @role varchar(30)
select   @currentuser=system_user

DECLARE @Version numeric(18,10)
DECLARE @Error int
declare @Directory nvarchar(100)
DECLARE @CheckDirectory nvarchar(4000)
DECLARE @DirectoryInfo TABLE (FileExists bit,
                                FileIsADirectory bit,
                                ParentDirectoryExists bit)
DECLARE @ErrorMessage nvarchar(max)
DECLARE @backupPath2 nvarchar(500)
DECLARE @DirTree TABLE (subdirectory nvarchar(255), depth INT)
DECLARE @FullPath varchar(1000)
declare @backupPath3 nvarchar(500)
declare @recovery_model_desc varchar(20)
declare @backtype varchar(100)
declare @backupdesc varchar(20)
declare @backupfilename varchar(max)

-----new
DECLARE @tmp TABLE (backupfilename varchar(3000),
                                backuptime datetime)
declare @fullbafile varchar(3000)
declare @result int
declare @log_start int


set nocount on

--檢查使用者許可權
select @role=srvrole from
(
select SrvRole = g.name, MemberName = u.name
  from sys.server_principals u, sys.server_principals g, sys.server_role_members m
 where g.principal_id = m.role_principal_id
   and u.principal_id = m.member_principal_id
   and [email protected]
   ) c
  --order by 1, 2
if @role !='sysadmin' or @role is null or @role=''
begin
  RAISERROR('當前使用者沒有需要的許可權完成備份!',16,1)
  print '你可能是越權操作或其它!'+char(13)+'請聯絡DBA!'
  SET @Error = @@ERROR
  return
end


--檢查伺服器版本
SET @Error = 0
SET @Version = CAST(LEFT(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max)),
CHARINDEX('.',CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max))) - 1) + '.'
+ REPLACE(RIGHT(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max)),
LEN(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max))) - CHARINDEX('.',
CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max)))),'.','') AS numeric(18,10))
IF @Version < 9
BEGIN
  RAISERROR('該備份方案僅支援 SQL Server 2005, SQL Server 2008和SQL Server 2008 R2.',16,1)
  SET @Error = @@ERROR
  return
END

set @[email protected]

--判斷路徑格式
  IF NOT (@Directory LIKE '[a-z]:\%' )
  BEGIN
    SET @ErrorMessage = '輸入的目錄'[email protected]+'格式'+ '不支援!.'+' 參考型別如: s:\backup' + CHAR(13) + CHAR(10)
    RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
    SET @Error = @@ERROR
    return
  END

--判斷輸入的資料庫名是否存在

  IF @dbname not in(select name from sys.databases)
  BEGIN
    SET @ErrorMessage = '資料庫名: '[email protected]+' 不存在!.' + CHAR(13) + CHAR(10)
    RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
    SET @Error = @@ERROR
    return
  END


--判斷輸入的碟符是否存在和是否新建目錄
--檢查指定碟符是否存在

SET @CheckDirectory = substring(@Directory,1,3)
INSERT INTO @DirectoryInfo (FileExists, FileIsADirectory, ParentDirectoryExists)
EXECUTE [master].dbo.xp_fileexist @CheckDirectory
IF NOT EXISTS (SELECT * FROM @DirectoryInfo WHERE FileExists = 0 AND FileIsADirectory = 1 AND ParentDirectoryExists = 1)
  BEGIN
    SET @ErrorMessage = '伺服器上不存在指定的碟符:'+upper(substring(@CheckDirectory,1,1)+ CHAR(13) + CHAR(10))
    RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
    SET @Error = @@ERROR
    return
 END

--判斷是否輸入備份資料庫名
IF @dbname IS NULL OR @dbname = ''
  BEGIN
    SET @ErrorMessage = '未輸入任何備份資料庫名.' + CHAR(13) + CHAR(10)+'備份程序已終止!'
    RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
    SET @Error = @@ERROR
    return
  END

else if (@dbname='tempdb' or @dbname='TEMPDB')
 begin
 SET @ErrorMessage = '臨時資料庫不需要備份.' + CHAR(13) + CHAR(10)+'備份程序已終止!'
    RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
    SET @Error = @@ERROR
    return
 end
else if (@dbname  in ( select name from sys.databases where state_desc='OFFLINE' or state_desc='offline'))
 begin
 SET @ErrorMessage = '離線的資料庫'[email protected]+'不需要備份.' + CHAR(13) + CHAR(10)+'備份程序已終止!'
    RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
    SET @Error = @@ERROR
    return
 end

--判斷輸入型別
if  @backuptype not in ('full','diff','log')
begin
 print '#########################嚴重警告###############嚴重警告#################################'
 print '不支援型別'[email protected]+'!   只能輸入(full:完全備份; diff:差異備份; log:日誌備份)                        '
 print '有問題請聯絡ocpyang!'
 print '#########################嚴重警告###############嚴重警告###################################'
 return
end

--判斷目錄是否存在
SET @[email protected]+'\'[email protected]
INSERT INTO @DirTree(subdirectory, depth)
EXEC master.sys.xp_dirtree @backupPath
IF NOT EXISTS (SELECT 1 FROM @DirTree WHERE subdirectory = @DBName)
begin
 print '系統將新建目錄:'[email protected]+' ............' 
   EXEC master.dbo.xp_create_subdir @backupPath2
   print '目錄:'[email protected]+'新建成功!'
   print '         '
   delete from  @DirTree
end
else
begin
 print '----------------------------------------------------------------------- '
 print '目錄:'[email protected]+'已經存在!'
 print '                                                                        '+char(13)+'備份執行中$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'
 print '----------------------------------------------------------------------- '
 delete from  @DirTree
end


--開始完全備份
if @backuptype='full'
begin
print '.............................................................................'
print '開始完全備份.....請稍等'
print '.............................................................................'
--隱藏檢查目錄
set @[email protected]+'\'+'full'
INSERT INTO @DirTree(subdirectory, depth)
EXEC master.sys.xp_dirtree @backupPath3
IF NOT EXISTS (SELECT 1 FROM @DirTree WHERE subdirectory = @backupPath3)
EXEC master.dbo.xp_create_subdir @backupPath3
delete from @DirTree
set @FullPath = @backuppath3+'\'[email protected]+'_'[email protected]+'_'+replace(replace(replace(convert(varchar,getdate(),20),'-',''),' ',''),':','')+ '.bak'
backup database @dbname to [email protected]
WITH buffercount = 20, maxtransfersize = 2097152 ,
COMPRESSION,RETAINDAYS=15,NOFORMAT,NOINIT,
NAME=N'完整備份',SKIP,NOREWIND,
NOUNLOAD,STATS=10

set @backtype='D'
set @backupdesc='完全備份'
set @[email protected]
insert into msdb.dbo.backuphistory
(dbname,backtype,lastbackup,backupdesc,backupfilename)
values(@dbname, @backtype,GETDATE(), @backupdesc,@backupfilename)
    SET @Error = @@ERROR
    if @Error !=0
    begin
    SET @ErrorMessage = '資料庫'[email protected]+'完全備份未順利完成!: ' + CHAR(13) + CHAR(10)
    RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
    return
    end
  
print '                                                                    '
print '----------------------------------------------------------------------- '
print @dbname+'完全備份 '[email protected]+' 已經完成!'
print '----------------------------------------------------------------------- '
return
end

--開始差異備份
else if @backuptype='diff'
begin
 print '                                                                             '
 print '.............................................................................'
    print '開始差異備份.....請稍等'
    print '.............................................................................'
    --檢查是否有完全備份並存在
 insert into @tmp                        
 select top 1  a.backupfilename,
 MAX(a.lastbackup)  as backuptime from msdb.dbo.backuphistory a
 where [email protected] and a.backtype='D'
 group by backupfilename
 order by a.backupfilename desc
 if not exists (select top 1 1 from @tmp )
    begin
    SET @ErrorMessage = '資料庫'[email protected]+'沒有完全備份歷史記錄!!' + CHAR(13) + CHAR(10)
    RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
    return
    end
 else
 begin 
     select @fullbafile=backupfilename from @tmp
     exec xp_fileexist @fullbafile, @result output
  if (@result=0 )
  begin
  SET @ErrorMessage = '資料庫'[email protected]+'完全備份檔案不存在!做差異備份無意義!' + CHAR(13) + CHAR(10)
  RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
  return
  end
     end


    --隱藏檢查目錄
 set @[email protected]+'\'+'diff'
 INSERT INTO @DirTree(subdirectory, depth)
 EXEC master.sys.xp_dirtree @backupPath3
 IF NOT EXISTS (SELECT 1 FROM @DirTree WHERE subdirectory = @backupPath3)
 EXEC master.dbo.xp_create_subdir @backupPath3
 delete from @DirTree
 set @FullPath = @backuppath3+'\'[email protected]+'_'[email protected]+'_'+replace(replace(replace(convert(varchar,getdate(),20),'-',''),' ',''),':','')+ '.diff'
 backup database @dbname to [email protected]
 WITH buffercount = 30, maxtransfersize = 2097152 ,
 COMPRESSION, DIFFERENTIAL,RETAINDAYS=8,NOFORMAT,NOINIT,
 NAME=N'差異備份',SKIP,NOREWIND,
 NOUNLOAD,STATS=10
 
 set @backtype='I'
 set @backupdesc='差異備份'
 set @[email protected]
 insert into msdb.dbo.backuphistory
 (dbname,backtype,lastbackup,backupdesc,backupfilename)
 values(@dbname, @backtype,GETDATE(), @backupdesc,@backupfilename)
    SET @Error = @@ERROR
    if @Error !=0
    begin
    SET @ErrorMessage = '資料庫'[email protected]+'差異備份未順利完成!: ' + CHAR(13) + CHAR(10)
    RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
    return
    end
 
 
 print '                                                                    '
   print '----------------------------------------------------------------------- '
   print @dbname+'差異備份 '[email protected]+' 已經完成!'
  print '----------------------------------------------------------------------- '
  return
end
 
 
--開始日誌備份
else  if @backuptype='log'
begin
 print '                                                                        '
    print '檢查環境.....請稍等..'
    print '                                                                        '
    --檢查資料庫恢復模式
 select @recovery_model_desc=recovery_model_desc from sys.databases
 where [email protected]
 if @recovery_model_desc not in ('full')
 begin
 print '########錯誤資訊######################################################'
 print '                                                                         '+char(13)+'請檢查資料庫'[email protected]+'的恢復模式!'+char(13)+ '使用命令ALTER DATABASE'[email protected]+' SET RECOVERY FULL WITH NO_WAIT修改!'
 print '                                                                         '
 print '########錯誤資訊######################################################'
 print '                                                                         '+char(13)+'日誌備份已終止!'
 return
 end
    print '.........................................................................'
 print '                                                                         '
    print '開始日誌備份.....請稍等'
    print '                                                                         '
    print '.........................................................................'
   
    --檢查是否有完全備份或差異備份
   -------------------------------------------------------------------------
   
        --檢查是否有完全備份並存在
   

set  @log_start=0  
insert into @tmp                        
select top 1  a.backupfilename,
MAX(a.lastbackup)  as backuptime from msdb.dbo.backuphistory a
where [email protected] and a.backtype='D'
group by backupfilename
order by a.backupfilename desc
if not exists (select top 1 1 from @tmp)
    begin
  set  @log_start=1
    end
else
 begin 
    select @fullbafile=backupfilename from @tmp
    exec xp_fileexist @fullbafile, @result output
  if (@result=0 )
  begin
   set  @log_start=2
  end

  end
 
  --檢查是否有差異備份並存在
insert into @tmp                        
select top 1  a.backupfilename,
MAX(a.lastbackup)  as backuptime from msdb.dbo.backuphistory a
where [email protected] and a.backtype='I'
group by backupfilename
order by a.backupfilename desc
if not exists (select top 1 1 from @tmp)
    begin
 set  @log_start=3
    end
else
 begin 
    select @fullbafile=backupfilename from @tmp
    exec xp_fileexist @fullbafile, @result output
  if (@result=0 )
  begin
   set  @log_start=4
  end
 end

if @log_start !=0
begin
    SET @ErrorMessage = '資料庫'[email protected]+'沒有完全備份或差異備份!: ' + CHAR(13) + CHAR(10)
    RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
    return
end


   
   
   
   
   
    ------------------------------------------------------------------------------
   
    --隱藏檢查目錄
    set @[email protected]+'\'+'log'
    INSERT INTO @DirTree(subdirectory, depth)
 EXEC master.sys.xp_dirtree @backupPath3
 IF NOT EXISTS (SELECT 1 FROM @DirTree WHERE subdirectory = @backupPath3)
 EXEC master.dbo.xp_create_subdir @backupPath3
 delete from @DirTree
 --開始備份
 set @FullPath = @backuppath3+'\'[email protected]+'_'[email protected]+'_'+replace(replace(replace(convert(varchar,getdate(),20),'-',''),' ',''),':','')+ '.trn'
 backup log @dbname to [email protected] WITH COMPRESSION,RETAINDAYS=3,NOFORMAT,NOINIT,
 NAME=N'日誌備份',SKIP,NOREWIND,
 NOUNLOAD,STATS=10
 
 set @backtype='L'
 set @backupdesc='日誌備份'
 set @[email protected]
 insert into msdb.dbo.backuphistory
 (dbname,backtype,lastbackup,backupdesc,backupfilename)
 values(@dbname, @backtype,GETDATE(), @backupdesc,@backupfilename)
    SET @Error = @@ERROR
    if @Error !=0
    begin
    SET @ErrorMessage = '資料庫'[email protected]+'日誌備份未順利完成!: ' + CHAR(13) + CHAR(10)
    RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
    return
    end
 
 
  print '                                                                    '
   print '-------------------------------------------------------------------------'
   print @dbname+'日誌備份 '[email protected]+' 已經完成!'
  print '---------------------------------------------------------------------------'
  return
end
set nocount off
GO

相關推薦

實戰:sqlserver 2008 R2方案:思路-1

自己的定義的容災方案,可以根據自己的需要自己定義. 1.源資料庫備份資料 說明: 使用方法:exec master.dbo.fullbackup1 's:\backup','suzhou','full' 0.備份型別只能是full、diff或log,資料庫名不能為空

思路比較2個日期是否相等的方式

字符 進行 != 思路 ati 轉換 格式轉換 new imp 我們在應用中經常會遇到2個日期比較是否同一年,或者同一個月或者同一日,等。 常規方式,我們通過逐個年,月,日的比較,才能確定是否是同一年,或同一個月或同一日。 我們換一種思路,把2個日期按同一個日期格式轉換成字

Flash存取資料的思路

在嵌入式專案中,為了讓裝置在斷電後某些關鍵引數不丟失,比如裝置ID,網路配置,外設配置等。我們會將這些關鍵的引數儲存到片內的Flash中。一般的做法都是在Flash劃分一塊空間做儲存引數用,並且裡面有一個空間儲存一個標誌,這個標誌指示了Flash中是否儲存了有效的引數。在第一次燒錄程式時,Flash

Android進階——自定義View之擴充套件系統控制元件的思路實現漸變文字動畫的TextView

引言 前面幾篇文章 繼承或組合系統現有控制元件實現新控制元件,擴充套件新功能都是在對應的構造方法中去擴充套件的,但千萬不要把思路侷限於只能在構造方法中去擴充套件,這篇就簡單地分享另一種思路,通過重寫對應的週期方法實現擴充套件。 一、View中幾種重

爬蟲系列5:scrapy動態頁面爬取的思路

前面有篇文章給出了爬取動態頁面的一種思路,即應用Selenium+Firefox(參考《scrapy動態頁面爬取》)。但是selenium需要執行本地瀏覽器,比較耗時,不太適合大規模網頁抓取。 事實上,還有一種執行效率更高的方法。就是事先分析js發出的GET或者POST請求

sqlserver 2008 r2 直接下載地址,可用迅雷下載

ans ont server2 ros nload 企業版 microsoft type sans 轉自 http://www.cnblogs.com/chinafine/archive/2010/12/23/1915312.html sqlserver 2008 r2 直

SQLSERVER 2008 R2 事務日誌已滿

rim command star 進程 模式 執行 查看 alter 斷開 方法一: USE [master] GO ALTER DATABASE DNName SET RECOVERY SIMPLE WITH NO

MongDB叢集方案步驟

MongoDB複製集優/特點支援大資料量、高擴充套件性、高效能、靈活資料模型、高可用性。同步機制資料複製的目的是使資料得到最大的可用性,避免單點故障引起的整站不能訪問的情況的發生,Mongodb的副本集在同一時刻只有一臺伺服器是可以寫的,副本集的主從複製也是一個非同步同步的過程,是slave端從primary

sqlserver 2008 r2 直接下載地址

之前下載的sqlserver2008發現不能附加,就解除安裝了,重新找到了sqlserver2008R2的百度雲資源 解除安裝sqlserver2008還是有點麻煩,不過就是需要刪除登錄檔中的資訊 自己來回解除安裝了3次終於重灌sqlserver2008R2成功了 sqlserver 2

Sqlserver 2008 r2--當前使用者匯入資料庫,許可權不夠。解決如下

    重啟再匯入一次就行了。 注:我們在SQL Server 配置管理器中將相應的SQL Server例項的登入身份修改為【本地系統】使用者組即Local System, 不要改變資料檔案的許可權範圍,仍以SA身份連線登入SQL Server 2008的例項也能訪問相應的

OceanBase資料庫高可用及方案詳細介紹

1     前言 眾所周知,作為生產系統中極為關鍵的核心軟體,資料庫產品的高可用性一直是使用者極為關注的功能點。尤其是在金融這樣一個特殊的領域裡,無論是從監管的要求來看,還是從業務需求本身來看,都需要提供24*7持續不間斷的服務,這就對金融行業中資料庫產品的高可用性提出了很

sqlserver 2008 R2 無法連線到伺服器

今天開啟sqlserver 突然之間登陸時報錯,錯誤如下: 標題: 連線到伺服器 無法連線到 localhost。 其他資訊: 在與 SQL Server 建立連線時出現與網路相關的或特定於例項的錯誤。未找到或無法訪問伺服器。請驗證例項名稱是否正確並且 SQL

淺談基於VCS+VVR+GCO組合的資料方案

       容災技術以往只有在對資訊資料特別敏感的金融和通訊領域應用,但隨著容災技術的發展和企業對資訊資料的重視層度的提高,整個資訊市場也就對災難場景下業務系統的快速恢復和資料保護提出了需求。現有的容災技術包含以下幾類:        1. 基於硬體平臺的資料容災解決方案,如IBM PPRC,EM

騰訊:3億人次實戰演習驗證異地架構與快速排程能力

作者介紹: 李光 現就職於騰訊SNG社交網路運營部,負責SNG移動類產品的業務運維,同時也負責運營平臺規劃與運維產品運營推廣工作 前言 社交網路事業群擁有眾多海量規模的業務,在海量的運營壓力下,伺服器裝置的數量也突破了10w大關,並有序的分佈在全國不同的IDC中實現異地容災的高可用架構。 但正因為社

Sqlserver 2008 R2安裝配置(win64)

Sqlserver 2008 R2安裝配置 準備:sqlserver2008的安裝包,如果是win64位系統需要安裝.net framework3.5版本或者以上(安裝.net framework的方法是:在圖示<我的電腦>上右擊選擇<管理>,開啟以

DBCC大全集之(適用版本MS SQLServer 2008 R2)----DBCC CHECKTABLE檢查組成表或索引檢視的所有頁和結構的完整性

如果 DBCC CHECKTABLE 報告了任何錯誤,那麼,我們建議從資料庫備份中還原資料庫,而不是使用某個 REPAIR 選項來執行 REPAIR。如果沒有備份,則執行 REPAIR 也可以更正報告的錯誤。要使用的修復選項在報告的錯誤的末尾處指定。但是,使用 REPAIR_ALLOW_DATA_LOSS

DBCC大全集之(適用版本MS SQLServer 2008 R2)----DBCC TRACEON啟用指定的跟蹤標記

在生產伺服器上,為了避免意外行為,建議您使用下列方法之一,僅在伺服器範圍內啟用跟蹤標記。 使用 Sqlservr.exe 的 -T 命令列啟動選項。這是推薦的最佳實踐,因為這樣可確保將所有語句執行時使用已啟用的跟蹤標誌。這些語句包括啟動指令碼中的命令。有關詳細資訊,請參閱 sqlservr 應用程式

WinServer2012 R2忘記密碼的解決方案+遠端連線莫名其妙故障

之前朋友有問道我WinServer2003密碼破解的事情,基本上密碼忘記了都是進PE用密碼清除的工具,之前有說過通過語音播報破解Windows登入密碼,那個本質就是替換cmd.exe就不介紹了,我伺服器密碼剛好也忘記了,因為暫時不幹IT所以就不高興深究了,今天介紹兩款現成的工具: 這個是我今天用到的,密

DBCC大全集之(適用版本MS SQLServer 2008 R2)----DBCC DBREINDEX對指定資料庫中的表重新生成一個或多個索引

DBCC DBREINDEX 重新生成表的一個索引或為表定義的所有索引。通過允許動態重新生成索引,可以重新生成強制 PRIMARY KEY 或 UNIQUE 約束的索引,而不必刪除並重新建立這些約束。這意味著無需瞭解表的結構或其約束,即可重新生成索引。這可能在將資料大容量複製到表中以後發生。 DBCC

sqlserver 2008 R2 資料庫出現"可疑"解決

原因: 在進行些不正常操作如資料庫在讀寫時而無故停止資料庫,從而導致Sql Server 資料庫不正常中斷, 當再次開啟資料庫時會發現某些資料庫會被標記為“可疑”(suspect) 解決: 1、修改資料庫為緊急模式 ALTER DATABASE SSDB SET EMERG