掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
一、目的

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:空間域名、網(wǎng)站空間、營銷軟件、網(wǎng)站建設(shè)、伽師網(wǎng)站維護、網(wǎng)站推廣。
之前在博文SQL Server數(shù)據(jù)庫最小宕機遷移方案中提到了使用了完全備份+差異備份的功能完成了數(shù)據(jù)庫的轉(zhuǎn)移,但是這個方法在遇到了700多G的數(shù)據(jù)時顯然不適用,所以這篇中我是如何遷移700G的數(shù)據(jù)庫到新的服務(wù)器的。
二、分析與設(shè)計思路
(一) 環(huán)境描述
我們的數(shù)據(jù)庫使用了SQL Server 2005的,部署在Windows Server 2003 x86位操作系統(tǒng)上,有一個表占了這個數(shù)據(jù)庫大部分的空間。
面對上面的情況,我們的數(shù)據(jù)庫壓力比較大了,所以我們打算在同一個集群中找另外一臺機器,轉(zhuǎn)移這個數(shù)據(jù)庫的數(shù)據(jù)過去,通過設(shè)置新服務(wù)器的一些參數(shù)來達到優(yōu)化這個數(shù)據(jù)庫的目的。
(二) 數(shù)據(jù)分析
在拿到一個數(shù)據(jù)庫的時候,我們應(yīng)該查看這個數(shù)據(jù)庫相關(guān)的信息,在了解了數(shù)據(jù)庫的情況和參數(shù)之后再做出初步的評估,比如我們需要知道這個700G的數(shù)據(jù)庫中那些表占用了多少空間,索引占了多少空間(有一個SQL可以直接查看到這些信息),是否做了表分區(qū)。
了解參數(shù)的時候可以看看服務(wù)器硬件信息,比如內(nèi)存、硬盤、是否做了RAID策略、什么操作系統(tǒng)、數(shù)據(jù)庫的版本、內(nèi)存的壓力、CPU的壓力等等信息。了解這些信息是我們決定是否遷移到新的服務(wù)器的重要因素。
如果決定了進行數(shù)據(jù)遷移,那么為了不影響我們的生產(chǎn)的數(shù)據(jù)庫,讓生產(chǎn)數(shù)據(jù)庫還能進數(shù)據(jù),我們一次要搬多少條記錄才是合適的,這個我們也是需要計算的。(搬遷的Job盡量讓時間間隔大點,如果前一個Job還沒有執(zhí)行完的話,后一個Job即使到了時間也是不會執(zhí)行的。)
(三) 設(shè)計思路
三、參考腳本
下面列出一些重點的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測試
- select * from Temp_MoveManage
--2,鏈接服務(wù)器(省略)
--3,存儲過程
- SET ANSI_NULLS ON
- GO
- SET QUOTED_IDENTIFIER ON
- GO
- -- =============================================
- -- Author:
- -- Create date: <2011.04.14>
- -- Description: <轉(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í)行,因為最后一個Id是使用<,沒有用=,所以在轉(zhuǎn)移的表中最后一條記錄是沒有轉(zhuǎn)移過分區(qū)表的;
缺陷2:如果轉(zhuǎn)移表的記錄同時在不斷的增長,那么數(shù)據(jù)就無法把最新的數(shù)據(jù)轉(zhuǎn)移到分區(qū)表了;針對這個缺陷,本來的想法是為搬遷輔助表的Id分段加多一些記錄,這樣就可以執(zhí)行最新數(shù)據(jù);
缺陷3:對于上面的那個問題,也是有缺陷的,例如現(xiàn)在Id分段是100和200,當新數(shù)據(jù)Id>100的某段時間,這兩個分段值的IsDone就會給更新為1,這樣就會造成缺失了很多數(shù)據(jù);針對這個缺陷,也是可以解決的,先去判斷當新數(shù)據(jù)的Id>200的時候,才執(zhí)行導(dǎo)Id為100和200分段的腳本;(在存儲過程中判斷Max(Id)就可以了)
五、注意
六、其它
這是一些朋友的建議,這里還沒有嘗試,因為環(huán)境的限制,比如數(shù)據(jù)庫是簡單模式了等情況。這里記錄下,期待適合環(huán)境的童鞋拿去用。
原文鏈接:http://www.cnblogs.com/gaizai/archive/2011/04/28/2032031.html
【編輯推薦】

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流