华强北电脑城 龙岗电子世界 龙华电脑城  凯尔电脑

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1923|回复: 0

SQL Server 2000升级到2005注意屎项

[复制链接]
发表于 2013-1-2 23:35:05 | 显示全部楼层 |阅读模式
SQL Server 2000升级到2005注意屎项% e( `5 m" O3 g/ L; t7 M

8 G6 F+ F# v2 t) J) A* R  u7 d5 g1 g- E6 E: P0 c" @
2 l, e% y3 d! E3 Z# Q6 ^

& Z+ j( E" ^, g" ~' Z' C
& `+ J* w. ^" n
/ a# C7 }& A& f" z# P' ^  j7 z  A
# \+ s& T3 B2 a. V5 S/ T  @

  i  j* K+ E# E- `% k( S# q& o  如果你计划将数据库从SQL Server 2000 升级到 SQL Server 2005。你在升级之前一定会测试每样东西,并且证明应用程序是稳定的。即使这样,如果升级之后发生任何问题的话,你仍然会想要确保你仍然可以回退到原来的环境中去,并且保证不丢失任何的数据修改。2 r5 V- A! n; `* D
  这篇文章列出了保持原有数据(SQL Server 2000)中数据最新,直到新的环境被证明是最棒的方法。3 ?1 [* @5 i7 S6 q
  保持原有SQL Server环境最新的方法:
0 R0 b) j% r6 R4 E2 z+ T' B  在SQL Server中,有一些方法可以用来复制数据修改到另外一个数据库中去:
  W% r$ R! p; ]4 X+ u7 G  1、日志传送  j2 l, [! U! g$ Z! y( s4 S
  2、拷贝数据库任务2 k2 |' m  q7 ?/ U4 g  `
  3、复制(事务,快照)+ l, Y7 y/ V& y1 J9 n6 U& U
  4、SQL 追踪
9 K& O8 D. W8 I- A1 V+ }( L  5、编程(触发器、DTS,BCP等)% e& y4 r3 E; S8 S! |. N! b* o6 U3 ]
  6、第三方工具
& o% P0 x+ L4 i9 n$ t, d9 v: W  下面我们来讨论其中的三种方法:
3 w1 s: W- X+ p8 M0 `+ r  日志传送
% x' n1 \: |' R1 D  我们可以在SQL Server 2005数据库(主数据库)和SQL Server 2000数据库(从数据库)之间传送日志吗?% B. D6 G7 l3 o- \6 u: ?+ d1 X
  我努力在因特网上寻找这个问题的积极答案,但是很不走运。然后我试图自己创造性地寻找一种解决方法,使用产品自带的标准工具。也没有门,天啊……我只能在第二个数据库中使用WITH NORECOVERY将日志从SQL Server 2000 传送到SQL Server 2005,没有其他办法。所以,答案是“没有”,使用日志传送是不现实的。
. c% Z: F* Q& H7 k; ~; `  拷贝数据库
9 C7 K2 X, G& H) G7 r8 W  不幸的是,当开启拷贝数据库向导的时候,当源和目标版本不同的时候,你就会收到错误信息,不能继续下去。
( f0 O$ z/ m9 Y! R5 `  `! f+ j+ I  复制- v7 q3 ^+ o1 [" [) F  h: M3 H
  事务复制
( G9 M! {6 J9 y, R  事务复制是在两个版本之间工作的。这个解决方案有两个问题:$ z, R" i- Z" G3 W( x
  有一些SQL Server的版本不能作为PRIMARY 或者DISTRIBUTOR参加复制模型,《SQL Server 2005 Features Comparison》一书中对此有详细描述。$ r; o; J# \; }! U; c) S
  没有定义Unique键的表不能参加这个模型。
/ i* {* N( R6 F  快照复制
8 S5 w/ e6 I" |. _  这个解决方案有效,但是也有几项例外。例如,如果表中有用户自定义数据类型,并且必须在表被创建之前创建,那么由于在SQL Server2000没有CREATE TYPE这个命令,就会失败。. g8 n: B7 }3 Q  [6 O, F' z1 ?7 t- F
  SQL 追踪
1 M  G. k. M. Q! P+ f. L  用SQL Server Profiler 或者SQL Trace可以捕捉到工作量,并且导出到 SQL 脚本中。脚本可以在从数据库中再次运行。
; k3 c) d, ^' c$ s/ I  这个解决方案存在的问题包括:0 d/ |, ?0 o, F/ D( r2 x
  1、执行的命令是有一定顺序的。如果一个事务在一个单独的执行中被打开或者关闭了,而这个操作不是这一系列命令中的一个,那么脚本就无法使其发生关系,因为“会话”无法被Traces识别了。; k0 Y% @) Y6 b' k( w% i6 y* M
  2、如果在两个版本之间,命令语法有区别,那么在从数据库中的执行一定会失败。  Z) c7 @% ?# n
  编程
; Z+ u$ S% X) }7 n. F  如果你有一小批数据库要移植,那么你可能会考虑编写一个数据库组件来传输数据的修改。! r$ E" l$ ?# h, Y  Q6 M  Z/ p- s
  示例:5 T9 m/ t1 V# t* O& h6 `" \
  ・ 使用触发器――这可能会影响性能,因为触发器是事务的一部分。
. ]  \' p4 o4 P8 \9 {6 Z  ・ 使用DTS或者BCP来传输数据――这种方法在很大程度上依赖数据量的大小。) T! l: w+ P' S3 A( q7 I
  第三方工具/ f3 L3 u1 t% R7 C' C# ~) @4 b& L
  你可以使用第三方工具,例如Log Readers来从事务日志、脚本中读取SQL 命令,然后在从数据库中执行它们。还有,虽然我无法自己找到这样的一个工具,但是在SQL Server 2005中肯定会有一个工具能够备份事务日志,并且在SQL Server2000中顺利地重新存储它们。
" L3 ]+ g! W: @, v  其它
7 [9 ~% v* l3 e4 e0 b. I+ A  你还可以创新……% n. @, _, t" c$ W' r
  例如,在某些情况下,你可以将日志传送到从SQL Server 2005数据库中,把它的兼容级别改为80,然后备份并重新存储到第三个数据库中去。9 y$ U6 |6 k. P+ O) _' x0 Q
  结论* ^& |' t* p) S. G* i9 @4 A' K
  对于关键的数据库,保留要升级的数据库的旧的版本,以及最新的数据修改,以便在需要回滚的时候用到,确实是个好主意。: A& s$ _6 a3 J( o8 m' E
  但是……任何事物都没有“最好的解决方法”。你必须分析你的数据库特点和结构,然后决定针对你的需求的最佳解决方法。就我个人来说,我倾向于认为复制是最快最可靠的解决方法。
回复

使用道具 举报

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

本版积分规则

QQ|华强北 电脑城 龙岗电子世界 龙华电脑城 pc4g.com ( 粤ICP备16039863号 )

GMT+8, 2024-9-19 19:23 , Processed in 0.153430 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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