﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-zhangxl_blog-文章分类-DB</title><link>http://www.blogjava.net/zhanglongsr/category/41346.html</link><description>路漫漫其修远兮，吾将上下而求索！</description><language>zh-cn</language><lastBuildDate>Fri, 24 Jun 2011 21:54:22 GMT</lastBuildDate><pubDate>Fri, 24 Jun 2011 21:54:22 GMT</pubDate><ttl>60</ttl><item><title>《SaaS架构设计》读书笔记——可伸缩的应用架构</title><link>http://www.blogjava.net/zhanglongsr/articles/352884.html</link><dc:creator>zhangxl</dc:creator><author>zhangxl</author><pubDate>Thu, 23 Jun 2011 08:18:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglongsr/articles/352884.html</guid><wfw:comment>http://www.blogjava.net/zhanglongsr/comments/352884.html</wfw:comment><comments>http://www.blogjava.net/zhanglongsr/articles/352884.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglongsr/comments/commentRss/352884.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglongsr/services/trackbacks/352884.html</trackback:ping><description><![CDATA[&nbsp;本文摘自：<a href="http://blog.moozi.net/archives/saas-architecture-scalable-application-architecture.html">http://blog.moozi.net/archives/saas-architecture-scalable-application-architecture.html</a><br />&nbsp;&nbsp;&nbsp;&nbsp;对于SaaS应用的可伸缩，最理想的情况：随着用户数的增大，系统架构不用做调整，而仅需要增加/增强相应的硬件设备（应用服务器、数据库服务器）即可。而通常强调的应用架构具有<span style="color: #ff0000">可伸缩性，一般指的是可以实现&#8221;Scale out&#8221;，即水平扩展或者向外扩展。而&#8221;Scale up&#8221;通常为垂直扩展或者向上扩展，也就是增强硬件设备，这种方式几乎是任何应用架构普遍适用的，但是通常都会面临高成本的问题。</span> 
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #ff0000"><strong>1、应用服务器层的水平扩展。</strong></span>实现应用服务器层的负载均衡，是实现应用服务器水平扩展的最主要手段，具体实现负载均衡的策略有以下两种：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.基于硬件负载均衡设备实现负载均衡，如F5设备。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.基于软件的方式实现负载均衡，例如通过配置Apache Http Server。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Apache可以实现负载均衡，根据服务器的压力情况，将每个用户请求分布到不同的应用服务器上。但大部分应用的用户请教是有状态的（一般使用Session记录用户状态）。这种情况下，如何能够在多台应用服务器之间保持用户状态，将是实现应用服务器层水平扩展的关键。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>a.Session复制。</strong>Session复制的技术实现非常复杂，在大规模集群中实用性并不强，服务器之间大量的Session复制会严重影响这些服务器的性能。而随着服务器数量的增加，这种性能影响会显得更加突出，甚至不可接受。在大部分互联网应用中，Session复制技术应该是很少采用的。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>b.Session Sticky。</strong>为了避免Session复制所带来的性能影响，更简单、也是更高效的一种做法是Session Sticky。这种方式将同一用户的请求转发到特定的JBoss服务器上，避免了集群中Session的复制。Session Sticky的实现非常简单，但是这种方式不能满足fail-over的需求。即当一台应用服务器down的时候，这台服务器上正在访问的所有用户的Session都失效了，所有用户不得不再次重新登录。而且这种方式还容易导致负载不够均衡。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>c.基于Cache的集中式Session。</strong>这种方案通常使用集中式的Cache来代替本地Session。集中式的Session服务器采用的是MemCached，其本身也具备水平扩展能力。当Session数量大到一台Cache服务器都不能承受的程度时，我们也仅需要增加相应的Cache服务器即可。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 三种水平扩展方式的比较：</p>
<table style="border-right: #e6e6e6 1px solid; border-top: #e6e6e6 1px solid; border-left: #e6e6e6 1px solid; width: 540px; border-bottom: #e6e6e6 1px solid" cellspacing="1" cellpadding="0">
<thead>
<tr style="font-weight: bold; font-size: 14px;background: #f6f6f6; vertical-align: middle; height: 24px; text-align: center">
<td style="width: 120px">实现方式</td>
<td style="width: 200px">优势</td>
<td style="width: 220px">劣势</td></tr></thead>
<tbody style="padding-right: 5px; padding-left: 5px; font-size: 12px; padding-bottom: 3px; padding-top: 3px">
<tr>
<td style="font-weight: bold">Session复制</td>
<td>服务器负载可以得到较好的均衡，也可以确保fail-over的支持</td>
<td>Session复制会对服务器网络环境带来巨大的压力，尤其在应用服务器数量较大的时候，基本不适用于大型互联网，而且需要相应的应用服务器支持</td></tr>
<tr>
<td style="font-weight: bold">Session Sticky</td>
<td>实现比较简单，在Load Balance层做相应的配置即可，不会带来Session复制引起的网络环境压力</td>
<td>不能实现完全的负载均衡，部分情况下负载会极端失衡，无法实现fail-over</td></tr>
<tr>
<td style="font-weight: bold">基于Cache的集中式Session</td>
<td>应用服务器层无状态，可以实现完全的负载均衡，不会带来Session复制引起的网络环境压力</td>
<td>实现相对复杂一些，Cache本身可靠性不能绝对保证，可能会造成部分Session的丢失</td></tr></tbody></table>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #ff0000"><strong>2、数据库层的水平扩展。</strong></span>相对于应用服务器层的水平扩展，数据库层的水平扩展更难实现。实现数据库的水平扩展也有多种方式：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>a.数据库的垂直切分</strong>：将不同的功能模块所涉及的表划分到不同的物理数据库中，从而将对这些表的访问压力分担到多个不同的物理数据库中。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>b.数据库的读/写分离</strong>：同一个数据库在多个物理服务器上具有多份Copy，彼此同步。然后将对于数据库的写操作都统一到一个主服务器上，而读操作则分摊到多台从服务器上。通过读/写分离，实现数据库访问压力的分担。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>c.数据库的水平切分</strong>：将原来存储在一个数据表中的数据，按照一定的规则，切分到多个不同的物理数据库中。每个数据库的数据结构完全相同，但是数据各不相同。最终对于业务数据的访问，会根据其数据所在的数据库，定位到某一个数据库中查询。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000"><strong> 2.1、数据库的垂直切分。</strong></span>尽管数据库的垂直切分是最容易想到的，但对于大部分应用而言，除非模块间的关联很少，否则要实现垂直切分也不容易：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.原本可能存在的表连接，需要想办法去除。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.原本同一个数据库的事务操作，可能会变成跨库事务。可见数据库的垂直切分是一个可以适当采用，但很难广泛采用的数据库层扩展技术。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong> 2.2、数据库的读/写分离技术。</strong>对于读多写少的互联网应用，会广泛采用读/写分离技术。尽管Slave Database Server数量是可以线性扩展的，但是基于以下两个原因，Slave Database Server也不是越多越好。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.如果应用读/写比例不是很悬殊，单纯增加Slave Database Server对于应用性能提升并且没有特别的作用，通常情况下，Slave Server的数量与读/写比例对应。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.Slave Database Server过多可能造成Master-Slave之间的同步性能降低。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong> 2.3、数据库的水平切分。</strong>无论数据库的垂直切分还是读/写分离，对于实现数据库层的水平扩展，适用范围都比较狭窄。数据库的水平切分，通常有两种处理方式：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.一种是采用Hash算法。采用Hash算法实现更为简单，性能也高，但是扩展性略差。因为Hash算法一开始就确定，如果后面变更的话，会涉及数据的迁移。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.另一种是将对应到哪个物理数据库也作为关系表存储在集中式的租户数据库中。这种方式更为常见。在用户登录时，通过查询相应的关系表，即可以确定其对应租房的业务数据存储在具体的哪个物理数据库中。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 三种数据库层的水平扩展方案对比：</p>
<table style="border-right: #e6e6e6 1px solid; border-top: #e6e6e6 1px solid; border-left: #e6e6e6 1px solid; width: 540px; border-bottom: #e6e6e6 1px solid" cellspacing="1" cellpadding="0">
<thead>
<tr style="font-weight: bold; font-size: 14px;background: #f6f6f6; vertical-align: middle; height: 24px; text-align: center">
<td style="width: 120px">实现方式</td>
<td style="width: 200px">优点</td>
<td style="width: 220px">不足</td></tr></thead>
<tbody style="padding-right: 5px; padding-left: 5px; font-size: 12px; padding-bottom: 3px; padding-top: 3px">
<tr>
<td style="font-weight: bold">垂直切分</td>
<td>实现简单</td>
<td>扩展能力有限，强关联的应用不容易垂直切分</td></tr>
<tr>
<td style="font-weight: bold">读/写分离</td>
<td>可有效分担读的压力，主要在数据库层扩展，应用修改较小</td>
<td>对于读的比例不高的应用，扩展能力有限。依赖于数据库本身的同步能力</td></tr>
<tr>
<td style="font-weight: bold">水平切分</td>
<td>SaaS应用中普遍适用，扩展性强，基本无限扩展</td>
<td>实现比较复杂，应用一般需要做较大改造。需要预先做好负载规划，后期数据迁移比较困难</td></tr></tbody></table><img src ="http://www.blogjava.net/zhanglongsr/aggbug/352884.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglongsr/" target="_blank">zhangxl</a> 2011-06-23 16:18 <a href="http://www.blogjava.net/zhanglongsr/articles/352884.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库切分的简介与内容</title><link>http://www.blogjava.net/zhanglongsr/articles/352882.html</link><dc:creator>zhangxl</dc:creator><author>zhangxl</author><pubDate>Thu, 23 Jun 2011 08:14:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglongsr/articles/352882.html</guid><wfw:comment>http://www.blogjava.net/zhanglongsr/comments/352882.html</wfw:comment><comments>http://www.blogjava.net/zhanglongsr/articles/352882.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglongsr/comments/commentRss/352882.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglongsr/services/trackbacks/352882.html</trackback:ping><description><![CDATA[<p><span style="font-size: small"><span>摘自：<a href="http://www.open-china.net/blog/10953.html">http://www.open-china.net/blog/10953.html</a><br />1.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>什么是数据切分 </span></p>
<p style="margin-left: 18pt"><span style="font-size: small">将存放在同一个数据库中为同一个应用程序服务的数据分散存放到多个数据库上面，以达到分散单台设备负载的效果，并提高可用性。 </span></p>
<p><span style="font-size: small"><span>2.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>垂直切分 </span></p>
<p style="margin-left: 18pt"><span style="font-size: small">按照系统的模块和功能切分。需要尽早作出切分 </span></p>
<p style="margin-left: 18pt"><span style="font-size: small">优点： </span></p>
<ul><li><span style="font-size: small"><span>&nbsp; </span>切分容易 </span></li></ul>
<p><span style="font-size: small"><br /></span></p>
<ul><li><span style="font-size: small">&nbsp; 应用程序模块清晰，整合容易。 </span></li><li><span style="font-size: small">数据维护方便。 </span></li></ul>
<p><span style="font-size: small"><br /></span></p>
<p style="margin-left: 18pt"><span style="font-size: small">缺点： </span></p>
<ul><li><span style="font-size: small"><span>&nbsp; </span>模块间的数据表会有关联。 </span></li><li><span style="font-size: small">&nbsp; 数据量大的表仍有性能问题。 </span></li><li><span style="font-size: small"><span>&nbsp; </span>表关联无法在数据库级别完成，要在程序中完成。 </span></li><li><span style="font-size: small"><span>&nbsp; </span>事务处理复杂。 </span></li><li><span style="font-size: small">不能过度切分（粒度适宜） </span></li></ul>
<p><span style="font-size: small"><br /></span></p>
<p><span style="font-size: small"><span>3.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>水平切分 </span></p>
<p style="margin-left: 18pt"><span style="font-size: small">对大数据量的表按照某种规则进行散列拆分。根据社区模块、用户类型、特定字段类别等。 </span></p>
<p style="margin-left: 18pt"><span style="font-size: small">优点： </span></p>
<ul><li><span style="font-size: small">表关联基本能够在数据库端全部完成。 </span></li><li><span style="font-size: small">不会存在数据过量问题 </span></li><li><span style="font-size: small">应用程序端整体改动小 </span></li><li><span style="font-size: small">事务处理简单 </span></li><li><span style="font-size: small">扩展性限制小 </span></li></ul>
<p><span style="font-size: small"><br /></span></p>
<p style="margin-left: 18pt"><span style="font-size: small">缺点： </span></p>
<ul><li><span style="font-size: small">切分规则复杂，很难有一个全面的切分规则 </span></li><li><span style="font-size: small">后期数据的维护难度复杂，手工定位数据难 </span></li><li><span style="font-size: small">应用系统各模块耦合度高，可能会对后面数据拆分造成困难 </span></li></ul>
<p><span style="font-size: small"><br /></span></p>
<p><span style="font-size: small">&nbsp; </span></p>
<p><span style="font-size: small"><span>4.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>联合切分 </span></p>
<p style="margin-left: 18pt"><span style="font-size: small">通常先垂直切分，再对大表进行水平切分。 </span></p>
<p style="margin-left: 18pt"><span style="font-size: small">交替进行切分。 </span></p>
<p style="margin-left: 18pt"><span style="font-size: small">优点： </span></p>
<ul><li><span style="font-size: small">系统扩展性最大化 </span></li><li><span style="font-size: small">避免各自缺陷 </span></li></ul>
<p><span style="font-size: small"><br /></span></p>
<p style="margin-left: 18pt"><span style="font-size: small">缺点： </span></p>
<ul><li><span style="font-size: small">数据库系统架构复杂 </span></li><li><span style="font-size: small">应用程序架构也复杂 </span></li><li><span style="font-size: small">整合方案 </span></li></ul>
<p><span style="font-size: small"><br /></span></p>
<p style="margin-left: 18pt"><span style="font-size: small">两种解决方案： </span></p>
<p style="margin-left: 18pt"><span style="font-size: small">a ）每个应用程序模块中配置管理自己需要的一个或多个数据库，直接访问各个数据库，在模块内整合数据。 </span></p>
<p style="margin-left: 18pt"><span style="font-size: small">b) 通过中间代理层来统一管理数据源，后端数据库集群对前端应用程序透明 </span></p>
<p style="margin-left: 18pt"><span style="font-size: small">&nbsp; </span></p>
<p style="margin-left: 18pt"><span style="font-size: small">实现类别： </span></p>
<p><span style="font-size: small"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>a)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>自行开发代理层 </span></p>
<p><span style="font-size: small"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>b)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>使用数据库 </span><span style="font-size: small">Proxy </span></p>
<p style="margin-left: 42pt"><span style="font-size: small">如 MySQL 的 Proxy 。实现连接路由、 Query 分析、 Query 过滤和修改，负载均衡，以及基本的 HA 机制。 </span></p>
<p><span style="font-size: small"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>c)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>其他开源中间件 </span></p>
<p><span style="font-size: small"><span>6.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>可能的问题 </span></p>
<p><span style="font-size: small"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>分布式事务问题。 </span></p>
<p style="margin-left: 42pt"><span style="font-size: small">&#8212;&#8212;使用小事务，提高应用程序的健壮性。 </span></p>
<p><span style="font-size: small"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>b.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>跨节点 </span><span style="font-size: small">Join 问题 </span></p>
<p style="margin-left: 42pt"><span style="font-size: small">&#8212;&#8212;使用数据库 Federated （ DB Link 等） </span></p>
<p style="margin-left: 42pt"><span style="font-size: small">&#8212;&#8212;使用应用程序来处理（使用缓存等） </span></p>
<p><span style="font-size: small"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>c.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>跨节点合并排序分页问题 </span></p>
<p style="margin-left: 42pt"><span style="font-size: small">&#8212;&#8212;使用数据库 Federated </span></p>
<p style="margin-left: 42pt"><span style="font-size: small">&#8212;&#8212;应用程序 </span></p>
<p style="margin-left: 42pt"><span style="font-size: small">当 b 和 c 同时出现时，比较难处理。 </span></p> <img src ="http://www.blogjava.net/zhanglongsr/aggbug/352882.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglongsr/" target="_blank">zhangxl</a> 2011-06-23 16:14 <a href="http://www.blogjava.net/zhanglongsr/articles/352882.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL SERVER 2000 常见的链接错误</title><link>http://www.blogjava.net/zhanglongsr/articles/291750.html</link><dc:creator>zhangxl</dc:creator><author>zhangxl</author><pubDate>Wed, 19 Aug 2009 02:33:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglongsr/articles/291750.html</guid><wfw:comment>http://www.blogjava.net/zhanglongsr/comments/291750.html</wfw:comment><comments>http://www.blogjava.net/zhanglongsr/articles/291750.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglongsr/comments/commentRss/291750.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglongsr/services/trackbacks/291750.html</trackback:ping><description><![CDATA[<span style="color: #000000">在日常开发中，使用SQL SERVER 2000，有时会出现SQL SERVER 无法连接的情况，本文对无法连接的情况的排除做了汇总。<br />
<br />
一."SQL&nbsp;Server&nbsp;不存在或访问被拒绝"<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />这个是最复杂的,错误发生的原因比较多,需要检查的方面也比较多.<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />一般说来,有以下几种可能性:<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />1,SQL&nbsp;Server名称或IP地址拼写有误<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />2,服务器端网络配置有误<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />3,客户端网络配置有误<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />要解决这个问题,我们一般要遵循以下的步骤来一步步找出导致错误的原因.<br />
<br />
<strong>&nbsp;&nbsp; 首先,检查网络物理连接</strong>&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />ping&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">服务器IP</span><span style="color: #ff0000">地址/服务器名称</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />如果&nbsp;ping&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">服务器IP</span><span style="color: #ff0000">地址</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;不成功,说明物理连接有问题,这时候要检查硬件设备,如网卡,HUB,路由器等.<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />还有一种可能是由于客户端和服务器之间安装有防火墙软件造成的,比如&nbsp;ISA&nbsp;Server.防火墙软件可能会屏蔽对&nbsp;ping,telnet&nbsp;等的响应<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />因此在检查连接问题的时候,我们要先把防火墙软件暂时关闭,或者打开所有被封闭的端口.<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />如果ping&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">服务器IP</span><span style="color: #ff0000">地址</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;成功而,ping&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">服务器名称</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;失败<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />则说明名字解析有问题,这时候要检查&nbsp;DNS&nbsp;服务是否正常.<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />有时候客户端和服务器不在同一个局域网里面,这时候很可能无法直接使用服务器名称来标识该服务器,这时候我们可以使用HOSTS文件来进行名字解析,<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />具体的方法是:<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />1.使用记事本打开HOSTS文件（一般情况下位于C:\WINNT\system32\drivers\etc）.<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />添加一条IP地址与服务器名称的对应记录,如:<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />172.168.10.24&nbsp;myserver<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />2.或在&nbsp;SQL&nbsp;Server&nbsp;的客户端网络实用工具里面进行配置,后面会有详细说明.<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<strong>&nbsp;&nbsp; 其次,使用&nbsp;telnet&nbsp;命令检查SQL&nbsp;Server服务器工作状态</strong>&nbsp;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />telnet&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">服务器IP</span><span style="color: #ff0000">地址</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;1433<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />如果命令执行成功,可以看到屏幕一闪之后光标在左上角不停闪动,这说明&nbsp;SQL&nbsp;Server&nbsp;服务器工作正常,并且正在监听1433端口的&nbsp;TCP/IP&nbsp;连接<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />如果命令返回"无法打开连接"的错误信息,则说明服务器端没有启动&nbsp;SQL&nbsp;Server&nbsp;服务,<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />也可能服务器端没启用&nbsp;TCP/IP&nbsp;协议,或者服务器端没有在&nbsp;SQL&nbsp;Server&nbsp;默认的端口1433上监听.<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
&nbsp;&nbsp; <strong>接着检查服务器侦听端口<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp; netstat -an&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp; 看看1433端口是否打开侦听，如果没有要到服务器上检查服务器端的网络配置,检查是否启用了命名管道.是否启用了&nbsp;TCP/IP&nbsp;协议等等&nbsp;。<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />可以利用&nbsp;SQL&nbsp;Server&nbsp;自带的服务器网络使用工具来进行检查.<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />点击:程序&nbsp;--&nbsp;Microsoft&nbsp;SQL&nbsp;Server&nbsp;--&nbsp;服务器网络使用工具<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />打开该工具后,在"常规"中可以看到服务器启用了哪些协议.<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />一般而言,我们启用命名管道以及&nbsp;TCP/IP&nbsp;协议.<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />点中&nbsp;TCP/IP&nbsp;协议,选择"属性",我们可以来检查&nbsp;SQK&nbsp;Server&nbsp;服务默认端口的设置<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />一般而言,我们使用&nbsp;SQL&nbsp;Server&nbsp;默认的1433端口.如果选中"隐藏服务器",则意味着客户端无法通过枚举服务器来看到这台服务器,起到了保护的作用,但不影响连接.<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>接下来我们要到客户端检查客户端的网络配置<br />
</strong><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />我们同样可以利用&nbsp;SQL&nbsp;Server&nbsp;自带的客户端网络使用工具来进行检查,<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />所不同的是这次是在客户端来运行这个工具.<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />点击:程序&nbsp;--&nbsp;Microsoft&nbsp;SQL&nbsp;Server&nbsp;--&nbsp;客户端网络使用工具<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />打开该工具后,在"常规"项中,可以看到客户端启用了哪些协议.<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />一般而言,我们同样需要启用命名管道以及&nbsp;TCP/IP&nbsp;协议.<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />点击&nbsp;TCP/IP&nbsp;协议,选择"属性",可以检查客户端默认连接端口的设置,该端口必须与服务器一致.<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />单击"别名"选项卡,还可以为服务器配置别名.服务器的别名是用来连接的名称,<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />连接参数中的服务器是真正的服务器名称,两者可以相同或不同.别名的设置与使用HOSTS文件有相似之处.<br />
<br />
二."无法连接到服务器,用户xxx登陆失败"<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />该错误产生的原因是由于SQL&nbsp;Server使用了"仅&nbsp;Windows"的身份验证方式,<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />因此用户无法使用SQL&nbsp;Server的登录帐户（如&nbsp;sa&nbsp;）进行连接.解决方法如下所示:<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />1.在服务器端使用企业管理器,并且选择"使用&nbsp;Windows&nbsp;身份验证"连接上&nbsp;SQL&nbsp;Server<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />2.展开"SQL&nbsp;Server组",鼠标右键点击SQL&nbsp;Server服务器的名称,选择"属性",再选择"安全性"选项卡<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />3.在"身份验证"下,选择"SQL&nbsp;Server和&nbsp;Windows&nbsp;".<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />4.重新启动SQL&nbsp;Server服务.<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />在以上解决方法中,如果在第&nbsp;1&nbsp;步中使用"使用&nbsp;Windows&nbsp;身份验证"连接&nbsp;SQL&nbsp;Server&nbsp;失败,<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />那就通过修改注册表来解决此问题:<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />1.点击"开始"-"运行",输入regedit,回车进入注册表编辑器<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />2.依次展开注册表项,浏览到以下注册表键:<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer]<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />3.在屏幕右方找到名称"LoginMode",双击编辑双字节值<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />4.将原值从1改为2,点击"确定"<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />5.关闭注册表编辑器<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />6.重新启动SQL&nbsp;Server服务.<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />此时,用户可以成功地使用sa在企业管理器中新建SQL&nbsp;Server注册,<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />但是仍然无法使用Windows身份验证模式来连接SQL&nbsp;Server.<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />这是因为在&nbsp;SQL&nbsp;Server&nbsp;中有两个缺省的登录帐户:<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />BUILTIN\Administrators<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">机器名</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">\Administrator&nbsp;被删除.<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />要恢复这两个帐户,可以使用以下的方法:<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />1.打开企业管理器,展开服务器组,然后展开服务器<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />2.展开"安全性",右击"登录",然后单击"新建登录"<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />3.在"名称"框中,输入&nbsp;BUILTIN\Administrators<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />4.在"服务器角色"选项卡中,选择"System&nbsp;Administrators"&nbsp;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />5.点击"确定"退出<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />6.使用同样方法添加&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">机器名</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">\Administrator&nbsp;登录.<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />说明:<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />以下注册表键:<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\LoginMode<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />的值决定了SQL&nbsp;Server将采取何种身份验证模式.<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />1.表示使用"Windows&nbsp;身份验证"模式<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />2.表示使用混合模式（Windows&nbsp;身份验证和&nbsp;SQL&nbsp;Server&nbsp;身份验证）.<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />三.提示连接超时<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />如果遇到第三个错误,一般而言表示客户端已经找到了这台服务器,并且可以进行连接,<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />不过是由于连接的时间大于允许的时间而导致出错.<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />这种情况一般会发生在当用户在Internet上运行企业管理器来注册另外一台同样在Internet上的服务器,<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />并且是慢速连接时,有可能会导致以上的超时错误.有些情况下,由于局域网的网络问题,也会导致这样的错误.<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />要解决这样的错误,可以修改客户端的连接超时设置.<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />默认情况下,通过企业管理器注册另外一台SQL&nbsp;Server的超时设置是&nbsp;4&nbsp;秒,<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />而查询分析器是&nbsp;15&nbsp;秒（这也是为什么在企业管理器里发生错误的可能性比较大的原因）.<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />具体步骤为:<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />企业管理器中的设置:<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />1.在企业管理器中,选择菜单上的"工具",再选择"选项"<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />2.在弹出的"SQL&nbsp;Server企业管理器属性"窗口中,点击"高级"选项卡<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />3.在"连接设置"下的"登录超时（秒）"右边的框中输入一个比较大的数字,如&nbsp;20.<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />查询分析器中的设置:<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />工具&nbsp;--&nbsp;选项&nbsp;--&nbsp;连接&nbsp;--&nbsp;将登录超时设置为一个较大的数字<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />四.大部分机都用Tcp/ip才能成功，有次我发现用Named&nbsp;Pipes才可以？<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />这是因为在WINDOWS&nbsp;2000以后的操作系统中，MS为解决SQL&nbsp;SERVER的安全问题将TCP/IP配置<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />为SQLSERVER的默认连接协议，你可以在CLIENT&nbsp;NETWORK&nbsp;UTILITY中看到TCP/IP和NAME&nbsp;PIPE<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />的顺序。<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />你也可以在：<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SuperSocketNetLib]<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />"ProtocolOrder"=hex(7):74,00,63,00,70,00,00,00,00,00<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />看到默认的协议。<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />2.怎么在程序中更改Named&nbsp;Pipes&nbsp;，&nbsp;Tcp/ip&nbsp;，其sql语句怎么写？<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />你可以在上面提到的注册表的位置修改：<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />CLIENT端：<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SuperSocketNetLib]<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />"ProtocolOrder"=hex(7):74,00,63,00,70,00,00,00,00,00<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />SERVER端：<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\SuperSocketNetLib]<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />"ProtocolOrder"=hex(7):74,00,63,00,70,00,00,00,00,00</span><br />
<br />
</span>
<img src ="http://www.blogjava.net/zhanglongsr/aggbug/291750.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglongsr/" target="_blank">zhangxl</a> 2009-08-19 10:33 <a href="http://www.blogjava.net/zhanglongsr/articles/291750.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>