SQL Server 2000升级到2005注意屎项
. x" \* ?9 a. r, v- [/ D7 I; f) {2 s* q" L; l# A
- K3 n4 K* V$ x, I
8 w) i* v0 G1 |. ^ L( p+ N5 r* t g9 d
, U. J# }2 {* O0 Y5 l% E) a
7 G8 W0 ?" x; A9 n7 T1 e
: c" L7 ?2 h9 \% j& Y
( h% P: {2 b+ F9 B 如果你计划将数据库从SQL Server 2000 升级到 SQL Server 2005。你在升级之前一定会测试每样东西,并且证明应用程序是稳定的。即使这样,如果升级之后发生任何问题的话,你仍然会想要确保你仍然可以回退到原来的环境中去,并且保证不丢失任何的数据修改。$ Y3 }, t7 E$ F' B: Q* Q
这篇文章列出了保持原有数据(SQL Server 2000)中数据最新,直到新的环境被证明是最棒的方法。
' z5 ?' g9 |1 W4 b& Y; J 保持原有SQL Server环境最新的方法:5 j, H' ~" F* R0 V+ k
在SQL Server中,有一些方法可以用来复制数据修改到另外一个数据库中去:+ j3 u( v- K$ A R
1、日志传送- k- l1 c i/ k( D2 g7 r# F
2、拷贝数据库任务2 J& r9 T* ?8 t
3、复制(事务,快照)
8 l0 S# Z$ b- J, E; b1 d2 K! }& m 4、SQL 追踪5 m3 J) }. r9 T( c+ [4 W
5、编程(触发器、DTS,BCP等)
' h/ U6 Y4 }3 l 6、第三方工具* y6 m: p( v# A# Z6 a: _
下面我们来讨论其中的三种方法:
& Y: n0 K @" e 日志传送
: W7 N% n8 W4 _5 t# w1 j) ? 我们可以在SQL Server 2005数据库(主数据库)和SQL Server 2000数据库(从数据库)之间传送日志吗?
+ G e6 F# U$ U4 p+ V- n 我努力在因特网上寻找这个问题的积极答案,但是很不走运。然后我试图自己创造性地寻找一种解决方法,使用产品自带的标准工具。也没有门,天啊……我只能在第二个数据库中使用WITH NORECOVERY将日志从SQL Server 2000 传送到SQL Server 2005,没有其他办法。所以,答案是“没有”,使用日志传送是不现实的。( A9 k& K% r; c4 @ c; B, F( Y
拷贝数据库: A7 n) I) a- w5 `3 m; w, j
不幸的是,当开启拷贝数据库向导的时候,当源和目标版本不同的时候,你就会收到错误信息,不能继续下去。' C' h2 _( I9 A5 B
复制
5 V/ U! z; E1 B9 z5 ~. V1 h 事务复制
$ [% n0 ` f5 q" W( D" t 事务复制是在两个版本之间工作的。这个解决方案有两个问题:
( V A% @0 \& j j X- B7 [ 有一些SQL Server的版本不能作为PRIMARY 或者DISTRIBUTOR参加复制模型,《SQL Server 2005 Features Comparison》一书中对此有详细描述。- }6 _ [. x3 S! ^4 B
没有定义Unique键的表不能参加这个模型。
& |: P1 K' x' {+ h" w 快照复制
7 |6 ^7 W: t" ~: O- a 这个解决方案有效,但是也有几项例外。例如,如果表中有用户自定义数据类型,并且必须在表被创建之前创建,那么由于在SQL Server2000没有CREATE TYPE这个命令,就会失败。6 I# C5 @- P9 V* A- l
SQL 追踪
) z7 ^* l+ L- K$ q5 k 用SQL Server Profiler 或者SQL Trace可以捕捉到工作量,并且导出到 SQL 脚本中。脚本可以在从数据库中再次运行。) M; o- k" k5 a
这个解决方案存在的问题包括:/ x7 r8 L/ ?1 r" I5 \) {' Y s
1、执行的命令是有一定顺序的。如果一个事务在一个单独的执行中被打开或者关闭了,而这个操作不是这一系列命令中的一个,那么脚本就无法使其发生关系,因为“会话”无法被Traces识别了。/ E2 o* m# m& T9 `: x% j
2、如果在两个版本之间,命令语法有区别,那么在从数据库中的执行一定会失败。9 {9 Y, X. R7 o/ b$ \
编程
# I2 k- N' D) p 如果你有一小批数据库要移植,那么你可能会考虑编写一个数据库组件来传输数据的修改。: D$ h" @* k% ^& H* l5 Q5 z
示例:
4 _3 j3 ]* ]" `! W0 U ・ 使用触发器――这可能会影响性能,因为触发器是事务的一部分。# M j* B0 T) G+ u- r. c5 t% e
・ 使用DTS或者BCP来传输数据――这种方法在很大程度上依赖数据量的大小。
2 g y( {' Z+ ?4 P& R 第三方工具
" t s# |/ L9 | O5 U4 w8 x 你可以使用第三方工具,例如Log Readers来从事务日志、脚本中读取SQL 命令,然后在从数据库中执行它们。还有,虽然我无法自己找到这样的一个工具,但是在SQL Server 2005中肯定会有一个工具能够备份事务日志,并且在SQL Server2000中顺利地重新存储它们。) w v% L& p, l' s9 D- y6 q; \
其它
- i! S+ `- c! w- S 你还可以创新……6 H* F: L4 e- o+ V* b9 B
例如,在某些情况下,你可以将日志传送到从SQL Server 2005数据库中,把它的兼容级别改为80,然后备份并重新存储到第三个数据库中去。9 d I* @2 y8 u8 H! i
结论 q6 H3 U1 O6 B
对于关键的数据库,保留要升级的数据库的旧的版本,以及最新的数据修改,以便在需要回滚的时候用到,确实是个好主意。
- [, I: Y7 N7 S$ x+ ~+ K" D 但是……任何事物都没有“最好的解决方法”。你必须分析你的数据库特点和结构,然后决定针对你的需求的最佳解决方法。就我个人来说,我倾向于认为复制是最快最可靠的解决方法。 |