找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2672|回复: 0

SQL Server 2000升级到2005注意屎项

[复制链接]
发表于 2013-1-2 23:35:05 | 显示全部楼层 |阅读模式
SQL Server 2000升级到2005注意屎项: S4 }6 H3 o, r( m2 j
& o* X4 q) ~7 w9 e: H  b
! i& a  `7 H9 h, q! b
" Z- u8 f% y9 n3 C9 D; y7 g

+ _7 _# f" f1 i# U6 b+ n

5 `/ X. J& M* W/ S* U( a+ s. m$ M; B/ b3 g
# l' o/ |6 @0 U: y7 Q4 d

$ H5 x8 `% P- k4 e) r, c  如果你计划将数据库从SQL Server 2000 升级到 SQL Server 2005。你在升级之前一定会测试每样东西,并且证明应用程序是稳定的。即使这样,如果升级之后发生任何问题的话,你仍然会想要确保你仍然可以回退到原来的环境中去,并且保证不丢失任何的数据修改。
! n2 n/ O$ h; ^$ J9 `* r$ n  这篇文章列出了保持原有数据(SQL Server 2000)中数据最新,直到新的环境被证明是最棒的方法。
7 A+ K0 f& I+ G  x" C3 Q# B9 Z/ i  保持原有SQL Server环境最新的方法:
' j$ E& X* d/ b1 P4 L  `  在SQL Server中,有一些方法可以用来复制数据修改到另外一个数据库中去:
+ U9 [/ T2 U' d) \* K  1、日志传送
% F4 m3 I6 W3 I7 u6 R, z5 D" d1 L  2、拷贝数据库任务) i- u1 Z# C, m
  3、复制(事务,快照)
9 l& }% P! L, E" }9 G  4、SQL 追踪' c0 m+ T5 l$ S: K5 `
  5、编程(触发器、DTS,BCP等)
/ o; ~% f, p! a# |- m3 k  6、第三方工具8 h. j* R) N) b3 `
  下面我们来讨论其中的三种方法:  c  N( O" ~2 L. |4 a$ y
  日志传送
8 W5 M3 V; s: z  我们可以在SQL Server 2005数据库(主数据库)和SQL Server 2000数据库(从数据库)之间传送日志吗?
- O  i' v, {! e" q; N  我努力在因特网上寻找这个问题的积极答案,但是很不走运。然后我试图自己创造性地寻找一种解决方法,使用产品自带的标准工具。也没有门,天啊……我只能在第二个数据库中使用WITH NORECOVERY将日志从SQL Server 2000 传送到SQL Server 2005,没有其他办法。所以,答案是“没有”,使用日志传送是不现实的。
  M/ D& \6 T8 K5 M  拷贝数据库
/ T5 C: H8 Q$ m' C' @; x' k  不幸的是,当开启拷贝数据库向导的时候,当源和目标版本不同的时候,你就会收到错误信息,不能继续下去。( [: Q: l- X3 X" F- p2 z
  复制
5 D; ^' H" R) z. `" }  事务复制9 R/ T( o5 C) A5 M) u$ `6 k
  事务复制是在两个版本之间工作的。这个解决方案有两个问题:
& L+ [6 |6 q  s" c' ^  有一些SQL Server的版本不能作为PRIMARY 或者DISTRIBUTOR参加复制模型,《SQL Server 2005 Features Comparison》一书中对此有详细描述。2 T2 t2 Z( Y5 p4 G9 z
  没有定义Unique键的表不能参加这个模型。6 Z7 A" h' w, L- m8 q
  快照复制
3 Y! B8 `3 v5 b, K) R  E  这个解决方案有效,但是也有几项例外。例如,如果表中有用户自定义数据类型,并且必须在表被创建之前创建,那么由于在SQL Server2000没有CREATE TYPE这个命令,就会失败。
  ^' |7 `  ~3 @, I7 G( {  SQL 追踪3 L- Y2 y8 _6 x/ g
  用SQL Server Profiler 或者SQL Trace可以捕捉到工作量,并且导出到 SQL 脚本中。脚本可以在从数据库中再次运行。' r( M/ A/ Q& k6 u! ^5 k. b7 v. ^: M
  这个解决方案存在的问题包括:" ~* Z9 C/ j. v6 r1 V  k& ~
  1、执行的命令是有一定顺序的。如果一个事务在一个单独的执行中被打开或者关闭了,而这个操作不是这一系列命令中的一个,那么脚本就无法使其发生关系,因为“会话”无法被Traces识别了。
4 N% E4 ?- q2 [( D  2、如果在两个版本之间,命令语法有区别,那么在从数据库中的执行一定会失败。* a" N) }0 }0 v( g
  编程
9 {5 Y" x) Z% X# w8 P( p+ d5 k! K  如果你有一小批数据库要移植,那么你可能会考虑编写一个数据库组件来传输数据的修改。% V: u3 V7 C; U( k
  示例:9 J1 M, ^3 ^6 f2 s
  ・ 使用触发器――这可能会影响性能,因为触发器是事务的一部分。$ t+ H! T' C4 k) x+ |, f7 B: V8 ?% o
  ・ 使用DTS或者BCP来传输数据――这种方法在很大程度上依赖数据量的大小。/ h+ U5 h( b5 T) J% d* }( b6 e- e
  第三方工具
1 P  l$ F# V1 I, \9 s# o  你可以使用第三方工具,例如Log Readers来从事务日志、脚本中读取SQL 命令,然后在从数据库中执行它们。还有,虽然我无法自己找到这样的一个工具,但是在SQL Server 2005中肯定会有一个工具能够备份事务日志,并且在SQL Server2000中顺利地重新存储它们。& S5 h% d5 h8 T& g: r1 t6 |
  其它( m% s" v) ~" R1 a* G1 ?: }) B5 K
  你还可以创新……
2 \0 l  b, t0 q) ^, `- @  例如,在某些情况下,你可以将日志传送到从SQL Server 2005数据库中,把它的兼容级别改为80,然后备份并重新存储到第三个数据库中去。
1 z* V$ A. ]$ _7 S9 b3 t( G' @  结论$ @2 P0 C& K) b6 ]1 ]
  对于关键的数据库,保留要升级的数据库的旧的版本,以及最新的数据修改,以便在需要回滚的时候用到,确实是个好主意。/ H( f+ Y! z6 n
  但是……任何事物都没有“最好的解决方法”。你必须分析你的数据库特点和结构,然后决定针对你的需求的最佳解决方法。就我个人来说,我倾向于认为复制是最快最可靠的解决方法。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-14 18:05 , Processed in 0.037239 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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