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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2563|回复: 0

SQL Server 2000升级到2005注意屎项

[复制链接]
发表于 2013-1-2 23:35:05 | 显示全部楼层 |阅读模式
SQL Server 2000升级到2005注意屎项  c( {9 K- c+ @3 r3 l, Q! ^! x' C* E8 n
7 R/ u' h5 I6 K: Y, T
6 u& t0 n9 y0 I6 i
& ]: [1 X7 F( S( z* n5 u

8 v- a, F* N. }9 w+ L

, X' `! {$ ]% ~: W, F2 |3 `1 |$ c
6 J. l4 J$ L$ U3 @2 B' }
. v7 B6 y% I0 o: i* g
! Y. ~4 s7 X) C  如果你计划将数据库从SQL Server 2000 升级到 SQL Server 2005。你在升级之前一定会测试每样东西,并且证明应用程序是稳定的。即使这样,如果升级之后发生任何问题的话,你仍然会想要确保你仍然可以回退到原来的环境中去,并且保证不丢失任何的数据修改。: n/ P! j8 {& l/ j# ?2 i
  这篇文章列出了保持原有数据(SQL Server 2000)中数据最新,直到新的环境被证明是最棒的方法。
3 K1 ?* H  I% u& E4 L3 `: r  保持原有SQL Server环境最新的方法:; N7 X; M6 i, O7 p
  在SQL Server中,有一些方法可以用来复制数据修改到另外一个数据库中去:
9 O: o" I: {9 `% G  1、日志传送& X# u) z1 s# C7 a' c( F
  2、拷贝数据库任务( n# @; l# c+ L& r& f3 _
  3、复制(事务,快照)
) M0 `( S) |" H/ ?, k) W% ?; T5 A  4、SQL 追踪
/ ?: e5 r% {+ q  5、编程(触发器、DTS,BCP等)
! Z, ]' K, y/ \3 M  X( `5 o* U$ h% V  6、第三方工具. t  ]$ T) t* @! e* l, e$ O
  下面我们来讨论其中的三种方法:/ }& N% S/ Y5 V# W% A
  日志传送
) k  D  v* V( _  y! A  我们可以在SQL Server 2005数据库(主数据库)和SQL Server 2000数据库(从数据库)之间传送日志吗?$ _* ]6 u0 q) w$ R+ r0 \8 X  x
  我努力在因特网上寻找这个问题的积极答案,但是很不走运。然后我试图自己创造性地寻找一种解决方法,使用产品自带的标准工具。也没有门,天啊……我只能在第二个数据库中使用WITH NORECOVERY将日志从SQL Server 2000 传送到SQL Server 2005,没有其他办法。所以,答案是“没有”,使用日志传送是不现实的。
0 m4 z& E- g/ I0 p9 f1 O  拷贝数据库9 e) R9 z- f; `  Y' N+ [
  不幸的是,当开启拷贝数据库向导的时候,当源和目标版本不同的时候,你就会收到错误信息,不能继续下去。
+ `3 K. w8 L0 `+ h1 T" A  复制0 c" \/ w+ _, F/ G4 s8 B" T- M
  事务复制
, U- k* `' ]7 q5 u6 a  事务复制是在两个版本之间工作的。这个解决方案有两个问题:
9 V" Q, ^0 e1 s2 q  H  有一些SQL Server的版本不能作为PRIMARY 或者DISTRIBUTOR参加复制模型,《SQL Server 2005 Features Comparison》一书中对此有详细描述。
# n! R8 w+ q7 e4 w  没有定义Unique键的表不能参加这个模型。$ s/ M8 a* @8 w$ e# L5 k
  快照复制
4 K2 S7 _! r! p- c( U) S  这个解决方案有效,但是也有几项例外。例如,如果表中有用户自定义数据类型,并且必须在表被创建之前创建,那么由于在SQL Server2000没有CREATE TYPE这个命令,就会失败。8 O1 E8 r4 g4 i; |8 F8 Q
  SQL 追踪! C! g2 Q% o+ O/ L( q: {  y3 S
  用SQL Server Profiler 或者SQL Trace可以捕捉到工作量,并且导出到 SQL 脚本中。脚本可以在从数据库中再次运行。7 b- v9 ~+ c- U. C7 F
  这个解决方案存在的问题包括:9 N1 P+ M: e" V' g
  1、执行的命令是有一定顺序的。如果一个事务在一个单独的执行中被打开或者关闭了,而这个操作不是这一系列命令中的一个,那么脚本就无法使其发生关系,因为“会话”无法被Traces识别了。
: g2 M6 e" Q. A! z) i! t8 ~  2、如果在两个版本之间,命令语法有区别,那么在从数据库中的执行一定会失败。& B) F$ d- q: f+ i* A' e  L
  编程2 @; A4 O- j; t# h  s" R0 `
  如果你有一小批数据库要移植,那么你可能会考虑编写一个数据库组件来传输数据的修改。
1 N# Y! r- B; s( Y1 j9 i' ?  示例:
! d, |3 B9 r5 i/ K  ・ 使用触发器――这可能会影响性能,因为触发器是事务的一部分。# q3 L8 G" E) R6 Q
  ・ 使用DTS或者BCP来传输数据――这种方法在很大程度上依赖数据量的大小。
4 U5 ?2 M! e/ l( }% W/ G  B6 V  第三方工具
+ m8 D: ]  v5 G( x( |  你可以使用第三方工具,例如Log Readers来从事务日志、脚本中读取SQL 命令,然后在从数据库中执行它们。还有,虽然我无法自己找到这样的一个工具,但是在SQL Server 2005中肯定会有一个工具能够备份事务日志,并且在SQL Server2000中顺利地重新存储它们。* j; o) n9 `5 T: M/ q
  其它
6 d4 A) L1 a. C# ]  你还可以创新……
& b2 m2 ]& i: `7 L$ e  例如,在某些情况下,你可以将日志传送到从SQL Server 2005数据库中,把它的兼容级别改为80,然后备份并重新存储到第三个数据库中去。
9 S( I& G' D3 o9 X2 y3 {  结论
2 {6 T0 ]* r* z9 W. _  对于关键的数据库,保留要升级的数据库的旧的版本,以及最新的数据修改,以便在需要回滚的时候用到,确实是个好主意。
( \  a# A1 ]% |% m! x  但是……任何事物都没有“最好的解决方法”。你必须分析你的数据库特点和结构,然后决定针对你的需求的最佳解决方法。就我个人来说,我倾向于认为复制是最快最可靠的解决方法。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-19 22:42 , Processed in 0.084713 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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