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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2474|回复: 0

SQL Server 2000升级到2005注意屎项

[复制链接]
发表于 2013-1-2 23:35:05 | 显示全部楼层 |阅读模式
SQL Server 2000升级到2005注意屎项
) I7 J1 m& \) ]. m% w: c! F3 C5 R5 |- w# h9 c
9 P1 y. p; k6 Z/ N7 ?2 P

6 K' q" C& Z0 i6 c% @3 E8 |+ J3 t7 n9 N# R- v" X
4 H7 L- J( I1 S- n5 Y) M

- b- W4 N8 K' r- M! B: Y! d! k0 v
/ W% h, ~% J# r& |3 V% b- E7 }1 p& _5 W; h* d* P/ M$ f6 F! f
  如果你计划将数据库从SQL Server 2000 升级到 SQL Server 2005。你在升级之前一定会测试每样东西,并且证明应用程序是稳定的。即使这样,如果升级之后发生任何问题的话,你仍然会想要确保你仍然可以回退到原来的环境中去,并且保证不丢失任何的数据修改。
8 A* X% W$ K( g. [( O" O  这篇文章列出了保持原有数据(SQL Server 2000)中数据最新,直到新的环境被证明是最棒的方法。
4 e! O0 B# R& w$ }" v7 F  保持原有SQL Server环境最新的方法:$ V  S- h) E; E* s
  在SQL Server中,有一些方法可以用来复制数据修改到另外一个数据库中去:4 a1 h5 g: ^( s7 X9 q1 _9 g) |% o
  1、日志传送
8 H9 z8 k3 y, G, n  2、拷贝数据库任务
( ?& T1 @# y; `7 n* d% i+ z  3、复制(事务,快照)
8 M, B- o$ g  {+ X; g( V4 x  4、SQL 追踪5 l8 B( J$ @. ]* V5 V
  5、编程(触发器、DTS,BCP等)
1 [2 |+ @3 M6 A7 P# n" _5 q  6、第三方工具
4 P) X4 r; _+ X3 k: }+ @5 E6 z  下面我们来讨论其中的三种方法:# q  r8 E$ J8 r+ ?' ~3 E8 P* F
  日志传送/ \$ p) ?( E4 q3 p& X! o; x
  我们可以在SQL Server 2005数据库(主数据库)和SQL Server 2000数据库(从数据库)之间传送日志吗?* ^" \; v$ {: f. F- i( I
  我努力在因特网上寻找这个问题的积极答案,但是很不走运。然后我试图自己创造性地寻找一种解决方法,使用产品自带的标准工具。也没有门,天啊……我只能在第二个数据库中使用WITH NORECOVERY将日志从SQL Server 2000 传送到SQL Server 2005,没有其他办法。所以,答案是“没有”,使用日志传送是不现实的。
1 E8 J4 W6 S+ I( O0 G- T  拷贝数据库
0 D* w0 k$ Q" [, Y5 _  不幸的是,当开启拷贝数据库向导的时候,当源和目标版本不同的时候,你就会收到错误信息,不能继续下去。
0 [: C! f4 h" v  复制
% m+ r" Q0 m9 K# z; o  事务复制
/ B! X( s* U2 |) z: e3 _% }1 d  事务复制是在两个版本之间工作的。这个解决方案有两个问题:
& \2 j: O& L2 N5 A, C, R' o0 Q  有一些SQL Server的版本不能作为PRIMARY 或者DISTRIBUTOR参加复制模型,《SQL Server 2005 Features Comparison》一书中对此有详细描述。
+ l1 h( @$ b: _! |  没有定义Unique键的表不能参加这个模型。& P' t9 t4 B7 [1 N1 I% d
  快照复制/ ]1 p+ L" p/ e2 Z4 Y
  这个解决方案有效,但是也有几项例外。例如,如果表中有用户自定义数据类型,并且必须在表被创建之前创建,那么由于在SQL Server2000没有CREATE TYPE这个命令,就会失败。) @7 L' Y4 c7 C- h
  SQL 追踪
. q6 z: `1 o( f% }/ @$ B  j  用SQL Server Profiler 或者SQL Trace可以捕捉到工作量,并且导出到 SQL 脚本中。脚本可以在从数据库中再次运行。
  u: |) M4 _: {3 H' T  这个解决方案存在的问题包括:
. f7 {5 G& a) V/ S- p1 J  1、执行的命令是有一定顺序的。如果一个事务在一个单独的执行中被打开或者关闭了,而这个操作不是这一系列命令中的一个,那么脚本就无法使其发生关系,因为“会话”无法被Traces识别了。" O, T* E& Z- H7 x8 x
  2、如果在两个版本之间,命令语法有区别,那么在从数据库中的执行一定会失败。" D. I  J- h- v: [- b/ W6 X
  编程
5 M. x) P# ^# X  如果你有一小批数据库要移植,那么你可能会考虑编写一个数据库组件来传输数据的修改。7 ~7 ^3 n( R8 Y0 _- H
  示例:$ _( o4 z* b6 Q
  ・ 使用触发器――这可能会影响性能,因为触发器是事务的一部分。5 ^7 g- e% z* |& k/ k
  ・ 使用DTS或者BCP来传输数据――这种方法在很大程度上依赖数据量的大小。
& G3 L5 Y3 Y5 q; y+ |, x  第三方工具
1 w2 I4 z. C) v  K  你可以使用第三方工具,例如Log Readers来从事务日志、脚本中读取SQL 命令,然后在从数据库中执行它们。还有,虽然我无法自己找到这样的一个工具,但是在SQL Server 2005中肯定会有一个工具能够备份事务日志,并且在SQL Server2000中顺利地重新存储它们。/ n2 j# Y4 F. L3 ~+ Z
  其它+ D) I. X% y$ j9 I; P: }
  你还可以创新……
7 t" o  A+ \7 f; [" D3 [  例如,在某些情况下,你可以将日志传送到从SQL Server 2005数据库中,把它的兼容级别改为80,然后备份并重新存储到第三个数据库中去。) S! _% C  M) }! v* ^
  结论
- p1 g# `6 w- h) [  _6 g" X& \9 C  对于关键的数据库,保留要升级的数据库的旧的版本,以及最新的数据修改,以便在需要回滚的时候用到,确实是个好主意。
& p, H7 W/ c0 S: r% f1 H; |  但是……任何事物都没有“最好的解决方法”。你必须分析你的数据库特点和结构,然后决定针对你的需求的最佳解决方法。就我个人来说,我倾向于认为复制是最快最可靠的解决方法。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-26 23:50 , Processed in 0.161963 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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