SQL Server 2000升级到2005注意屎项
2 L' p% i1 }; H6 a) w6 F
, _8 h5 c- {% q+ I# J7 v, i1 z1 O% _
: ]1 a7 T1 B6 N6 z4 A; Q" P+ }
! v* D/ m6 e7 h% f
, r; |5 L$ n' k
- o0 @6 Z6 Q& u5 q9 D
* x/ J% \9 w2 V. u. r1 G: v5 p
7 N, X1 g+ M! Q4 O 如果你计划将数据库从SQL Server 2000 升级到 SQL Server 2005。你在升级之前一定会测试每样东西,并且证明应用程序是稳定的。即使这样,如果升级之后发生任何问题的话,你仍然会想要确保你仍然可以回退到原来的环境中去,并且保证不丢失任何的数据修改。4 G1 {; r6 i! U
这篇文章列出了保持原有数据(SQL Server 2000)中数据最新,直到新的环境被证明是最棒的方法。0 m, [7 C3 }) O" a% t( R4 ]/ [( X: N
保持原有SQL Server环境最新的方法:
, p+ {" `0 H/ S. `( C( F 在SQL Server中,有一些方法可以用来复制数据修改到另外一个数据库中去:- _" {" w* M; y
1、日志传送
$ p% [* r9 d( e. J( A 2、拷贝数据库任务( s% q) q0 R9 E F p
3、复制(事务,快照)5 Y) {* O( y: @9 V! ]# P. h
4、SQL 追踪
/ d$ ?) z3 z' K% F 5、编程(触发器、DTS,BCP等)
! u$ U/ J. d1 _7 |7 \5 R* b 6、第三方工具
7 I$ {5 a; i5 M 下面我们来讨论其中的三种方法:2 g& ~! _% C' G' \; J& t& B% _& e
日志传送
* v- m9 l: {) L$ s4 n) v) [ 我们可以在SQL Server 2005数据库(主数据库)和SQL Server 2000数据库(从数据库)之间传送日志吗?
) _0 y' o4 g' c" f2 p) f. r 我努力在因特网上寻找这个问题的积极答案,但是很不走运。然后我试图自己创造性地寻找一种解决方法,使用产品自带的标准工具。也没有门,天啊……我只能在第二个数据库中使用WITH NORECOVERY将日志从SQL Server 2000 传送到SQL Server 2005,没有其他办法。所以,答案是“没有”,使用日志传送是不现实的。0 A1 E( J9 {& M+ h. c( w" @$ }4 s
拷贝数据库( q" U1 I. E/ Z h8 D
不幸的是,当开启拷贝数据库向导的时候,当源和目标版本不同的时候,你就会收到错误信息,不能继续下去。
- Y; b9 l' _7 q @ 复制% \; I7 q% K v3 n5 w0 M1 H a
事务复制
. |( S {, K. \8 L/ ]! C9 H5 W 事务复制是在两个版本之间工作的。这个解决方案有两个问题:
% N4 y& J0 Q! M2 t4 L8 Q7 c+ o 有一些SQL Server的版本不能作为PRIMARY 或者DISTRIBUTOR参加复制模型,《SQL Server 2005 Features Comparison》一书中对此有详细描述。7 w2 W0 w1 \6 X7 u$ g
没有定义Unique键的表不能参加这个模型。 g/ W# Y$ L0 O( V6 g2 ]
快照复制
4 C/ w0 A1 u. P7 j3 ]- M; W- Y 这个解决方案有效,但是也有几项例外。例如,如果表中有用户自定义数据类型,并且必须在表被创建之前创建,那么由于在SQL Server2000没有CREATE TYPE这个命令,就会失败。
" P _ ]; Q- I$ Q) W4 |9 I: A SQL 追踪
, [1 [ i/ Y; l 用SQL Server Profiler 或者SQL Trace可以捕捉到工作量,并且导出到 SQL 脚本中。脚本可以在从数据库中再次运行。
/ H* t$ r& k& {6 ?4 S 这个解决方案存在的问题包括:3 `6 b0 q: c+ j( G" E) O
1、执行的命令是有一定顺序的。如果一个事务在一个单独的执行中被打开或者关闭了,而这个操作不是这一系列命令中的一个,那么脚本就无法使其发生关系,因为“会话”无法被Traces识别了。* _9 A! B& |% h/ b6 H' L C
2、如果在两个版本之间,命令语法有区别,那么在从数据库中的执行一定会失败。. O/ F9 w7 R) S
编程
, N* W1 R" @7 U1 u% V 如果你有一小批数据库要移植,那么你可能会考虑编写一个数据库组件来传输数据的修改。. Q) n; Z y" B
示例:
9 u* t7 j8 i. g2 S9 W& ? L ・ 使用触发器――这可能会影响性能,因为触发器是事务的一部分。
/ t# T( t5 A: c3 h/ m( {7 I) F ・ 使用DTS或者BCP来传输数据――这种方法在很大程度上依赖数据量的大小。& j) ~. j5 |8 L* k4 x
第三方工具
8 n2 @/ y8 y7 J" | 你可以使用第三方工具,例如Log Readers来从事务日志、脚本中读取SQL 命令,然后在从数据库中执行它们。还有,虽然我无法自己找到这样的一个工具,但是在SQL Server 2005中肯定会有一个工具能够备份事务日志,并且在SQL Server2000中顺利地重新存储它们。* A* D# W* y/ ?1 m
其它
+ o5 \, S7 ]/ j8 E( R% { 你还可以创新……2 L( r! q/ d( G- T2 n4 T* c
例如,在某些情况下,你可以将日志传送到从SQL Server 2005数据库中,把它的兼容级别改为80,然后备份并重新存储到第三个数据库中去。6 u4 A. ^: C- w; @+ O' [% J/ U" q
结论
. _) i7 G6 N* X" m; Q 对于关键的数据库,保留要升级的数据库的旧的版本,以及最新的数据修改,以便在需要回滚的时候用到,确实是个好主意。
1 F2 r d/ e- G, H7 f* f 但是……任何事物都没有“最好的解决方法”。你必须分析你的数据库特点和结构,然后决定针对你的需求的最佳解决方法。就我个人来说,我倾向于认为复制是最快最可靠的解决方法。 |