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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2476|回复: 0

SQL Server 2000升级到2005注意屎项

[复制链接]
发表于 2013-1-2 23:35:05 | 显示全部楼层 |阅读模式
SQL Server 2000升级到2005注意屎项. [8 ?5 T$ |9 c7 m# i

! e' F% R/ Q# M' n" C& H4 b- J4 G/ h3 ?" C" V, e
& P1 x2 A# w% m% _5 ?1 U8 z7 R

" j( d) s- g9 ~0 Q: t

0 F: h0 A2 l3 ]: q& g. u! a- @' f, s4 G# `+ i& a

' M4 M- n7 `$ P7 Y8 s
6 I% ]" c7 b" M9 k( P: x  如果你计划将数据库从SQL Server 2000 升级到 SQL Server 2005。你在升级之前一定会测试每样东西,并且证明应用程序是稳定的。即使这样,如果升级之后发生任何问题的话,你仍然会想要确保你仍然可以回退到原来的环境中去,并且保证不丢失任何的数据修改。; k: E- ~4 `2 A8 J2 u6 V/ u
  这篇文章列出了保持原有数据(SQL Server 2000)中数据最新,直到新的环境被证明是最棒的方法。
- H6 P7 G' A' f: i$ z* b4 `# X# B  保持原有SQL Server环境最新的方法:
6 U* g9 n4 Q* B2 Y% y, L  在SQL Server中,有一些方法可以用来复制数据修改到另外一个数据库中去:
7 X5 V7 Z% y! }! N0 [  1、日志传送% ?+ P; ?" D! H, B( S! d5 e% @
  2、拷贝数据库任务
( c1 {$ f4 U- a; u  3、复制(事务,快照)
5 a0 B# _8 a0 D# I1 O7 z/ K6 J  4、SQL 追踪
; M. O; s2 I' r7 ~& {  d  5、编程(触发器、DTS,BCP等)
7 b% b/ P$ C) {2 G1 k  M* c! o  6、第三方工具1 u/ L4 M# n: g1 F: A0 M) ?, z' L6 E
  下面我们来讨论其中的三种方法:" M2 `& ^- s8 p7 n. y, l
  日志传送
9 L4 N0 T1 Y9 [  我们可以在SQL Server 2005数据库(主数据库)和SQL Server 2000数据库(从数据库)之间传送日志吗?: J1 O: S6 F; i% ]
  我努力在因特网上寻找这个问题的积极答案,但是很不走运。然后我试图自己创造性地寻找一种解决方法,使用产品自带的标准工具。也没有门,天啊……我只能在第二个数据库中使用WITH NORECOVERY将日志从SQL Server 2000 传送到SQL Server 2005,没有其他办法。所以,答案是“没有”,使用日志传送是不现实的。8 p1 P& f% }; |' V6 A
  拷贝数据库$ D: J1 L  j4 \3 G8 p0 v+ A/ [
  不幸的是,当开启拷贝数据库向导的时候,当源和目标版本不同的时候,你就会收到错误信息,不能继续下去。
" I, W- ?0 i- m+ m  复制
) U8 u. x, E/ z2 w' U) J/ E  事务复制/ @( y" N# j' D- j1 U
  事务复制是在两个版本之间工作的。这个解决方案有两个问题:
- K5 p( z- P. q+ o! U3 u7 A  有一些SQL Server的版本不能作为PRIMARY 或者DISTRIBUTOR参加复制模型,《SQL Server 2005 Features Comparison》一书中对此有详细描述。( M) [1 ~/ A, i7 Q
  没有定义Unique键的表不能参加这个模型。% @5 X( r7 h9 C/ g
  快照复制6 [7 u+ x8 L" j5 Y
  这个解决方案有效,但是也有几项例外。例如,如果表中有用户自定义数据类型,并且必须在表被创建之前创建,那么由于在SQL Server2000没有CREATE TYPE这个命令,就会失败。3 @3 [6 }: _$ e
  SQL 追踪3 J5 j  `8 \/ N; {
  用SQL Server Profiler 或者SQL Trace可以捕捉到工作量,并且导出到 SQL 脚本中。脚本可以在从数据库中再次运行。6 c" i: o2 U  D  g
  这个解决方案存在的问题包括:
5 I! |; f5 N; m* a4 X# u$ h  1、执行的命令是有一定顺序的。如果一个事务在一个单独的执行中被打开或者关闭了,而这个操作不是这一系列命令中的一个,那么脚本就无法使其发生关系,因为“会话”无法被Traces识别了。
: J$ S3 I% U( Q' D5 L  2、如果在两个版本之间,命令语法有区别,那么在从数据库中的执行一定会失败。
9 s) s! K9 v6 M- m2 g  编程: U! J8 @6 m( c6 H, T
  如果你有一小批数据库要移植,那么你可能会考虑编写一个数据库组件来传输数据的修改。( F2 R# g, a1 S- e# R
  示例:
7 F5 n% z7 T9 ?$ W- E( A( T- z  ・ 使用触发器――这可能会影响性能,因为触发器是事务的一部分。
" Z3 C: \; ~0 z$ J  ・ 使用DTS或者BCP来传输数据――这种方法在很大程度上依赖数据量的大小。
9 \% z7 ]( X, i  第三方工具' v# y6 N6 ^8 q  ^5 F
  你可以使用第三方工具,例如Log Readers来从事务日志、脚本中读取SQL 命令,然后在从数据库中执行它们。还有,虽然我无法自己找到这样的一个工具,但是在SQL Server 2005中肯定会有一个工具能够备份事务日志,并且在SQL Server2000中顺利地重新存储它们。& D- `' J; W" F$ _- x
  其它) I5 M2 B/ Z4 U9 L& ?
  你还可以创新……
$ k$ _7 ]5 T* O+ k  例如,在某些情况下,你可以将日志传送到从SQL Server 2005数据库中,把它的兼容级别改为80,然后备份并重新存储到第三个数据库中去。
. L( w3 V1 \3 j( E7 U& U) u  结论- u! y( w0 ?- @0 X0 h
  对于关键的数据库,保留要升级的数据库的旧的版本,以及最新的数据修改,以便在需要回滚的时候用到,确实是个好主意。
; @4 [2 s+ j, U) B, ~  但是……任何事物都没有“最好的解决方法”。你必须分析你的数据库特点和结构,然后决定针对你的需求的最佳解决方法。就我个人来说,我倾向于认为复制是最快最可靠的解决方法。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-27 06:15 , Processed in 0.164512 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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