我們都知道,SQL server2008R2企業版以及一些其它的版本支持分區函數,當你在這些數據庫備份后想在一些不支持分區函數的數據庫做還原時,就會失敗。
下面我們來解決這個問題。
1.備份數據庫!備份數據庫!備份數據庫! (對數據庫動任何刀子前先備份)
2.刪除分區函數所涉及的表,因為在建表的時候我們做了關聯,所以刪除主要是切斷這個關聯以及相關的文件。
3.刪除關聯、刪除分區文件 sql語句如下
select * from sys.partition_schemes 查詢分區
select * from sys.partition_range_values 查詢分區范圍
select * from sys.partition_functions 查詢分區函數
DROP PARTITION SCHEME 查詢分區.[name]
DROP PARTITION FUNCTION 查詢分區函數.[name]
執行Drop語句后再做上面的查詢應該已經查不到任何內容。
刪除分區文件
ALTER DATABASE [DataBase] REMOVE FILE [分區文件名];
ALTER DATABASE [DataBase] REMOVE FILEGROUP [分區文件組名]
名稱可以通過對應庫的創建腳本查看
.
.
.
可能有多個這樣的分區和分區組手動一一執行吧
到這里所有的刪除就已經完成了,備份,還原,成功!
這里再多分享一個我碰到的問題,上面的方法在高版本(sqlserver2016)下已經沒有問題,但是碰到需要還原的數據庫為低版本有兼容性問題,這個問題碰到過很多次,我的方法是在高版本下生成創建數據庫的腳本和創建數據庫數據的腳本,這里腳本的內容可能比較大會造成打不開的情況。所以就用遠程創建一個鏈接服務器,將數據倒插入低版本數據庫。有余表的數量較多,不可能每一個都手動來,這里提供一個腳本來生成這些插入語句。
declare @name nvarchar(50)
declare @sqltable table (sqlstr nvarchar(2000)) --插入語句的臨時表
declare @para nvarchar(1000) --表列名串,因為SET IDENTITY_INSERT 語句需要有列名的情況下才可以使用,這里需要將列名拼接起來
DECLARE MyCursor CURSOR
FOR SELECT Name FROM SysObjects Where XType=‘U‘--查詢庫里的所有表然后遍歷
--打開一個游標
OPEN MyCursor
--匹配第一條記錄
FETCH NEXT FROM MyCursor INTO @name
WHILE @@FETCH_STATUS =0
BEGIN
select @para = stuff((select ‘,‘+ltrim(name) from SYSCOLUMNS where ID=OBJECT_ID(@name )
for xml path(‘‘)),1,1,‘‘)
if exists (Select 1 From sysColumns Where id=object_id(@name) and Status=128)--判斷是否存在標識鍵(一般是ID自增)
insert into @sqltable values(
‘SET IDENTITY_INSERT ‘+@name+‘ ON ‘+‘insert into ‘+@name+‘(‘+@para+‘) select ‘+@para+‘ from [鏈接服務器的庫]..‘+@name+‘ SET IDENTITY_INSERT ‘+@name+‘ OFF‘
)
else
insert into @sqltable values (‘insert into ‘+@name + ‘ select * from [鏈接服務器的庫]..‘+@name)
FETCH NEXT FROM MyCursor INTO @name
END
--關閉游標
CLOSE MyCursor
--釋放資源
DEALLOCATE MyCursor
select * from @sqltable
將查詢結果全部復制出來遍可以執行了