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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2557|回复: 0

SQL Server 2000升级到2005注意屎项

[复制链接]
发表于 2013-1-2 23:35:05 | 显示全部楼层 |阅读模式
SQL Server 2000升级到2005注意屎项
3 z2 F& P0 A" k! P
* a: `! T  M0 t$ o  V" h2 T+ ^# j' _$ O: s( a, ~7 k- W. y8 i
% b7 t$ l: t0 E* v: c$ u4 ?$ n. E7 }
) e+ F- s! x. ]& o0 U
6 @( `: Z! w  T
1 J5 {8 ^' I: U% \6 ~3 l1 y

( R7 l0 k1 \) s  M5 O7 i  v! O
$ c% U9 i8 u$ k4 ~, \$ r  如果你计划将数据库从SQL Server 2000 升级到 SQL Server 2005。你在升级之前一定会测试每样东西,并且证明应用程序是稳定的。即使这样,如果升级之后发生任何问题的话,你仍然会想要确保你仍然可以回退到原来的环境中去,并且保证不丢失任何的数据修改。. g- h  Y1 Q% }# Z8 a- L
  这篇文章列出了保持原有数据(SQL Server 2000)中数据最新,直到新的环境被证明是最棒的方法。4 L4 o/ d' w( ]' X$ j6 @/ Y. J" M
  保持原有SQL Server环境最新的方法:
  K5 D' _7 m7 ?0 {) L' k  在SQL Server中,有一些方法可以用来复制数据修改到另外一个数据库中去:
& s8 E) w/ s, j+ t/ ?5 m9 y  1、日志传送) T6 w* \9 Z( w3 t
  2、拷贝数据库任务
( E' J' S2 F" b  3、复制(事务,快照)
( X% U: Y9 \" J0 E  4、SQL 追踪
9 d1 e; k1 N0 h8 S0 k) W$ s. D  5、编程(触发器、DTS,BCP等)8 @) A. G: {% ~; {' h5 U
  6、第三方工具- R1 {/ y/ C( x8 @
  下面我们来讨论其中的三种方法:2 T6 J) O: n. J+ `
  日志传送
( k+ ^: w. i$ A/ G& A% h6 @& N' V  我们可以在SQL Server 2005数据库(主数据库)和SQL Server 2000数据库(从数据库)之间传送日志吗?
) |( P7 ?+ R4 Q+ ?3 Y4 f! R  我努力在因特网上寻找这个问题的积极答案,但是很不走运。然后我试图自己创造性地寻找一种解决方法,使用产品自带的标准工具。也没有门,天啊……我只能在第二个数据库中使用WITH NORECOVERY将日志从SQL Server 2000 传送到SQL Server 2005,没有其他办法。所以,答案是“没有”,使用日志传送是不现实的。
- S+ C% t: G0 S( A: ~  拷贝数据库
& `$ S( }/ h4 M' A* h) y9 R! D  不幸的是,当开启拷贝数据库向导的时候,当源和目标版本不同的时候,你就会收到错误信息,不能继续下去。; E- \/ o4 y2 c1 s$ {/ ?
  复制
  g% r" G7 |3 n) [  事务复制
$ y$ ]8 ^; j$ ^( w  事务复制是在两个版本之间工作的。这个解决方案有两个问题:
/ x8 Q- q& i8 B7 d4 {  有一些SQL Server的版本不能作为PRIMARY 或者DISTRIBUTOR参加复制模型,《SQL Server 2005 Features Comparison》一书中对此有详细描述。2 S0 e  ]1 U  t
  没有定义Unique键的表不能参加这个模型。
6 a! L9 e  U4 x4 r8 D- ^8 _0 {  快照复制
: ~9 }3 o3 Q) K  K; ]' d- f3 L, O: c  这个解决方案有效,但是也有几项例外。例如,如果表中有用户自定义数据类型,并且必须在表被创建之前创建,那么由于在SQL Server2000没有CREATE TYPE这个命令,就会失败。
% I: v7 Y. M2 Q0 f" u: k" n! ?' H5 q/ G  SQL 追踪
7 z  [; f' m$ f& D  用SQL Server Profiler 或者SQL Trace可以捕捉到工作量,并且导出到 SQL 脚本中。脚本可以在从数据库中再次运行。
% [3 Q" t  w( V# ~  这个解决方案存在的问题包括:
, T6 g3 m; q0 m% B. ~8 U  1、执行的命令是有一定顺序的。如果一个事务在一个单独的执行中被打开或者关闭了,而这个操作不是这一系列命令中的一个,那么脚本就无法使其发生关系,因为“会话”无法被Traces识别了。
9 i7 \" N6 V1 b/ l! ~: L7 I  2、如果在两个版本之间,命令语法有区别,那么在从数据库中的执行一定会失败。
( H6 N& S& k- g. Z; S* p/ o/ W  编程; ~5 G5 p& P+ b" j4 ?3 D) E
  如果你有一小批数据库要移植,那么你可能会考虑编写一个数据库组件来传输数据的修改。0 K9 z( s" B/ g# n2 J3 B+ r4 O
  示例:8 r) e( |) ~# h! f9 w
  ・ 使用触发器――这可能会影响性能,因为触发器是事务的一部分。
1 m6 v: ]" S5 m6 ]* |" [7 _0 N7 N5 Q  ・ 使用DTS或者BCP来传输数据――这种方法在很大程度上依赖数据量的大小。
2 c$ n) c8 z  L7 x3 h3 R  第三方工具6 E5 v5 J6 {1 J& N
  你可以使用第三方工具,例如Log Readers来从事务日志、脚本中读取SQL 命令,然后在从数据库中执行它们。还有,虽然我无法自己找到这样的一个工具,但是在SQL Server 2005中肯定会有一个工具能够备份事务日志,并且在SQL Server2000中顺利地重新存储它们。- x! |5 k5 L* B0 m4 f
  其它
8 U* F6 j1 N0 B6 _  你还可以创新……+ m$ A8 d) j$ P0 c& M  c3 h
  例如,在某些情况下,你可以将日志传送到从SQL Server 2005数据库中,把它的兼容级别改为80,然后备份并重新存储到第三个数据库中去。
3 y3 N9 ]3 S- N! n  结论
8 f5 A1 f* T1 ]: u  对于关键的数据库,保留要升级的数据库的旧的版本,以及最新的数据修改,以便在需要回滚的时候用到,确实是个好主意。
. P5 |" U1 l5 y- A2 ?. q6 ?  但是……任何事物都没有“最好的解决方法”。你必须分析你的数据库特点和结构,然后决定针对你的需求的最佳解决方法。就我个人来说,我倾向于认为复制是最快最可靠的解决方法。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-17 16:53 , Processed in 0.083927 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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