SQL Server 2000升级到2005注意屎项
# L4 A+ k, ?* @0 x$ l1 k+ l: r0 [' m. t. q$ P6 A, l
0 O" `$ Z3 [4 l7 {! |/ j' E
! ?1 ^2 A6 i* b+ C& {8 I$ j4 k
" O7 P3 p8 O/ w( p
* m; [, h# @4 s2 n3 @; L v/ ]3 E+ x5 a# d" ]2 c) x; c; h
; j8 L' U2 b. c
" j7 ]4 M9 t! j3 u5 @6 ?0 H. u+ x" ~! E 如果你计划将数据库从SQL Server 2000 升级到 SQL Server 2005。你在升级之前一定会测试每样东西,并且证明应用程序是稳定的。即使这样,如果升级之后发生任何问题的话,你仍然会想要确保你仍然可以回退到原来的环境中去,并且保证不丢失任何的数据修改。
. W& @7 E: p1 n/ k/ F 这篇文章列出了保持原有数据(SQL Server 2000)中数据最新,直到新的环境被证明是最棒的方法。
3 [9 H9 ^- h9 ^. { e 保持原有SQL Server环境最新的方法:% ~8 b: P8 I+ u- v" Z; f, P
在SQL Server中,有一些方法可以用来复制数据修改到另外一个数据库中去:% F6 y+ ?' ?, k
1、日志传送
# w' @6 t# Y# E4 \- s. u- } J 2、拷贝数据库任务; ~9 ?8 @; N/ t) W8 l
3、复制(事务,快照)
7 @( M' I+ P, ^, G; W5 X. O- | 4、SQL 追踪
: p+ ?/ {7 b- ]8 s, L% A; P 5、编程(触发器、DTS,BCP等)
! F! ^( t$ _5 y 6、第三方工具( _* m' m% v4 J
下面我们来讨论其中的三种方法:9 |% M5 s) P- |. d
日志传送5 m/ d8 n" k2 |5 j
我们可以在SQL Server 2005数据库(主数据库)和SQL Server 2000数据库(从数据库)之间传送日志吗?! y; u# W, T. w# x' {. \
我努力在因特网上寻找这个问题的积极答案,但是很不走运。然后我试图自己创造性地寻找一种解决方法,使用产品自带的标准工具。也没有门,天啊……我只能在第二个数据库中使用WITH NORECOVERY将日志从SQL Server 2000 传送到SQL Server 2005,没有其他办法。所以,答案是“没有”,使用日志传送是不现实的。
9 R/ v+ o7 g' s9 ~ 拷贝数据库
; V- `6 E% f3 B2 J4 N 不幸的是,当开启拷贝数据库向导的时候,当源和目标版本不同的时候,你就会收到错误信息,不能继续下去。0 |4 R7 p$ P' \" ]: E
复制
4 _4 [9 l# J. s 事务复制/ p/ Y ~, D2 c a+ o: P! O3 w- c2 l
事务复制是在两个版本之间工作的。这个解决方案有两个问题:
, A$ p$ U k: \5 R4 V1 ~* U 有一些SQL Server的版本不能作为PRIMARY 或者DISTRIBUTOR参加复制模型,《SQL Server 2005 Features Comparison》一书中对此有详细描述。- B, o: A [+ S' n! q+ ` k
没有定义Unique键的表不能参加这个模型。
0 F5 {( H0 C/ M 快照复制. y: k- ~) m! t* ^. f# i
这个解决方案有效,但是也有几项例外。例如,如果表中有用户自定义数据类型,并且必须在表被创建之前创建,那么由于在SQL Server2000没有CREATE TYPE这个命令,就会失败。& H% ^; O) R- @; j" d
SQL 追踪
9 \' }- P: G* G3 Q2 ]$ f: ` 用SQL Server Profiler 或者SQL Trace可以捕捉到工作量,并且导出到 SQL 脚本中。脚本可以在从数据库中再次运行。* `' ^6 k/ h6 s. `. a
这个解决方案存在的问题包括:
# q0 |* b4 m* {& M( |( ^ 1、执行的命令是有一定顺序的。如果一个事务在一个单独的执行中被打开或者关闭了,而这个操作不是这一系列命令中的一个,那么脚本就无法使其发生关系,因为“会话”无法被Traces识别了。+ C5 V2 t# t/ Y, O" y2 n1 j
2、如果在两个版本之间,命令语法有区别,那么在从数据库中的执行一定会失败。
3 S) o0 f, x8 D 编程6 M" a7 F4 C8 V# Q, Y+ H4 z0 k
如果你有一小批数据库要移植,那么你可能会考虑编写一个数据库组件来传输数据的修改。
+ u1 D8 ^$ ~5 F+ M 示例:
, l3 z" P7 y9 s1 _) V7 X ・ 使用触发器――这可能会影响性能,因为触发器是事务的一部分。
2 d: }8 q6 E8 A$ f" ^/ U ・ 使用DTS或者BCP来传输数据――这种方法在很大程度上依赖数据量的大小。6 `, S( x- j- ?: ^* F" @" c7 p( M
第三方工具8 x, t# ]* e5 }& f. `9 Q$ z
你可以使用第三方工具,例如Log Readers来从事务日志、脚本中读取SQL 命令,然后在从数据库中执行它们。还有,虽然我无法自己找到这样的一个工具,但是在SQL Server 2005中肯定会有一个工具能够备份事务日志,并且在SQL Server2000中顺利地重新存储它们。: q2 [. K2 F7 O9 y! r3 }8 i$ _5 y
其它
5 N3 b& A: c, i/ f- w' X3 K" i7 N 你还可以创新……
V* Y/ z+ z: P; Y9 E7 a 例如,在某些情况下,你可以将日志传送到从SQL Server 2005数据库中,把它的兼容级别改为80,然后备份并重新存储到第三个数据库中去。6 y6 V. { B7 }- y2 ~
结论
( h$ o2 I% X; B 对于关键的数据库,保留要升级的数据库的旧的版本,以及最新的数据修改,以便在需要回滚的时候用到,确实是个好主意。
: M/ _) P* k! D$ }- s' w 但是……任何事物都没有“最好的解决方法”。你必须分析你的数据库特点和结构,然后决定针对你的需求的最佳解决方法。就我个人来说,我倾向于认为复制是最快最可靠的解决方法。 |