SQL Server 2000升级到2005注意屎项
$ Y% T9 T: e; ~1 Y3 I/ ?0 o: N
0 U, ?7 R4 T1 q3 j' u) f, v" q2 i( u3 P# `
: K" H9 p o! O/ u# S
* o. T0 u2 O! C( D% Q7 O* ~
( b6 b# |7 v1 ^6 }$ p
* m2 T$ k/ K" d h
: l! N/ \; |# o! X7 i* s( j; X- Y" n% X% p! f
如果你计划将数据库从SQL Server 2000 升级到 SQL Server 2005。你在升级之前一定会测试每样东西,并且证明应用程序是稳定的。即使这样,如果升级之后发生任何问题的话,你仍然会想要确保你仍然可以回退到原来的环境中去,并且保证不丢失任何的数据修改。
( v# j& L0 t/ P! v/ _( z* ~/ g2 o9 B 这篇文章列出了保持原有数据(SQL Server 2000)中数据最新,直到新的环境被证明是最棒的方法。, D6 P1 U, a. u' f7 O+ h0 P
保持原有SQL Server环境最新的方法:3 s; n7 h1 h: v4 h+ j! _& t& _
在SQL Server中,有一些方法可以用来复制数据修改到另外一个数据库中去:
8 ?4 T" O0 W/ q/ j( X 1、日志传送
5 h: g* T/ E3 u2 P) A! {4 A# X' l 2、拷贝数据库任务/ v# v+ G% A) i" `7 w6 I# a( O
3、复制(事务,快照)6 h: r3 P3 I& F$ _8 W, _ @8 K- c
4、SQL 追踪3 h/ h6 E3 k9 S% b0 q3 C
5、编程(触发器、DTS,BCP等)
0 w+ |% @, @3 l: o' i6 z1 i4 D- ~ 6、第三方工具& }6 X" L7 X1 i4 j3 R* p9 D
下面我们来讨论其中的三种方法:0 F9 e! V c% |, d
日志传送
2 p5 q" ?/ p% I: h x 我们可以在SQL Server 2005数据库(主数据库)和SQL Server 2000数据库(从数据库)之间传送日志吗?
5 F. a6 o$ l, {7 u6 A& k* O) F- |7 d7 [ 我努力在因特网上寻找这个问题的积极答案,但是很不走运。然后我试图自己创造性地寻找一种解决方法,使用产品自带的标准工具。也没有门,天啊……我只能在第二个数据库中使用WITH NORECOVERY将日志从SQL Server 2000 传送到SQL Server 2005,没有其他办法。所以,答案是“没有”,使用日志传送是不现实的。
4 b/ ^" U: [- E* E% r- T 拷贝数据库
, Z; l. k/ M+ \3 @ 不幸的是,当开启拷贝数据库向导的时候,当源和目标版本不同的时候,你就会收到错误信息,不能继续下去。5 P5 r. K. o- ~& W
复制. I5 S2 F; \; i# c1 u# G# `
事务复制# Y" E5 F$ m6 ]
事务复制是在两个版本之间工作的。这个解决方案有两个问题:# Z" m) M' P2 m7 I z; `: I$ j; X! m- \
有一些SQL Server的版本不能作为PRIMARY 或者DISTRIBUTOR参加复制模型,《SQL Server 2005 Features Comparison》一书中对此有详细描述。
' k; m( Y9 T/ K0 y C/ K/ S! Z 没有定义Unique键的表不能参加这个模型。
5 }5 Y( g A3 }# N 快照复制
: k) O- ^3 m8 \/ s 这个解决方案有效,但是也有几项例外。例如,如果表中有用户自定义数据类型,并且必须在表被创建之前创建,那么由于在SQL Server2000没有CREATE TYPE这个命令,就会失败。
, X5 n* J, D' |3 b5 r$ i2 k SQL 追踪; b+ h( v k) t$ R( A, F. ?7 E) E
用SQL Server Profiler 或者SQL Trace可以捕捉到工作量,并且导出到 SQL 脚本中。脚本可以在从数据库中再次运行。$ |' u" _3 S+ ]) K
这个解决方案存在的问题包括:
1 F8 I6 F2 J; ^& i) [1 j! N5 U 1、执行的命令是有一定顺序的。如果一个事务在一个单独的执行中被打开或者关闭了,而这个操作不是这一系列命令中的一个,那么脚本就无法使其发生关系,因为“会话”无法被Traces识别了。+ ]5 G+ f0 ~: P, \9 v
2、如果在两个版本之间,命令语法有区别,那么在从数据库中的执行一定会失败。9 \2 q6 C4 R# Y
编程2 @* x m9 ^% F: t6 y
如果你有一小批数据库要移植,那么你可能会考虑编写一个数据库组件来传输数据的修改。4 w, j4 O w# @6 x
示例:; D. I3 b: o8 g
・ 使用触发器――这可能会影响性能,因为触发器是事务的一部分。
- S( b. R9 e0 w+ _# W$ g7 \$ E ・ 使用DTS或者BCP来传输数据――这种方法在很大程度上依赖数据量的大小。% ]8 b- V' Z! X- i9 w& v& k
第三方工具
6 K) l2 z8 Z" w& l0 { 你可以使用第三方工具,例如Log Readers来从事务日志、脚本中读取SQL 命令,然后在从数据库中执行它们。还有,虽然我无法自己找到这样的一个工具,但是在SQL Server 2005中肯定会有一个工具能够备份事务日志,并且在SQL Server2000中顺利地重新存储它们。
3 ^* K% A# m, a7 p0 W 其它) }, x; |# O' v' t8 @) M
你还可以创新…… O2 K# Q+ z$ j7 B5 v+ C
例如,在某些情况下,你可以将日志传送到从SQL Server 2005数据库中,把它的兼容级别改为80,然后备份并重新存储到第三个数据库中去。
9 i- \7 T0 i/ k% ^' }2 q3 O5 { 结论
& {: ~) w; v' }& I+ w 对于关键的数据库,保留要升级的数据库的旧的版本,以及最新的数据修改,以便在需要回滚的时候用到,确实是个好主意。
" Z9 T6 X1 ~* _# h5 h$ G 但是……任何事物都没有“最好的解决方法”。你必须分析你的数据库特点和结构,然后决定针对你的需求的最佳解决方法。就我个人来说,我倾向于认为复制是最快最可靠的解决方法。 |