熱烈祝賀臺州維博網絡的站長論壇隆重上線!(2012-05-28)    熱烈慶祝偉大的祖國60周年生日 點擊進來我們一起為她祝福吧(2009-09-26)    站長論壇禁止發布廣告,一經發現立即刪除。謝謝各位合作!.(2009-08-08)    熱烈祝賀臺州網址導航全面升級,全新版本上線!希望各位一如既往地支持臺州網址導航的發展.(2009-03-28)    臺州站長論壇恭祝各位新年快樂,牛年行大運!(2009-01-24)    臺州Link正式更名為臺州網址導航,專業做以臺州網址為主的網址導航!(2008-05-23)    熱烈祝賀臺州Link資訊改名為中國站長資訊!希望在以后日子里得到大家的大力支持和幫助!(2008-04-10)    熱烈祝賀臺州Link論壇改名為臺州站長論壇!希望大家繼續支持和鼓勵!(2008-04-10)    臺州站長論壇原[社會瑣碎]版塊更名為[生活百科]版塊!(2007-09-05)    特此通知:新臺州站長論壇的數據信息全部升級成功!">特此通知:新臺州站長論壇的數據信息全部升級成功!(2007-09-01)    臺州站長論壇對未通過驗證的會員進行合理的清除,請您諒解(2007-08-30)    臺州網址導航|上網導航誠邀世界各地的網站友情鏈接和友誼聯盟,共同引領網站導航、前進!(2007-08-30)    禁止發廣告之類的帖,已發現立即刪除!(2007-08-30)    希望各位上傳與下載有用資源和最新信息(2007-08-30)    熱烈祝賀臺州站長論壇全面升級成功,全新上線!(2007-08-30)    
便民網址導航,輕松網上沖浪。
臺州維博網絡專業開發網站門戶平臺系統
您當前的位置: 首頁 » MySQL/MSSQL編程 » SQL Server數據庫遷移偏方

SQL Server數據庫遷移偏方

論壇鏈接
  • SQL Server數據庫遷移偏方
  • 發布時間:2011-05-04 15:53:10    瀏覽數:4995    發布者:abcdef133    設置字體【   
一、目的

之前在博文SQL Server數據庫最小宕機遷移方案中提到了使用了完全備份+差異備份的功能完成了數據庫的轉移,但是這個方法在遇到了700多G的數據時顯然不適用,所以這篇中我是如何遷移700G的數據庫到新的服務器的。

二、分析與設計思路

(一) 環境描述

我們的數據庫使用了SQL Server 2005的,部署在Windows Server 2003 x86位操作系統上,有一個表占了這個數據庫大部分的空間。

面對上面的情況,我們的數據庫壓力比較大了,所以我們打算在同一個集群中找另外一臺機器,轉移這個數據庫的數據過去,通過設置新服務器的一些參數來達到優化這個數據庫的目的。

(二) 數據分析

在拿到一個數據庫的時候,我們應該查看這個數據庫相關的信息,在了解了數據庫的情況和參數之后再做出初步的評估,比如我們需要知道這個700G的數據庫中那些表占用了多少空間,索引占了多少空間(有一個SQL可以直接查看到這些信息),是否做了表分區。

了解參數的時候可以看看服務器硬件信息,比如內存、硬盤、是否做了RAID策略、什么操作系統、數據庫的版本、內存的壓力、CPU的壓力等等信息。了解這些信息是我們決定是否遷移到新的服務器的重要因素。

如果決定了進行數據遷移,那么為了不影響我們的生產的數據庫,讓生產數據庫還能進數據,我們一次要搬多少條記錄才是合適的,這個我們也是需要計算的。(搬遷的Job盡量讓時間間隔大點,如果前一個Job還沒有執行完的話,后一個Job即使到了時間也是不會執行的。)

(三) 設計思路

創建一個表。這個表用來保存我們一次需要轉移的多少數據的ID值;(這個ID是我們要遷移表的主鍵,自增字段)。那我們需要一次性遷移多少數據呢?這個我們可以通過計算比如1000條記錄有多少M,一次傳輸對局域網的壓力大嘛?最好讓ID是一個整千或者整萬的整數,這樣方便記錄和查看。

創建一個服務器對象-鏈接服務器。這樣就可以讀取到其它服務器上的數據庫了,可以進行數據搬遷了(注意這里需要設置鏈接服務器的帳號和密碼)

創建一個存儲過程。用于讀取、控制轉移數據,這存儲過程需要比較智能一點,它需要解決下面缺陷中提到的幾個問題。

創建一個Job。這個Job就調用這個存儲過程,不過需要嘗試多幾次調用的頻率問題。

三、參考腳本

下面列出一些重點的sql,供參考。

--1.1,創建表


