


SQL Server數(shù)據(jù)庫遷移的快捷方法
一、目的
之前在博文SQL Server數(shù)據(jù)庫最小宕機(jī)遷移方案中提到了使用了完全備份+差異備份的功能完成了數(shù)據(jù)庫的轉(zhuǎn)移,但是這個(gè)方法在遇到了700多G的數(shù)據(jù)時(shí)顯然不適用,所以這篇中我是如何遷移700G的數(shù)據(jù)庫到新的服務(wù)器的。
二、分析與設(shè)計(jì)思路
(一) 環(huán)境描述
我們的數(shù)據(jù)庫使用了SQL Server 2005的,部署在Windows Server 2003 x86位操作系統(tǒng)上,有一個(gè)表占了這個(gè)數(shù)據(jù)庫大部分的空間。
面對(duì)上面的情況,我們的數(shù)據(jù)庫壓力比較大了,所以我們打算在同一個(gè)集群中找另外一臺(tái)機(jī)器,轉(zhuǎn)移這個(gè)數(shù)據(jù)庫的數(shù)據(jù)過去,通過設(shè)置新服務(wù)器的一些參數(shù)來達(dá)到優(yōu)化這個(gè)數(shù)據(jù)庫的目的。
(二) 數(shù)據(jù)分析
在拿到一個(gè)數(shù)據(jù)庫的時(shí)候,我們應(yīng)該查看這個(gè)數(shù)據(jù)庫相關(guān)的信息,在了解了數(shù)據(jù)庫的情況和參數(shù)之后再做出初步的評(píng)估,比如我們需要知道這個(gè)700G的數(shù)據(jù)庫中那些表占用了多少空間,索引占了多少空間(有一個(gè)SQL可以直接查看到這些信息),是否做了表分區(qū)。
了解參數(shù)的時(shí)候可以看看服務(wù)器硬件信息,比如內(nèi)存、硬盤、是否做了RAID策略、什么操作系統(tǒng)、數(shù)據(jù)庫的版本、內(nèi)存的壓力、CPU的壓力等等信息。了解這些信息是我們決定是否遷移到新的服務(wù)器的重要因素。
如果決定了進(jìn)行數(shù)據(jù)遷移,那么為了不影響我們的生產(chǎn)的數(shù)據(jù)庫,讓生產(chǎn)數(shù)據(jù)庫還能進(jìn)數(shù)據(jù),我們一次要搬多少條記錄才是合適的,這個(gè)我們也是需要計(jì)算的。(搬遷的Job盡量讓時(shí)間間隔大點(diǎn),如果前一個(gè)Job還沒有執(zhí)行完的話,后一個(gè)Job即使到了時(shí)間也是不會(huì)執(zhí)行的。)
(三) 設(shè)計(jì)思路
創(chuàng)建一個(gè)表。這個(gè)表用來保存我們一次需要轉(zhuǎn)移的多少數(shù)據(jù)的ID值;(這個(gè)ID是我們要遷移表的主鍵,自增字段)。那我們需要一次性遷移多少數(shù)據(jù)呢?這個(gè)我們可以通過計(jì)算比如1000條記錄有多少M(fèi),一次傳輸對(duì)局域網(wǎng)的壓力大嘛?最好讓ID是一個(gè)整千或者整萬的整數(shù),這樣方便記錄和查看。
創(chuàng)建一個(gè)服務(wù)器對(duì)象-鏈接服務(wù)器。這樣就可以讀取到其它服務(wù)器上的數(shù)據(jù)庫了,可以進(jìn)行數(shù)據(jù)搬遷了(注意這里需要設(shè)置鏈接服務(wù)器的帳號(hào)和密碼)
創(chuàng)建一個(gè)存儲(chǔ)過程。用于讀取、控制轉(zhuǎn)移數(shù)據(jù),這存儲(chǔ)過程需要比較智能一點(diǎn),它需要解決下面缺陷中提到的幾個(gè)問題。
創(chuàng)建一個(gè)Job。這個(gè)Job就調(diào)用這個(gè)存儲(chǔ)過程,不過需要嘗試多幾次調(diào)用的頻率問題。
三、參考腳本
下面列出一些重點(diǎn)的sql,供參考。
--1.1,創(chuàng)建表
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插入數(shù)據(jù)
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測(cè)試
select * from Temp_MoveManage --2,鏈接服務(wù)器(省略)
--3,存儲(chǔ)過程
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: <Viajar> -- Create date: <2011.04.14> -- Deion: <轉(zhuǎn)移數(shù)據(jù)> -- ============================================= 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>=@Id2) 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生成的表中,最后一條記錄無法執(zhí)行,因?yàn)樽詈笠粋(gè)Id是使用<,沒有用=,所以在轉(zhuǎn)移的表中最后一條記錄是沒有轉(zhuǎn)移過分區(qū)表的;
缺陷2:如果轉(zhuǎn)移表的記錄同時(shí)在不斷的增長(zhǎng),那么數(shù)據(jù)就無法把最新的數(shù)據(jù)轉(zhuǎn)移到分區(qū)表了;針對(duì)這個(gè)缺陷,本來的想法是為搬遷輔助表的Id分段加多一些記錄,這樣就可以執(zhí)行最新數(shù)據(jù);
缺陷3:對(duì)于上面的那個(gè)問題,也是有缺陷的,例如現(xiàn)在Id分段是100和200,當(dāng)新數(shù)據(jù)Id>100的某段時(shí)間,這兩個(gè)分段值的IsDone就會(huì)給更新為1,這樣就會(huì)造成缺失了很多數(shù)據(jù);針對(duì)這個(gè)缺陷,也是可以解決的,先去判斷當(dāng)新數(shù)據(jù)的Id>200的時(shí)候,才執(zhí)行導(dǎo)Id為100和200分段的腳本;(在存儲(chǔ)過程中判斷Max(Id)就可以了)
五、注意
對(duì)磁盤做RAID0(看具體情況而定)之后的創(chuàng)建分區(qū)時(shí)需要設(shè)置64K的分配單元大小;
64位操作系統(tǒng)和64位數(shù)據(jù)庫系統(tǒng);
搬遷完之后需要?jiǎng)?chuàng)建這表必要的索引,遷移的時(shí)候沒有創(chuàng)建索引是因?yàn)轭l繁的插入會(huì)影響索引,這些索引需要進(jìn)行存儲(chǔ)位置對(duì)齊;
因?yàn)榘褦?shù)據(jù)庫搬遷到新的服務(wù)器了,程序鏈接的IP地址就需要修改,如果很多程序需要修改鏈接地址,那我們又沒辦法解決呢?可以通過修改服務(wù)器的IP;
測(cè)試相關(guān)的應(yīng)用程序,測(cè)試數(shù)據(jù)庫的運(yùn)行情況;
六、其它
這是一些朋友的建議,這里還沒有嘗試,因?yàn)榄h(huán)境的限制,比如數(shù)據(jù)庫是簡(jiǎn)單模式了等情況。這里記錄下,期待適合環(huán)境的童鞋拿去用。
用Mirror遷移
考慮Log Shipping
先完整備份并在目標(biāo)服務(wù)器還原,遷移前先進(jìn)行事務(wù)日志備份并還原,最后將原庫所有數(shù)據(jù)庫賬號(hào)改為只讀,然后再進(jìn)行一次事務(wù)日志備份并還原,這樣宕機(jī)時(shí)間會(huì)進(jìn)一步減少,而且如果相關(guān)應(yīng)用不需要寫庫,那么在宕機(jī)時(shí)間段里對(duì)應(yīng)用也不會(huì)有太大影響。
關(guān)鍵字:SQL Server、數(shù)據(jù)庫、遷移
新文章:
- CentOS7下圖形配置網(wǎng)絡(luò)的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗(yàn)證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機(jī)IP講解
- CentOS7使用hostapd實(shí)現(xiàn)無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡(luò)重啟出錯(cuò)
- 解決Centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認(rèn)iptable規(guī)則詳解