从SQL Server 2000 升 级到SQL Server 2005意味着进入一个完全崭新的数据库管理世界。我们已经编制了一个经常会被问到的问题列表来解决你的SQL Server 2005 升 级问题,包括使用DTS包、复制数据库、创建密码和在同一台机器上安装不同的SQL Server版本。
经常被问到的问题:
升级到SQL Server 2005
1. SQL Server 2000 DTS包可以用在SQL Server 2005中吗?
2. 当升级到SQL Server 2005时遇到了加密失败我应该怎样解决?
3. 为SQL Server 2005升级而复制数据库的最好方法是什么?
4. 在升级之后我怎么调整SQL Server查询性能?
5. 故障转移集群在SQL 2005中是怎么工作的?
6. 可以在同一台机器上安装不同的SQL Server版本吗?
7. 在SQL Server 2005中可以调用一个扩展存储过程吗?
8. 我怎么为一个SQL Server数据库创建用户名和密码?
9. 我可以同时运行SQL 2000和SQL 2005实例吗?
10. 你能提供一些SQL Server 2005升级问题的例子吗?
11. 在SQL Server 2005中会出现什么存储过程并发问题?
12. SQL Server 2005数据库可以移植回SQL Server 2000吗?
1. SQL Server 2000 DTS包可以用在SQL Server 2005中吗?
DTS不在SQL Server 2005中使用了,它由一个崭新的被称作SQL Server集成服务(SSIS)的抽取、转换和装载(ETL)引擎所替代。SSIS为构建ETL解决方案提供了一个比DTS更加强大、灵活和具有更好性能的基础,但是这可能使许多数据库管理员不知道该拿他们的DTS包怎么办。
好消息是,尽管他们不能再在SQL Server 2005中编辑,但是在SQL Server 2000中创建的DTS包仍然可以运行。为了缓和这个过渡,SQL Server 2005提供了一个升级向导帮助数据库管理员将包转换到SSIS框架中。然而,不是所有的组件都可以升级。例如,ActiveX的转换对于升级向导来说就是个挑战,而且它可能并不能移植。
而这意味着数据库管理员将最终要使用SSIS重写这些包,由于有了SSIS提供的功能,这么做可能会比使用DTS简单得多。
2.当升级到SQL Server 2005时遇到了加密失败我应该怎样解决?
我们最近在WINDOWS 2003上从SQL 2000升级到了SQL 2005。整个升级过程都进行得很顺利,除了加密。我们有连接到一个内部服务器的ASP.NET 1.x应用,但是加密的时候失败了。我们在MS KB上尝试了所有可用的步骤,但仍然不能解决这一问题。
在微软的“怎么:加密连接到数据库引擎”文章中,我们发现下面的话:要配置服务器接受加密连接:
1. SQL Server配置管理器中,扩展SQL Server 2005网络配置,右键单击“协议”,然后选择“选择属性”。
2. 在协议的属性对话框中,在“证书”标签中,在证书的下拉列表框中选择想要的证书,然后点击OK。
3. 在“标记”标签中,在强制加密选择框中选择“是的”,然后点击OK来关闭这个对话框。
4. 重启SQL Server服务。
问题是,当我们到达第二步时,在下拉列表框中没有可用的证书。这个问题纯粹是由于安装SQL Server 2005所产生的。这些应用在安装之前可以成功的将数据连接加密。所有的内部和非加密的连接都工作正常。我应该怎么做可以让证书出现在属性对话框中的证书标签中?
SQL Server协议小组的Xinwei Hong所贴的博客SQL协议应该可以帮助你解决这一问题。这篇文章列出了SQL Server 2005正确加载协议所要求的几个标准。
—Adam Machanic,SQL Server 2005专家
3. 为SQL Server 2005升级而复制数据库的最好方法是什么?
我在试着将有着近300个数据库的SQL Server 2000 32位移植到SQL Server 2000 64位。我尝试用“复制数据库”的特性,但是它不能成功的复制任何数据库。我还需要将所有的登录移植过去。欢迎任何建议。
我发现一般情况下复制数据库向导同其他的移动数据方法相比要慢而且低效。它最好用于当你需要在两个服务器之间做少量数据的一个非常快速并有冗余的转移,而且不想花费时间去做备份或分离数据库的情况下。
如果你需要转移300个数据库,我认为你会发现最好的方法是在SQL Server 2000实例上使用sp_detach_db来分离每一个数据库,并在SQL Server 2005实例上用sp_attach_db重新绑定每一个数据库。这么做还能保留你的数据库用户。
然而,即使使用这个方法,你仍然需要获得对SQL Server 2005实例的登录。访问一个KB文章,那里包含了一个可以帮助你做这个工作的脚本,查看这个微软支持页面。
注意,当你完成的时候,你可能需要重新匹配数据库用户和登录。为了重新匹配,使用sp_change_users_login系统存储过程。
—Adam Machanic,SQL Server 2005专家
4. 在升级之后我怎么调整SQL Server查询性能?
我们将我们的SQL Server 2000 10 GB数据库移植到SQL Server 2005。少数查询比在SQL Server 2000中时要慢。先前我们获得结果要10秒钟,而现在要30分钟。这个执行查询计划在SQL Server 2000和SQL Server 2005中是不同的。SQL Server 2000使用索引而SQL 2005使用表的表扫描。还有表的嵌套循环/内连接的序列也改变了。因为这是一个动态应用,所以修订查询是很困难的。你可以提供什么建议关于调整SQL Server 2005中的查询性能吗?
你需要把这个问题当做一个和升级无关的新的问题来检修。需要重新建立索引,需要更新统计。有时在一个SQL Server升级之后(从SQL 7到SQL 2000,或者从SQL 2000到SQL 2005)需要重新建立索引,需要更新统计。我总是推荐使用UPDATE STATISTICS命令替代sp_updatestats,因为UPDATE STATISTICS命令使你可以访问比sp_updatestats存储过程给予的更多的选项。
5.故障转移集群在SQL 2005中是怎么工作的?
故障转移集群在SQL 2005中是怎么工作的?它与Oracle和DB2的故障支持相比怎么样?
在SQL Server 2005中故障转移集群功能在很多方面都得到了很大扩展。
首先,运行于Windows 2000 Datacenter 的SQL Server 2000仅限于四个服务器的集群。现在运行在Windows 2003 Server的SQL Server 2005可以支持八个结点(取决于Windows 2003的版本)。
现在故障也被支持于更多种类的服务。分析服务、通知服务、复制和SQL Server代理都是SQL Server 2005中的集群意义上的服务。这对于那些利用这些特性和需要维护高可用性的公司来说是个重要的因素。
但是在数据库可用性方面最大的改进根本不是故障转移集群。一个叫做“数据库镜像”的新的特性将证明是一个更具吸引力的维护正常运行时间的方式。
这个特性可以被认为是日志传送的更实时的方式。事务被连续的从一个活动的结点传送到另一台一直保持恢复状态的服务器上的正在等待中的数据库中。当或如果这个活动结点传送过来,这个镜像几乎可以立即接收。这是对滞后的一个非常巨大的改善——有时几分钟——这可以同故障转移集群一起使用。
关于这个和数据库管理员感兴趣的其它特性的更多信息,可以在TechNet文章里看到,提供给数据库管理员的SQL Server 2005 Beta 2概述
—Adam Machanic,SQL Server 2005专家
6.可以在同一台机器上安装不同的SQL Server版本吗?
你可以在同一台机器上安装两个不同版本的SQL Server吗?
是的,你可以。虽然你理论上可以以任何顺序来安装它们,但我总是愿意建议以发布的顺序来安装软件:先是SQL Server 2000,然后是SQL Server 2005。
—Greg Low,开发专家
7.在SQL Server 2005中可以调用一个扩展存储过程吗?
我在java中使用用于SQL Server 2005的JDBC调用一个扩展存储过程(特别是xp_cmdshell)时遇到了问题。通过使用用于SQL Server 2000 Service Pack 3的JDBC,我可以调用它就像调用一个普通的存储过程一样。对于SQL Server 2005,我得到下面的信息:
om.microsoft.sqlserver.jdbc.SQLServerException:对存储过程‘xp_cmdshell’的请求失败了 因为'xp_cmdshell'是一个存储过程对象。
它是一个SQL Server 2000服务器。我想用新的2005JDBC,因为在手动事务模式下克隆连接使用没有问题。我在我的webserver上遇到了关于selectMethod=cursor属性的问题,它看起来没起作用。它在开发过程中在我的本地webserver上运行良好,但是由于某种原因在运行在动态webserver上时不能正常工作。是否可以调用这个扩展存储过程呢?<.p>
是的,默认的,它在2005中是不可用的,因为它不被认为是安全的。如果你认为它是适当的,你可以使用外围应用配置器(Surface Area Configuration Tool)工具来设置它为可用的。
8.我怎么为一个SQL Server数据库创建用户名和密码?
我创建了一个SQL Server 2005数据库,我计划用一个用户名和密码来保护它。我不清楚这要怎么做。我怎样用我的新数据库的安全对象为它建立一个安全系统?
这有一篇Steve Jones写的很好的文章,它会让你从SQL用户和登录开始:开始SQL Server——登录和用户。
—Steven Andres,安全专家
9.我可以同时运行SQL 2000和SQL 2005实例吗?
你可以在同一台机器上运行SQL 2000和SQL 2005实例吗?有什么问题是和这两个实例运行在一起相关联的吗?
是的,他们可以运行在一起。我看过的唯一问题是当2000在2005之后安装的,因为共享dll被旧的替代了而出现了一些问题。安装另一个2005的实例看起来总是可以解决这一问题。
—Greg Low,开发专家
10.你能提供一些SQL Server 2005升级问题的例子吗?
从SQL Server 2000移植到SQL Server 2005时可能会遇到什么问题?在移植过程中所应该采取的预防措施都有哪些?
在做移植时你可能会遇到很多问题——而在这里很难解释所有的问题。幸运的是,微软已经发布了一个工具来帮助移植。你可以在我的文章“使用SQL Server 2005升级顾问减少升级未知数”里读到所有关于升级的问题。
要知道更多的关于移植的信息,我邀请你听我的webcast升级到SQL Server 2005:你必须知道的事情,在其中我分享了许多提示以帮助确保顺利的转变到新的版本。
—Adam Machanic,SQL Server 2005专家
11. 在SQL Server 2005中会出现什么存储过程并发问题?
我在SQL Server 2005遇到了一个并发问题。在我卖票的公交车上有一些免费的座位。在插入一个售出的票之前我要检查是否还留有免费的座位。我的存储过程像下面所示:
CREATE PROCEDURE add_ticket -- parameters DECLARE free_seats int BEGIN TRANSACTION SELECT free_seats = COUNT(*) FROM tickets WHERE seat_is_not_taken IF free_seats <> 0 INSERT INTO tickets VALUES(...) -- some other statements END TRANSACTION
问题是两个进程可以并发的读取免费票的数量,并都可以保留一张票,即使已经没有免费票了。我需要一种方法使运行add_ticket存储过程的进程在没有插入一张新的票之前,其它进程被阻止读取免费票的数量。SET TRANSACTION ISOLATION LEVEL在这种情况下不起作用,对吧?
你是对的;一个更高的隔离级别不能帮助保证多个读者不会同时读取同一行数据。不过,你可以采取几种方式来完成这个工作。例如,你可以分配给每一个座位一个唯一的标识(意思是,一个唯一的键,没有必要是全局统一标识符),并创建一个表储存已经被占用的座位。在这个表上加一个UNIQUE约束,这样就能保证一个座位不能插入两次。
我认为一个更有趣的选择可能是使用SQL Service Broker。你可以为每一辆公交车建立一个会话,将这个会话句柄存储在一个表里,读者在作接受之前可以参考这个表。通过这种方法,读者可以简单的按其需要接受这个信息(在进程中,保留汽车上的座位)。Service Broker会确保没有信息会被接受两次,这意味着你不会再遇到任何并发问题。
—Adam Machanic,SQL Server 2005专家
12. SQL Server 2005数据库可以移植回SQL Server 2000吗?
在移植到SQL Server 2005的过程中,许多组织仍然会被要求支持SQL Server 2000安装。结果,一个普遍的要求是能够反向移植:将数据库从SQL Server 2005移植会SQL Server 2000。
不幸的是,这并不是那么简单。从SQL Server 2005实例备份的数据库不能恢复到SQL Server 2000实例中。分离的SQL Server 2005数据库也不能重新绑定到SQL Server 2000中。
因为不支持备份/恢复和分离/绑定,对于移动数据从SQL Server 2005到SQL Server 2000的唯一可用的方法是基于复制数据。数据和schemas可以用一个工具例如Red Gate的SQL Packager来跟踪,脚本可以应用于SQL Server 2000上。另一个选择是使用像DTS或SSIS之类的工具,这些工具都包含数据复制向导。
然而,复制数据和 schema 是一个潜在的麻烦经历。 SQL Server 2005 支持许多 SQL Server 2000 种没有的特性,而这在交叉移植过程中会引起问题。在试图为两种平台开发解决方案时谨慎是很重要的,我的建议是开发应该采用 SQL Server 2000 来完成,而代码和数据应该移植到 SQL Server 2005 中。