SQL Server 2000升级到2005注意屎项
0 H4 Q! w8 f4 c: g, L6 x6 i% u
G/ Z# Z/ v& k: X4 P) y3 q; p; [! f$ K. w9 I" X. d4 ?, ^
7 i3 H- ^5 P' J+ \
9 S; K) z8 Z8 |6 ^; y
# A. S7 _5 M+ W; N( _
' N. s G8 n6 L3 Q! C
4 M/ s7 T, r+ g% ]
- y7 Q0 h9 V+ X/ R, m 如果你计划将数据库从SQL Server 2000 升级到 SQL Server 2005。你在升级之前一定会测试每样东西,并且证明应用程序是稳定的。即使这样,如果升级之后发生任何问题的话,你仍然会想要确保你仍然可以回退到原来的环境中去,并且保证不丢失任何的数据修改。& G# _- {' X/ w
这篇文章列出了保持原有数据(SQL Server 2000)中数据最新,直到新的环境被证明是最棒的方法。
# F0 c6 v6 z1 | 保持原有SQL Server环境最新的方法:
5 _; K# _" y! z8 b2 G0 X9 ?- T 在SQL Server中,有一些方法可以用来复制数据修改到另外一个数据库中去:
: l1 Q4 q/ |1 o1 y8 ? 1、日志传送$ x- z* c& V$ r9 u" V- u
2、拷贝数据库任务
/ X) v1 ^- T/ v0 Y! ?' u5 J 3、复制(事务,快照)4 v/ s9 `* A1 ^ ~5 q
4、SQL 追踪- x$ _" K. p* r! b
5、编程(触发器、DTS,BCP等)
: S, P z& q% P( D- v 6、第三方工具
1 A4 ]# [# U- C" j# S$ @" U 下面我们来讨论其中的三种方法:
+ T5 |5 |0 o) h+ { 日志传送
/ |& ?3 l0 q: L2 q& @3 F 我们可以在SQL Server 2005数据库(主数据库)和SQL Server 2000数据库(从数据库)之间传送日志吗?
0 w8 ?- `) r. O3 n& O7 F 我努力在因特网上寻找这个问题的积极答案,但是很不走运。然后我试图自己创造性地寻找一种解决方法,使用产品自带的标准工具。也没有门,天啊……我只能在第二个数据库中使用WITH NORECOVERY将日志从SQL Server 2000 传送到SQL Server 2005,没有其他办法。所以,答案是“没有”,使用日志传送是不现实的。
: ^$ U1 U$ B9 M2 W) Q; @; o5 ^ 拷贝数据库
& t7 j5 z% @" Q: {" a 不幸的是,当开启拷贝数据库向导的时候,当源和目标版本不同的时候,你就会收到错误信息,不能继续下去。
. c2 p3 b: P' V$ L7 a 复制+ ]: K2 {; X8 c; O2 l- I
事务复制
. E& h; q# X# _4 v 事务复制是在两个版本之间工作的。这个解决方案有两个问题:
% Z5 h* y3 p4 Y8 V) j3 [ 有一些SQL Server的版本不能作为PRIMARY 或者DISTRIBUTOR参加复制模型,《SQL Server 2005 Features Comparison》一书中对此有详细描述。
; [) r/ I1 _, i1 f3 d 没有定义Unique键的表不能参加这个模型。
/ ]0 m/ F4 f% g 快照复制
& _$ A/ F- B* F, M0 a W. Z" D 这个解决方案有效,但是也有几项例外。例如,如果表中有用户自定义数据类型,并且必须在表被创建之前创建,那么由于在SQL Server2000没有CREATE TYPE这个命令,就会失败。
2 g% K! [2 U L" m SQL 追踪/ Z+ m, i: q1 O6 B6 N' B. `
用SQL Server Profiler 或者SQL Trace可以捕捉到工作量,并且导出到 SQL 脚本中。脚本可以在从数据库中再次运行。
' o* g/ D* h9 X. Z4 _6 L- h* r- b 这个解决方案存在的问题包括:
6 E0 ~3 j8 @$ ?$ b) x 1、执行的命令是有一定顺序的。如果一个事务在一个单独的执行中被打开或者关闭了,而这个操作不是这一系列命令中的一个,那么脚本就无法使其发生关系,因为“会话”无法被Traces识别了。; ^0 x9 F2 _" x K1 p
2、如果在两个版本之间,命令语法有区别,那么在从数据库中的执行一定会失败。
) q" b5 W& j7 ^/ {1 S* D( t 编程; s1 _( ]+ u/ j( w7 ~
如果你有一小批数据库要移植,那么你可能会考虑编写一个数据库组件来传输数据的修改。( s& {& {2 r" L* J
示例:
( k! W; p) i! y- Z' i ・ 使用触发器――这可能会影响性能,因为触发器是事务的一部分。* Y* d2 R% e. P; l
・ 使用DTS或者BCP来传输数据――这种方法在很大程度上依赖数据量的大小。
: w) ?& Y* j9 w) k! h7 D6 i 第三方工具( V9 N2 d& [9 Y' f4 b' N
你可以使用第三方工具,例如Log Readers来从事务日志、脚本中读取SQL 命令,然后在从数据库中执行它们。还有,虽然我无法自己找到这样的一个工具,但是在SQL Server 2005中肯定会有一个工具能够备份事务日志,并且在SQL Server2000中顺利地重新存储它们。
5 c; h1 V E0 t 其它
9 t) R u3 V- q m 你还可以创新……
U3 B6 _1 j5 o 例如,在某些情况下,你可以将日志传送到从SQL Server 2005数据库中,把它的兼容级别改为80,然后备份并重新存储到第三个数据库中去。
2 S/ {/ i: z, H# V 结论
5 w( a5 b# l. a# i 对于关键的数据库,保留要升级的数据库的旧的版本,以及最新的数据修改,以便在需要回滚的时候用到,确实是个好主意。
8 c A) Y( }" ^. V( C* G3 l) H 但是……任何事物都没有“最好的解决方法”。你必须分析你的数据库特点和结构,然后决定针对你的需求的最佳解决方法。就我个人来说,我倾向于认为复制是最快最可靠的解决方法。 |