找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2692|回复: 0

SQL Server 2000升级到2005注意屎项

[复制链接]
发表于 2013-1-2 23:35:05 | 显示全部楼层 |阅读模式
SQL Server 2000升级到2005注意屎项
, }5 E8 P, N5 C* ~7 \7 Q, ^, Z* Z: J2 U% R6 |! u& s
, F! h, i0 R; ?7 @6 R
) L" U" \' t1 Z& y% w2 P5 q

* P# P+ M) Z! z3 O5 E

' W( L; N" `. d) i
$ m" i4 s/ N/ O2 `  x  {1 r+ H. N5 Q( i! s' `# ~3 \! o
" W7 K! J* l. j) i; f" S% v/ i% T8 s
  如果你计划将数据库从SQL Server 2000 升级到 SQL Server 2005。你在升级之前一定会测试每样东西,并且证明应用程序是稳定的。即使这样,如果升级之后发生任何问题的话,你仍然会想要确保你仍然可以回退到原来的环境中去,并且保证不丢失任何的数据修改。
# X5 _7 O- g; x" _: D  这篇文章列出了保持原有数据(SQL Server 2000)中数据最新,直到新的环境被证明是最棒的方法。- c/ {: E  p9 o" Z6 r- l- A" z. ~
  保持原有SQL Server环境最新的方法:
2 p  M$ O( M7 y0 H% R$ W  在SQL Server中,有一些方法可以用来复制数据修改到另外一个数据库中去:
( ~* h& q0 O8 e3 x' `  1、日志传送% s! {% C7 G# g% M( @+ N
  2、拷贝数据库任务" G' I: N0 N# Y3 n. V: D6 S6 l
  3、复制(事务,快照)
. F4 D2 v6 a/ {; k0 O  4、SQL 追踪
1 g, m* u2 m7 v  5、编程(触发器、DTS,BCP等)8 x9 A; w/ g# O, u! o# V. I- M
  6、第三方工具" N1 n7 _- v4 F! }8 d: @
  下面我们来讨论其中的三种方法:: L. j/ d, l6 n+ F0 s- d1 H
  日志传送  Y! z  k* w" A6 t" V/ K% K0 h
  我们可以在SQL Server 2005数据库(主数据库)和SQL Server 2000数据库(从数据库)之间传送日志吗?
0 x3 v; p+ h$ Z' o1 f3 o9 a( R1 s  我努力在因特网上寻找这个问题的积极答案,但是很不走运。然后我试图自己创造性地寻找一种解决方法,使用产品自带的标准工具。也没有门,天啊……我只能在第二个数据库中使用WITH NORECOVERY将日志从SQL Server 2000 传送到SQL Server 2005,没有其他办法。所以,答案是“没有”,使用日志传送是不现实的。
9 h7 u0 N$ f" h( l# M% J  拷贝数据库
. v* m- e# s9 W" w# y  不幸的是,当开启拷贝数据库向导的时候,当源和目标版本不同的时候,你就会收到错误信息,不能继续下去。7 b- H" U9 i: Y* S
  复制
2 N, Q0 H7 j3 _# M1 }+ H  事务复制
" v2 r5 Y; b  o1 V2 e; A  事务复制是在两个版本之间工作的。这个解决方案有两个问题:
3 A) K3 a5 }5 U0 g/ V  有一些SQL Server的版本不能作为PRIMARY 或者DISTRIBUTOR参加复制模型,《SQL Server 2005 Features Comparison》一书中对此有详细描述。
7 M! X4 r+ y8 F8 o& [$ P1 G* m  没有定义Unique键的表不能参加这个模型。6 {. |4 Z" G0 A. n: _8 M+ E
  快照复制
  ?. o. k) i8 H2 c  这个解决方案有效,但是也有几项例外。例如,如果表中有用户自定义数据类型,并且必须在表被创建之前创建,那么由于在SQL Server2000没有CREATE TYPE这个命令,就会失败。3 o; p6 |. h8 q. T( y
  SQL 追踪: }! s+ h1 F' _: X- L. z
  用SQL Server Profiler 或者SQL Trace可以捕捉到工作量,并且导出到 SQL 脚本中。脚本可以在从数据库中再次运行。% [2 q" ^$ }+ o4 E0 f1 `" a
  这个解决方案存在的问题包括:
, F% v% f! V2 V, }* ]$ ]" {  1、执行的命令是有一定顺序的。如果一个事务在一个单独的执行中被打开或者关闭了,而这个操作不是这一系列命令中的一个,那么脚本就无法使其发生关系,因为“会话”无法被Traces识别了。
8 @! ]' K3 p  s9 d  2、如果在两个版本之间,命令语法有区别,那么在从数据库中的执行一定会失败。
7 G& G. h3 y, D7 d& O5 j  编程
4 O, e( d8 K0 W/ s! v  如果你有一小批数据库要移植,那么你可能会考虑编写一个数据库组件来传输数据的修改。1 X: b! ]0 _& P& f
  示例:  [5 X; o1 K" ~' l" u# ?9 E
  ・ 使用触发器――这可能会影响性能,因为触发器是事务的一部分。
6 [6 D7 o+ T' ~9 V- l7 V  ・ 使用DTS或者BCP来传输数据――这种方法在很大程度上依赖数据量的大小。* w: f4 s1 D; v. \! g
  第三方工具3 h; m1 S( A! Q. k: k# T
  你可以使用第三方工具,例如Log Readers来从事务日志、脚本中读取SQL 命令,然后在从数据库中执行它们。还有,虽然我无法自己找到这样的一个工具,但是在SQL Server 2005中肯定会有一个工具能够备份事务日志,并且在SQL Server2000中顺利地重新存储它们。( M) ?2 Y) H5 [- ]* p
  其它
9 M1 V6 ~7 ]- J+ s8 S8 A, \9 n  你还可以创新……+ P' f0 W4 b: s! m1 y9 X3 Q6 n
  例如,在某些情况下,你可以将日志传送到从SQL Server 2005数据库中,把它的兼容级别改为80,然后备份并重新存储到第三个数据库中去。5 t7 a& @+ ?: H/ u( n0 |! R0 T
  结论- K, J+ Q6 D9 i! i! J
  对于关键的数据库,保留要升级的数据库的旧的版本,以及最新的数据修改,以便在需要回滚的时候用到,确实是个好主意。
+ L' w3 d/ D- q) y# [, `( }: C& M' O  但是……任何事物都没有“最好的解决方法”。你必须分析你的数据库特点和结构,然后决定针对你的需求的最佳解决方法。就我个人来说,我倾向于认为复制是最快最可靠的解决方法。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-4 19:41 , Processed in 0.098587 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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