SQL Server 2000升级到2005注意屎项4 }- X1 S7 O. ^# c6 K7 y6 w$ u
: g9 B8 O: Z/ f5 J, Q* E6 z$ g0 }# K
" i ?7 X3 U' Z& H
1 }) W1 E/ W' W0 J) G3 Y) N, l/ e
$ b6 m! W1 i. ^0 T. }* p, V
8 X$ \, @# J9 ?& l) \, J8 M( i8 H2 J7 a9 {
8 w: i6 \8 _8 E
0 v9 H- l8 S: V/ a+ t0 O
如果你计划将数据库从SQL Server 2000 升级到 SQL Server 2005。你在升级之前一定会测试每样东西,并且证明应用程序是稳定的。即使这样,如果升级之后发生任何问题的话,你仍然会想要确保你仍然可以回退到原来的环境中去,并且保证不丢失任何的数据修改。
" G: W& _) u% o& z2 w 这篇文章列出了保持原有数据(SQL Server 2000)中数据最新,直到新的环境被证明是最棒的方法。
2 X1 s$ }9 t% k; F, m7 t+ ~ 保持原有SQL Server环境最新的方法:3 y4 Z# ?5 w; c a7 ?8 L
在SQL Server中,有一些方法可以用来复制数据修改到另外一个数据库中去:4 u: ~+ Q% w5 x
1、日志传送" X5 u6 a# N9 d" B% }' Y# T
2、拷贝数据库任务- T4 p/ ~" ]# G5 d& [; r
3、复制(事务,快照), F3 ?$ g8 `1 r+ E8 D8 K0 G' H5 W: j4 N! m
4、SQL 追踪
) L- n9 X0 L- g1 j( @ 5、编程(触发器、DTS,BCP等)
5 s" z& A: j& ^) } S 6、第三方工具
1 g) d) D! N6 G' c E3 W 下面我们来讨论其中的三种方法:/ A* q ?8 n: `: S! B; }- v6 S7 I
日志传送
4 Q B# a0 u# K P" Q/ u; V( x 我们可以在SQL Server 2005数据库(主数据库)和SQL Server 2000数据库(从数据库)之间传送日志吗?, Y; J" |! {/ E5 l! ?
我努力在因特网上寻找这个问题的积极答案,但是很不走运。然后我试图自己创造性地寻找一种解决方法,使用产品自带的标准工具。也没有门,天啊……我只能在第二个数据库中使用WITH NORECOVERY将日志从SQL Server 2000 传送到SQL Server 2005,没有其他办法。所以,答案是“没有”,使用日志传送是不现实的。
# k6 q. w8 i! V8 K2 C% O 拷贝数据库
* ~( [7 {- \6 @ 不幸的是,当开启拷贝数据库向导的时候,当源和目标版本不同的时候,你就会收到错误信息,不能继续下去。" b Z0 T% `* z- m9 a) k% I
复制
1 q2 G4 [7 E5 _$ c" U- Q/ y 事务复制& {0 \! S) d' O4 @: [1 @6 x, U
事务复制是在两个版本之间工作的。这个解决方案有两个问题:: n$ U/ g, Q" T) O* x5 H* u% C3 Q8 s
有一些SQL Server的版本不能作为PRIMARY 或者DISTRIBUTOR参加复制模型,《SQL Server 2005 Features Comparison》一书中对此有详细描述。+ R9 } P+ c0 q2 [
没有定义Unique键的表不能参加这个模型。
( ^& ~5 V3 ?% g; r" |$ K 快照复制2 x" k2 G7 N" |( A) k( p+ \
这个解决方案有效,但是也有几项例外。例如,如果表中有用户自定义数据类型,并且必须在表被创建之前创建,那么由于在SQL Server2000没有CREATE TYPE这个命令,就会失败。
% D3 W& \" W! _ SQL 追踪
- l* p, p0 B [$ S3 n- `- U 用SQL Server Profiler 或者SQL Trace可以捕捉到工作量,并且导出到 SQL 脚本中。脚本可以在从数据库中再次运行。
$ P' L4 m- Z! I/ X8 c: Y7 L% N8 K 这个解决方案存在的问题包括:; q2 g: ~. u" j' _
1、执行的命令是有一定顺序的。如果一个事务在一个单独的执行中被打开或者关闭了,而这个操作不是这一系列命令中的一个,那么脚本就无法使其发生关系,因为“会话”无法被Traces识别了。1 Y# [- D: J0 x k" T: g
2、如果在两个版本之间,命令语法有区别,那么在从数据库中的执行一定会失败。$ N% O) ^1 r8 |
编程* f2 q( R6 j C( _
如果你有一小批数据库要移植,那么你可能会考虑编写一个数据库组件来传输数据的修改。3 Z9 f+ W# I. ~6 b9 Y
示例:2 T( Y0 Z3 D1 E, `$ J1 |6 N
・ 使用触发器――这可能会影响性能,因为触发器是事务的一部分。
; ^+ B, W4 ?5 s% a1 G/ L ・ 使用DTS或者BCP来传输数据――这种方法在很大程度上依赖数据量的大小。
$ I4 B& b8 ]( \7 {" l6 W1 a$ Y 第三方工具
5 o( |# U5 `, [3 a) y; ] 你可以使用第三方工具,例如Log Readers来从事务日志、脚本中读取SQL 命令,然后在从数据库中执行它们。还有,虽然我无法自己找到这样的一个工具,但是在SQL Server 2005中肯定会有一个工具能够备份事务日志,并且在SQL Server2000中顺利地重新存储它们。& M) V: c4 O; A
其它 x' [4 s2 a, K! G% n
你还可以创新……# ]1 N5 S6 u8 ~' w; _( N
例如,在某些情况下,你可以将日志传送到从SQL Server 2005数据库中,把它的兼容级别改为80,然后备份并重新存储到第三个数据库中去。0 |+ [9 _) t/ s
结论
. ^, m5 e8 f3 H& U3 u1 m* R 对于关键的数据库,保留要升级的数据库的旧的版本,以及最新的数据修改,以便在需要回滚的时候用到,确实是个好主意。
7 q9 L) m% l# T 但是……任何事物都没有“最好的解决方法”。你必须分析你的数据库特点和结构,然后决定针对你的需求的最佳解决方法。就我个人来说,我倾向于认为复制是最快最可靠的解决方法。 |