本文三步搞定數據庫從MSSQL2008R2 高版本降遷至SQL2005低版本。 整個過程如果思路清晰,數據量小,不過就是10分鐘的事,效率提高很多。
這里需要利用一個免費的數據庫對象同步工具,實際上整個操作過程中,這一步是最耗時低效,檢查發現用OpenDBDiff和SQL-DBDiff可以高效解決這個問題。
首先,MSSQL2008R2有源數據庫dnt2_db ,需要轉到MSSQL2005目標數據庫dnt2_dbNew中。
第一步 在低版本數據庫中新建目標庫。
案例中SQL2005新建數據庫T-SQL:
- ----/****** Object: Database [dnt2_dbNew] ******/
- CREATE DATABASE [dnt2_dbNew] ON PRIMARY
- ( NAME = N''dnt2_db'', FILENAME = N''D:/Program Files/bbs/bbs3.6/dnt2_db .mdf'' , SIZE = 15552KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
- LOG ON
- ( NAME = N''dnt2_db _log'', FILENAME = N''D:/Program Files/bbs/bbs3.6/dnt2_db _log.ldf'' , SIZE = 530112KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
- Go
- EXEC dbo.sp_dbcmptlevel @dbname=N''dnt2_dbNew'', @new_cmptlevel=90
- GO
- IF (1 = FULLTEXTSERVICEPROPERTY(''IsFullTextInstalled''))
- begin
- EXEC [dnt2_dbNew].[dbo].[sp_fulltext_database] @action = ''enable''
- end
- GO
- ALTER DATABASE [dnt2_dbNew] SET ANSI_NULL_DEFAULT OFF
- GO
- ALTER DATABASE [dnt2_dbNew] SET ANSI_NULLS OFF
- GO
- ALTER DATABASE [dnt2_dbNew] SET ANSI_PADDING OFF
- GO
- ALTER DATABASE [dnt2_dbNew] SET ANSI_WARNINGS OFF
- GO
- ALTER DATABASE [dnt2_dbNew] SET ARITHABORT OFF
- GO
- ALTER DATABASE [dnt2_dbNew] SET AUTO_CLOSE OFF
- GO
- ALTER DATABASE [dnt2_dbNew] SET AUTO_CREATE_STATISTICS ON
- GO
- ALTER DATABASE [dnt2_dbNew] SET AUTO_SHRINK OFF
- GO
- ALTER DATABASE [dnt2_dbNew] SET AUTO_UPDATE_STATISTICS ON
- GO
- ALTER DATABASE [dnt2_dbNew] SET CURSOR_CLOSE_ON_COMMIT OFF
- GO
- ALTER DATABASE [dnt2_dbNew] SET CURSOR_DEFAULT GLOBAL
- GO
- ALTER DATABASE [dnt2_dbNew] SET CONCAT_NULL_YIELDS_NULL OFF
- GO
- ALTER DATABASE [dnt2_dbNew] SET NUMERIC_ROUNDABORT OFF
- GO
- ALTER DATABASE [dnt2_dbNew] SET QUOTED_IDENTIFIER OFF
- GO
- ALTER DATABASE [dnt2_dbNew] SET RECURSIVE_TRIGGERS OFF
- GO
- ALTER DATABASE [dnt2_dbNew] SET DISABLE_BROKER
- GO
- ALTER DATABASE [dnt2_dbNew] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
- GO
- ALTER DATABASE [dnt2_dbNew] SET DATE_CORRELATION_OPTIMIZATION OFF
- GO
- ALTER DATABASE [dnt2_dbNew] SET TRUSTWORTHY OFF
- GO
- ALTER DATABASE [dnt2_dbNew] SET ALLOW_SNAPSHOT_ISOLATION OFF
- GO
- ALTER DATABASE [dnt2_dbNew] SET PARAMETERIZATION SIMPLE
- GO
- ALTER DATABASE [dnt2_dbNew] SET READ_COMMITTED_SNAPSHOT OFF
- GO
- ALTER DATABASE [dnt2_dbNew] SET READ_WRITE
- GO
- ALTER DATABASE [dnt2_dbNew] SET RECOVERY FULL
- GO
- ALTER DATABASE [dnt2_dbNew] SET MULTI_USER
- GO
- ALTER DATABASE [dnt2_dbNew] SET PAGE_VERIFY CHECKSUM
- GO
- ALTER DATABASE [dnt2_dbNew] SET DB_CHAINING OFF
- GO
第二步 將高版本的表數據全部導入低版本數據庫中。
案例中SQL2008R2的表數據,這里重新說明操作步驟,如下圖所示:
圖1
連接SQL2005目標數據庫,并操作導入數據選項
圖2
選擇數據源
圖3
選擇目標服務器
圖4
復制選項設定
圖5
選擇源表。這里全選,而不做對目標表的設定。原因在上一篇文章的{注1}部分已說明。
圖6
數據導入完畢
第三步 將高版本的數據庫對象同步到低版本數據庫中。
打開OpenDBDiff或SQL-DBDiff,這里使用OpendbDiff,如下圖
圖7 打開OpenDBDiff,并選擇源和目標庫
圖8 比較不同數據庫的對象,并生成Alter的T-SQL語句。相比上一篇文章里需要手動修改Create為Alter語句,效率明顯提高。
{注:有時當數據庫中已存在部分對象時,我們需要注意Open DBDiff在給出Alter針對約束或者Create針對存儲過程語句時,會有點問題,可能會需要手動的微調}
此時,我們點擊右側的剪貼板來copy語句,不建議用另存為的方式,否則可能會出現圖9中的因字符集問題,當然目前我還不確定是OpenDBDiff本身造成的還是我OS的問題。
將貼出的T-SQL語句在SQL2005的目標庫dnt2_dbNew中執行。
圖9 中文另存為時發生字符集亂碼的問題
到此,三大步搞定數據庫降遷!呵呵,說我騙人,這怎么可能就三步呢。-_-!
執行完畢后,再用OpenDBDiff檢查兩庫的對象差異,最后如圖10所示,都OK。
圖10 最后檢查OK
——>總結:優秀的DBA一定要有第三方工具,這句話不是我說的。不過OpenDBDiff只能同步對象是個缺憾!