CREATE TABLE [dbo].[Temp_MoveManage](

[Id] [int] NOT NULL,

[IsDone] [bit] NOT NULL,

[UpdateTime] [datetime] NULL,

CONSTRAINT [PK_Temp_MoveManage] PRIMARY KEY CLUSTERED

(

[Id] ASC

)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]

) ON [PRIMARY]


--1.2插入數據


declare @i int

set @i=1

while @i < 50000000

begin

insert into dbo.Temp_MoveManage values(@i,0)

set @i = @i + 50000

end


--1.3測試

select * from Temp_MoveManage


--2,鏈接服務器(省略)

--3,存儲過程


SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

-- =============================================

-- Author: <Viajar>

-- Create date: <2011.04.14>

-- Description: <轉移數據>

-- =============================================

ALTER PROCEDURE [dbo].[sp_GetMoveData]

AS

BEGIN

DECLARE @Id1 INT,@Id2 INT

DECLARE @MaxId INT--原表的最大值

SET @Id1 = 0

SET @Id2 = 0

SELECT TOP 1 @Id1 = Id FROM Temp_MoveManage WHERE IsDone = 0 ORDER BY Id

SELECT TOP 1 @Id2 = Id FROM Temp_MoveManage WHERE IsDone = 0 AND Id > @Id1 ORDER BY Id

SELECT @MaxId = MAX(Id) FROM [dbo].[ClassifyResult]

IF(@Id1 != 0 AND @Id2 != 0 AND @MaxId>[email protected])

BEGIN

DECLARE @sql VARCHAR(MAX)

SET @sql = '

SET IDENTITY_INSERT [ClassifyResult_T] ON

INSERT INTO [dbo].[ClassifyResult_T](

[Id]

,[ClassId]

,[ArchiveId])

SELECT

[Id]

,[ClassId]

,[ArchiveId]

FROM [dbo].[ClassifyResult]

WHERE Id >= '+ CONVERT(VARCHAR(100),@Id1) + ' and Id < '+ CONVERT(VARCHAR(100),@Id2) + '

ORDER BY Id

SET IDENTITY_INSERT [ClassifyResult_T] OFF '

EXEC (@sql)

UPDATE Temp_MoveManage SET IsDone = 1 WHERE Id = @Id1

END

END


--4,Job(省略)

四、缺陷

缺陷1:在CreateTable生成的表中,最后一條記錄無法執行,因為最后一個Id是使用《,沒有用=,所以在轉移的表中最后一條記錄是沒有轉移過分區表的;

缺陷2:如果轉移表的記錄同時在不斷的增長,那么數據就無法把最新的數據轉移到分區表了;針對這個缺陷,本來的想法是為搬遷輔助表的Id分段加多一些記錄,這樣就可以執行最新數據;

缺陷3:對于上面的那個問題,也是有缺陷的,例如現在Id分段是100和200,當新數據Id》100的某段時間,這兩個分段值的IsDone就會給更新為1,這樣就會造成缺失了很多數據;針對這個缺陷,也是可以解決的,先去判斷當新數據的Id》200的時候,才執行導Id為100和200分段的腳本;(在存儲過程中判斷Max(Id)就可以了)

五、注意

對磁盤做RAID0(看具體情況而定)之后的創建分區時需要設置64K的分配單元大;

64位操作系統和64位數據庫系統;

搬遷完之后需要創建這表必要的索引,遷移的時候沒有創建索引是因為頻繁的插入會影響索引,這些索引需要進行存儲位置對齊;

因為把數據庫搬遷到新的服務器了,程序鏈接的IP地址就需要修改,如果很多程序需要修改鏈接地址,那我們又沒辦法解決呢?可以通過修改服務器的IP;

測試相關的應用程序,測試數據庫的運行情況;

六、其它

這是一些朋友的建議,這里還沒有嘗試,因為環境的限制,比如數據庫是簡單模式了等情況。這里記錄下,期待適合環境的童鞋拿去用。

用Mirror遷移

考慮Log Shipping

先完整備份并在目標服務器還原,遷移前先進行事務日志備份并還原,最后將原庫所有數據庫賬號改為只讀,然后再進行一次事務日志備份并還原,這樣宕機時間會進一步減少,而且如果相關應用不需要寫庫,那么在宕機時間段里對應用也不會有太大影響。
娛樂休閑專區A 影視預告B 音樂咖啡C 英語階梯D 生活百科
網頁編程專區E AMPZF HTMLG CSSH JSI ASPJ PHPK JSPL MySQLM AJAX
Linux技術區 N 系統管理O 服務器架設P 網絡/硬件Q 編程序開發R 內核/嵌入
管理中心專區S 發布網址T 版主議事U 事務處理
陕西快乐10分玩法 天中图库 好运彩 新快三 吉林十一选五开奖查询 宁夏11选五投注平台 河北福彩排列七走势图 红牛策略配资 广东36选7开奖时间几点 长春11选5走势图 泳坛夺金中奖规则 我要赚钱网网赚论坛