·
如何把高版本的SQLServer 還原到低版本的 sqlserver
微軟的軟件設計方案基本上都是新版本兼容舊版本,舊版本不兼容新版本。
所以,直接通過 【數據庫備份】的.bak文件,來進行【數據庫還原】的方式是不支持的。
方案一:直接使用生成的完整數據庫sql來還原
{ 僅用於小數據庫(數據庫完整導出的.sql文件小於100M) }
整體思路: 通過新版本的SQLServer生成兼容低版本的.sql腳本,然后將sql腳本實現在低版本SQLServer上執行。從而創建數據庫。
假設:需要實現的功能是 把sqlserver2016(2012)的數據庫備份到sqlserver2012(2008),數據庫名為Test,並且這兩個數據庫在不同的服務器上。
1. 打開SQL Server Management Studio (下方簡稱SSMS),鏈接新版本的數據庫服務器;
2. 右鍵點擊需要導出的數據庫Test-屬性-選項 看到如下圖
2. 右鍵Test-任務-生成腳本,下一步-下一步到達下圖,點【高級】選項。把【script for sql version】改成你要降級的那個版本 也就是【sql2008】。確定完成即可。會生成一個【script.sql】腳本文件。
3.下一步要把sqlserver2012源文件復制到另外一個電腦上。由於SqlServer正在運行是無法復制的。所以首先要【停止】sqlserver服務。
4. 找到sql2012數據庫在電腦中的位置。 右鍵【數據庫】-【文件】會有路徑,復制出這兩個文件來。 至此sqlserver2012的電腦操作完成。
5. 把上面得到的【script.sql】文件和兩個數據源文件復制到sql2008所在的電腦中。在sql2008中【新建】-【查詢管理器】。把【script.sql】拖進去,會看到代碼。
(注意綠色部分。此時顯示的數據庫文件位置是sql2012電腦的位置。需要把這兩個地址改為 sql2008 中 復制過來的那兩個源文件的地址即可。按【F5】鍵執行,即可完成數據庫從SQL2012到SQL2008的降級。 )
方案二:使用CMD命令
很多時候,我們的數據庫比較大,通過數據庫生成的.sql腳本(>100M)在SQL Server manager Studio(SSMS)中打開不了,提示“文件太大,無法打開” 。
這時候,我們就需要通過命令行(cmd命令提示符)來執行sql腳本的還原數據庫了。
特別說明:-d 后面跟的數據庫名稱,必須是目標數據庫中已經存在的數據庫!!!請先在SqlServer中創建一個空白數據庫。
在開始菜單上右擊,單擊 “命令提示符(管理員)”打開
注意,如果腳本太大,可以關閉stderr消息,以加快執行速度。
前提: 備份數據庫,生成sql腳本備用
1. 右擊數據庫 --> 任務 --> 生成腳本。
2. 在生成腳本的“選擇對象”步驟選擇“編寫整個數據庫及所有數據庫對象的腳本選項”。下一步。
3. 在生成腳本的“設置腳本編寫選項”界面, 點擊【高級】按鈕進入高級選項。
● 設置 “編寫USE DATABASE 腳本” 和 “架構限定對象名稱” 選項為False;
● 並將“服務器版腳本” 選擇為你的低版本數據庫的版本。生成腳本。
生成腳本完成。
使用sqlcmd命令還原數據庫,要求-d 數據庫名 必須要先手工創建這個數據庫! 所以在備份時生成sql腳本最好先去掉下方這兩項:
“編寫Use Database腳本” 和 “架構限定對象名稱” 設置為False
4. 在低版本的數據庫中新建數據庫,數據庫名稱隨意(與原高版本的數據庫名不同即可)。
CMD命令中的“dbname” 部分,可以在下方替換。
5. 完成,后面就是執行cmd命令了。
運行CMD命令: 還原數據
2.1 方法一: 標准的sqlcmd命令
SQLCMD -U sa -P 123 -S "172.0.0.1\SQLExpress" -d dbname -r -i d:\dbscript.sql
說明:SQLExpress是本地數據庫服務器(低版本的),dbname 是數據庫名稱,dbscript.sql 是備份的腳本文件
-U 后面是數據庫用戶名, -P 后面是數據庫用戶的密碼 -S后是服務器名(數據庫地址\實例)。
2.2 方法2:標准的osql命令
OSQL -U sa -P 123 -S (local)\SQLExpress -d dbname -r -i "d:\dbscript.sql"
2.3 方法3:通過Windows身份驗證Sqlserver的sqlcmd命令 (通過master來執行創建數據庫命令)
SQLCMD -E -d dbname -i d:\dbscript.sql
(通過master來執行創建數據庫命令,沒有輸入數據庫賬號密碼,需要Windows身份驗證且登錄的賬號是數據庫管理員)
Sqlcmd: The -E and the -U/-P options are mutually exclusive. (-E和 -U / -P 選項是互斥的。)
sqlcmd工具(或者osql)的命令參數如下:
特別說明:-d 后面跟的數據庫名稱,必須是目標數據庫中已經存在的數據庫!!!
sqlcmd [-U 登錄 ID] [-P 密碼]
[-S 服務器] [-H 主機名] [-E 可信連接]
[-d 使用數據庫名稱] [-l 登錄超時值] [-t 查詢超時值]
[-h 標題] [-s 列分隔符] [-w 列寬]
[-a 數據包大小] [-e 回顯輸入] [-I 允許帶引號的標識符]
[-L 列出服務器] [-c 命令結束] [-D ODBC DSN 名稱]
[-q "命令行查詢"] [-Q "命令行查詢" 並退出]
[-n 刪除編號方式] [-m 錯誤級別]
[-r 發送到 stderr 的消息] [-V 嚴重級別]
[-i 輸入文件] [-o 輸出文件]
[-p 打印統計信息] [-b 出錯時中止批處理]
[-X[1] 禁用命令,[退出的同時顯示警告]]
[-O 使用舊 ISQL 行為禁用下列項]
<EOF> 批處理
自動調整控制台寬度
寬消息
默認錯誤級別為 -1 和 1
[-? 顯示語法摘要]
擴展閱讀: 使用SQLCMD在SQLServer執行多個腳本https://blog.csdn.net/dba_huangzj/article/details/8350829
SQLCMD -E -dmaster -ic:\Scripts\create_db.sql
SQLCMD有一個很重要的命令::r,記住,SQLCMD是大小寫敏感的。當:r發現正在運行SQL腳本,它會告訴SQLCMD把這個文件所引用的文件一並放入調用腳本中。這將告訴你,停止目前的單個查詢。並重新調整查詢,把應該關聯的查詢放到適當的位置。另外,使用:r命令在一個批處理中執行多個腳本,使得你可以定義一個單獨的變量集,用於包含所有腳本,但是不包含GO終結符。
方案三: 暫無
············