找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2698|回复: 0

SQL Server 2000升级到2005注意屎项

[复制链接]
发表于 2013-1-2 23:35:05 | 显示全部楼层 |阅读模式
SQL Server 2000升级到2005注意屎项
6 Q" ^9 f0 k# I1 T, D& W3 P( f+ K; T

4 T; ^. O6 Z+ {2 w% J9 m# x; e8 ~$ b, }, z4 l

. v% F' Y  ?9 J# _2 o

# F$ p0 I4 Y0 l& T3 R: j5 D; Z! w' t! o8 h8 D3 M9 S

; h" t0 x! T/ Y* k& W$ Q1 F4 `" @/ S& g, `' s( c: h2 Z
  如果你计划将数据库从SQL Server 2000 升级到 SQL Server 2005。你在升级之前一定会测试每样东西,并且证明应用程序是稳定的。即使这样,如果升级之后发生任何问题的话,你仍然会想要确保你仍然可以回退到原来的环境中去,并且保证不丢失任何的数据修改。+ y; h8 u! w/ |2 S. h, K
  这篇文章列出了保持原有数据(SQL Server 2000)中数据最新,直到新的环境被证明是最棒的方法。
0 B; `, v' O$ d; D7 k: D  保持原有SQL Server环境最新的方法:
1 j2 `) W% p9 g4 U2 A- l% c4 s  在SQL Server中,有一些方法可以用来复制数据修改到另外一个数据库中去:$ r" i$ N& I% `: q3 U
  1、日志传送1 Z- e) I0 H& Q/ P
  2、拷贝数据库任务
0 K4 r  ?4 @# [% ]  3、复制(事务,快照)( U" k/ A/ Q& n+ Z5 Y  l( t) @
  4、SQL 追踪7 @% K1 D' v# x( E* b4 ~
  5、编程(触发器、DTS,BCP等)
2 Z" {+ `7 H7 @7 |& h  6、第三方工具
0 \7 i5 D# ~# ?2 F9 w0 d4 _1 z! i  下面我们来讨论其中的三种方法:
& k* Y9 y5 i9 E  |% d5 e) J  日志传送
  x8 x+ b1 E* z6 D9 K7 i3 [& S, _+ v) o  我们可以在SQL Server 2005数据库(主数据库)和SQL Server 2000数据库(从数据库)之间传送日志吗?, I( x0 f  c: g) \3 _
  我努力在因特网上寻找这个问题的积极答案,但是很不走运。然后我试图自己创造性地寻找一种解决方法,使用产品自带的标准工具。也没有门,天啊……我只能在第二个数据库中使用WITH NORECOVERY将日志从SQL Server 2000 传送到SQL Server 2005,没有其他办法。所以,答案是“没有”,使用日志传送是不现实的。
- T+ n* C$ Y/ o+ J2 T  拷贝数据库6 M; P1 W% f4 f7 P* r
  不幸的是,当开启拷贝数据库向导的时候,当源和目标版本不同的时候,你就会收到错误信息,不能继续下去。" _; f" [8 B$ h0 N4 h! x
  复制
' t( c7 D* Q; V5 R! b  事务复制9 J8 ?. t3 x+ N' x4 l0 e; [
  事务复制是在两个版本之间工作的。这个解决方案有两个问题:
  t" K9 u9 C3 s9 L+ N+ H( L  有一些SQL Server的版本不能作为PRIMARY 或者DISTRIBUTOR参加复制模型,《SQL Server 2005 Features Comparison》一书中对此有详细描述。
" A- q9 W$ K1 i5 j" G; }  没有定义Unique键的表不能参加这个模型。( ?0 T( D5 u; H; o. g4 @: Q2 H; J
  快照复制
. {( Z" l! F; [7 e. L7 A" _  这个解决方案有效,但是也有几项例外。例如,如果表中有用户自定义数据类型,并且必须在表被创建之前创建,那么由于在SQL Server2000没有CREATE TYPE这个命令,就会失败。' q. B. p- G8 C$ c* C
  SQL 追踪
9 E# |3 M. B0 [& N6 J. H1 U  用SQL Server Profiler 或者SQL Trace可以捕捉到工作量,并且导出到 SQL 脚本中。脚本可以在从数据库中再次运行。) h+ i$ \7 }) f' {- D/ O
  这个解决方案存在的问题包括:
( |! \' b/ \- f) M. ~$ S  a9 Y/ G  1、执行的命令是有一定顺序的。如果一个事务在一个单独的执行中被打开或者关闭了,而这个操作不是这一系列命令中的一个,那么脚本就无法使其发生关系,因为“会话”无法被Traces识别了。
* t7 O. n$ {% F' t& z  2、如果在两个版本之间,命令语法有区别,那么在从数据库中的执行一定会失败。1 \; X3 j* u% d* y- q* g
  编程8 I  i! |9 [$ [, Q
  如果你有一小批数据库要移植,那么你可能会考虑编写一个数据库组件来传输数据的修改。) M* n; o) G5 d! W. a# O
  示例:
; L# J  O$ |; }6 E# I5 f  ・ 使用触发器――这可能会影响性能,因为触发器是事务的一部分。
6 m6 T& A! k' o# ]  ・ 使用DTS或者BCP来传输数据――这种方法在很大程度上依赖数据量的大小。0 m2 y8 F* ]% P; s/ o
  第三方工具
6 C2 j+ \1 s, F  你可以使用第三方工具,例如Log Readers来从事务日志、脚本中读取SQL 命令,然后在从数据库中执行它们。还有,虽然我无法自己找到这样的一个工具,但是在SQL Server 2005中肯定会有一个工具能够备份事务日志,并且在SQL Server2000中顺利地重新存储它们。0 t4 A. S4 K! V2 Y8 e: O: Y
  其它7 Y1 q+ F0 L$ D' t6 K( z
  你还可以创新……
: U; Q+ C. {$ G, G  例如,在某些情况下,你可以将日志传送到从SQL Server 2005数据库中,把它的兼容级别改为80,然后备份并重新存储到第三个数据库中去。# m6 Y- Y. P" w) t& c2 b7 n9 E* U
  结论
% _" y) H' n7 N4 j8 u  对于关键的数据库,保留要升级的数据库的旧的版本,以及最新的数据修改,以便在需要回滚的时候用到,确实是个好主意。
9 Z" S) a6 \$ k1 d# t; Z  但是……任何事物都没有“最好的解决方法”。你必须分析你的数据库特点和结构,然后决定针对你的需求的最佳解决方法。就我个人来说,我倾向于认为复制是最快最可靠的解决方法。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|赛格电脑 华强北 电脑城 南山赛格 龙岗电子世界 龙华电脑城 沙井电脑城 松岗电脑城 pc4g.com ( 粤ICP备16039863号 )

GMT+8, 2025-9-2 03:41 , Processed in 0.107265 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表