从头学SQL Server2005之一:数据库引擎体系结构
从头学SQL Server2005之一:数据库引擎体系结构
用SQL Server这么多年,问自己SQL Server掌握的怎么样?想来想去,好像除了编程经常使用到的常用SQL语句和存储过程什么的,好像其他的就没什么了。真是惭愧啊,所以决定从头学一学SQL Server,下面就开始我的从头学SQL Server2005之旅。
SQL Server2005的数据库引擎主要由四部分组成:协议(Protocols)、关系引擎(也叫查询处理器)、存储引擎(storage engine)、SQLOS.
1 协议层(Protocols)
协议层是SQL Server与外部程序的接口,由一系列的网络库(Net-Libraries)组成.在客户端网络库是SQL Native Client的一部分。对SQL Server的所有调用都封装成表格格式数据流TDS包(Tabular data stream),TDS是一个应用层协议,在1984年由Sybase公司为其关系数据库开发,后来由微软继续开发用于SQL Server中。TDS数据包可以被封装在标准的传输协议(象TCP/IP,命名管道)中。通讯时具体使用什么协议依赖于客户端和SQL Server实例的配置。
SQL Server可以配置成同时支持多个协议,目前SQL Server支持的协议有:
共享内存(Shared Memory):这是一种不需要任何配置设置的最简单的协议。只有运
行在和SQL Server实例同一台计算机上的客户端才能使用共享内存协议进行通讯。因此对于大多数数据库活动而言,这协议没有什么用处。一般在当你怀疑其他协议配置不正确进行查找并修理故障时使用它。使用MDAC2.8或更早的客户端不能使用此协议,如果在这种情况下试图使用此协议将切换成使用命名管道协议。
命名管道(Named Pipes):这个协议主要是为局域网开发的
TCP/IP::这是在因特网上使用最广泛的一种协议。
虚拟接口适配器Virtual Interface Adapter(VIA)::这是一个配合VIA硬件使用的特殊
协议,具体配置由硬件提供商提供。
1.1 TDS端点(Tabular Data Stream Endpoints)
TDS端点是SQL Server给外界的入口点,其实说白了就是SQL Server的侦听端点,在SQL Server的安装过程中将分别为上面四个协议各创建一个TDS端点,默认情况下如果协议状态为启用时,所有用户都可以访问他们。如果没有启用网络协议,这该协议对应的端点仍然存在但不可用。管理员专用连接端点只能被sysadmin角色的成员使用专用管理员连接DAC使用。SQL Server为每一个TDS端点生成一个唯一名称:
共享内存:TSQL LocalMachine
命名管道:TSQL Named Pipes
TCP/IP: TSQL Default TCP
VIA: TSQL Default VIA
DAC: Dedicated Admin Connection
HTTP: HyperText Transport Protocol
对于命名管道和共享内存,每个SQL Server实例只能有一个端点,没有用户可配置的端点。但对于TCP/IP和VIA有默认端点,但可以创建额外的端点。HTTP没有默认端点但用户可以创建的。利用Create Endpoint语句进行创建,你可以通过select * from sys.endpoints来查看。
只可以通过Alter Endpoint来更改系统创建的端点的所有者和状态,但不能禁用这些缺省的端点。也就是说你可以停止或启动缺省的端点,停止的端点仍在侦听但拒绝并关闭新的连接。注意:缺省情况下,客户端将顺序尝试所有协议,直到其中一个协议运行。如果禁用TCP/IP协议,客户端将继续尝试下一个协议;但如果启用了TCP/IP协议,但停止了对应的TDS端点,那么客户端虽然不能建立连接,但也不会尝试下一个协议。针对这种情况,必须显式连接到活动的端点。
1.2 SQL Network Interface, error:26-Error Locating Server/Instance Specified连接问题处理
一般你只有在试图连接到SQL Server命名实例(非缺省实例)时才会得到这个错误消息。但对于缺省实例你却不会得到这个错误消息,这是为什么呢?原因主要是对于缺省实例来说,即使在不能定位指定的服务或实例阶段失败的话,SQL Native Client会继续使用缺省值(例如缺省的TCP端口1433,缺省的管道名等)尝试再次连接,你可能看到因为后面的失败的其他错误消息,而不是这个错误消息。
每一次客户端连接SQL Server命名实例时,都是先给服务器的1434端口发送一个SSRP的UDP数据包。客户端需要使用这一步来知道SQL Server的一些配置信息例如启用的协议、TCP的端口、管道名等。如果没有这一步,客户端将不知道如何连接到服务器,并且将弹出这个错误信息。也就是说,得到这个错误消息的原因是客户端不能从服务器的SQL Browser服务那接收到SSRP UDP包的相应。你可以尝试使用下列步骤来解决这个问题:
1) 确保你的服务器名称正确,看有没有拼写输入错误。
2) 确保你的SQL Server实例名正确,有时候有些程序会将”""”转换为“"”,所以请尝试Server"Instance和Server""Instance两种格式。
3) 确保服务器是可到达的,例如DNS能否正确解析
4) 确保在服务器上运行了SQL Browser服务,例如服务没有被disable或停止。
5) 如果服务器上开启了防火墙,你需要将SQL browser.exe增加到例外中,或者开启UDP 1434端口。
6) 一般上面的步骤之后,你将看不到这个错误消息了,如果还是失败,你可能需要尝试使用tcp:server"instance或np:server"instance来看时候成功。
1.3 管理员专有连接
前面已经提到系统在安装时自动创建了一个DAC的TDS端点,这就是管理员专用连接的入口点。这个在SQL Server 2000中是没有的,是SQL Server2005中新提供的,用于发现和诊断出现问题的系统的原因的特殊连接。
连接DAC的方式有两种:
1 可以通过SQLCMD命令行工具加上/A选项
2 使用SQL Server Management Studio时,在要连接的服务器前面加上ADMIN:。例如
连接ZXG机器的缺省实例时,使用ADMIN:ZXG
推荐使用第一种方式,因为这种方式占用的系统资源比图形化的工具少。
注意:DAC不是常规用户连接,主要是用于诊断和解决问题而设计的,所以在使用DAC时请记住以下条件:
Ø 缺省情况下DAC只能通过本地进行连接。当然你可以配置SQL Server允许远程连接到DAC。
Ø 只有SYSADMIN角色的成员才可以使用此连接。
Ø 有些语句不能在DAC连接上执行,如BACKUP或者Restore等。同时也建议你不要运行比较耗费资源的查询,避免服务器问题恶化。最好只运行针对动态管理对象的查询用于发现服务器的问题所在。
Ø 在一个单独的调度器上运行一个专有的线程用于DAC来执行诊断。这个线程不能终止,你只能终止DAC的会话。DAC调度器的scheduler_id总是255,并且这个线程有最高的优先级,对于DAC来说没有lazywriter线程。但是DAC有它自己的IOCP(I/O Complete Port:IO完成端口).,一个工作线程和一个空闲线程。
SQL Server 2005 Express不支持DAC连接,除非你通过7806的跟踪标志启动。