怎样远程连接SQL Server2000数据库
首先,需要打SP4补丁,该补丁包含了以前sp1、2、3的补丁,安装此补丁后一般要重新启动计算机,再进行远程连接就可以了,如再企业管理器可远程注册服务器、查询分析可连接远程服务器、ODBC可连接远程服务器。
要点:
1确认服务器端SQL服务端口号是否为:1433
2如果不是1433,配置客户端
3建立服务器端登录帐号,确保角色及管理数据库
一、查看服务器端情况
1 看ping 服务器IP能否ping通。
这个实际上是看和远程sql server 服务器的物理连接是否存在。如果不行,请检查网络,查看配置,当然得确保远程sql server 服务器的IP拼写正确。
2 在Dos或命令行下输入telnet 服务器IP 端口,看能否连通。
如telnet 202114100100 1433
通常端口值是1433,因为1433是sql server 的对于Tcp/IP的默认侦听端口。如果有问题,通常这一步会出问题。通常的提示是“……无法打开连接,连接失败"。
如果这一步有问题,应该检查以下选项。
1) 检查远程服务器是否启动了sql server 服务。如果没有,则启动。
2) 检查sql server服务器端有没启用Tcp/IP协议,因为远程连接(通过因特网)需要靠这个协议。检查方法是,在服务器上打开 开始菜单->程序->Microsoft SQL Server->服务器网络实用工具,看启用的协议里是否有tcp/ip协议,如果没有,则启用它。
3) 检查服务器的tcp/ip端口是否配置为1433端口。仍然在服务器网络实用工具里查看启用协议里面的tcp/ip的属性,确保默认端口为1433,并且隐藏服务器复选框没有勾上。
事实上,如果默认端口被修改,也是可以的,但是在客户端做telnet测试时,写服务器端口号时必须与服务器配置的端口号保持一致。如果隐藏sql server服务器复选框被勾选,则意味着客户端无法通过枚举服务器来看到这台服务器,起到了保护的作用,但不影响连接,但是Tcp/ip协议的默认端口将被隐式修改为2433,在客户端连接时必须作相应的改变(具体方式见 二:设置客户端网络实用工具)。
4) 如果服务器端操作系统打过sp2补丁,则要对windows防火墙作一定的配置,要对它开放1433端口,通常在测试时可以直接关掉windows防火墙(其他的防火墙也关掉最好)。
(4、5步可能没有做就成功了)
5) 检查服务器是否在1433端口侦听。如果sql server服务器没有在tcp连接的1433端口侦听,则是连接不上的。检查方法是在服务器的dos或命令行下面输入
netstat -a -n 或者是netstat -an,在结果列表里看是否有类似 tcp 127001 1433 listening 的项。如果没有,则通常需要给sql server 2000打上至少sp3的补丁。其实在服务器端启动查询分析器,输入select @@version 执行后可以看到版本号,版本号在802039以下的都需要打补丁。
如果以上都没问题,这时你再做telnet 服务器ip 1433 测试,将会看到屏幕一闪之后光标在左上角不停闪动。恭喜你,你马上可以开始在企业管理器或查询分析器连接了。
注释:在连接本地服务器时,通常使用的是命名管道协议(在服务器网络实用工具里可以看到启用的协议有这个),默认端口是445,因此在本地能连通是不能说明什么问题的,连接远程服务器是完全不同的协议)
二、检查客户端设置
1、设置客户端网络实用工具
点击“开始”-“程序”,在“Microsoft SQL Server”菜单中选择“客户端网络实用工具”。
像在服务器网络实用工具里一样,确保客户端tcp/ip协议启用,并且默认端口为1433(或其他端口,与服务器端保持一致就行)。
2、在“别名”选项中点击“添加”。
在“服务器别名”中,填入您网站域名,在“网络库”区域中点击“TCP/IP”,在“连接参数”区域取消“动态决定端口”,指定“端口号”为2433。填写完毕后,点击“确定”按钮保存配置。
SQL Server 2000默认开放TCP 1433和UDP 1434端口。
三、在企业管理器或查询分析器里连接测试
企业管理器->右键SQlserver组->新建sqlserver注册->下一步->写入远程IP->下一步->选Sqlserver登陆->下一步->写入登陆名与密码(sa,password)->下一步->下一步->完成
查询分析器->文件->连接->写入远程IP->写入登录名和密码(sa,password)->确定
通常建议在查询分析器里做,因为默认情况下,通过企业管理器注册另外一台SQL Server的超时设置是4秒,而查询分析器是15秒。
1企业管理器的使用
点击“开始”-“程序”,在“Microsoft SQL Server”菜单中打开“企业管理器”。在企业管理器中,右键单击“SQL Server组”,选择“新建SQL Server注册”。
此时会出现SQL Server属性窗口,在“服务器”中填入网站的域名或IP,选择“使用SQL Server身份验证”,“登录名”和“密码”
连接成功后,你会看到“SQL Server组”中多了一个名称为您网站域名的服务器。此时,您就可以像操作本地SQL数据库一样管理网站数据库了。
注意事项
1新建登录帐号时,确认服务器的角色(System Administrors)和数据库访问(勾选要远程管理的数据库)
操作步骤:
SQLServer组->本地连接->安全性->登录->新建登录->设置名称及SQLServer登录的密码->设置服务器角色(一般为System Administrors)->设置数据库访问->OK (这里有sa帐户,可以修改其密码)
2如果连接的时候出现超时错误,更改超时时间即可,方法是点击“工具”-“选项”。
在属性窗口中选择“高级”选项卡,将“登录超时”的数值设置为0。
SQL Server所谓的分布式查询(Distributed Query)是能够访问存放在同一部计算机或不同计算机上的SQL Server或不同种类的数据源, 从概念上来说分布式查询与普通查询区别 它需要连接多个MSSQL服务器也就是具有多了数据源。实现在服务器跨域或跨服务器访问。 而这些查询是否被使用完全看使用的需要。
本篇将演示利用SQL ServerExpress链接远程SQL Server来获取数据方式来详细说明分布式查询需要注意细节。先看一下系统架构数据查询基本处理:
当然如果采用了分布式查询 我们系统采取数据DataBase也就可能在多个远程[Remote Server]上访问时:
如上截取系统架构中关于数据与缓存流向中涉及的分布式查询业务, 当我们从客户端Client发起请求数据时。 首先检查MemCache Server缓存服务器是否有我们想要数据。 如果没有我需要查询数据库。 而此时数据要求查询多个远程服务器上多个数据库中表, 这时利用分布式查询。获得数据 然后更新我们在缓存服务器MemCache Server上数据保持数据更新同步, 同时向客户端Client直接返回数据。那如何来执行这一系列动作中最为关键分布式查询?
《1》分布式查询方式
我们知道Microsoft微软公用的数据访问的API是OLE_DB, 而对数据库MSSQL Server 2005的分布式查询支持也是OLE_DB方式SQL Server 用户可以使用分布式查询访问以下内容:
A:存储在多个 SQL Server 实例中的分布式数据
B:存储在各种可以使用 OLE DB 访问接口访问的关系和非关系数据源中的异类数据
OLE DB 访问接口将在称为行集的表格格式对象中公开数据。SQL Server 允许在 Transact-SQL 语句中像引用 SQL Server 表一样引用
OLE DB 访问接口中的行集,[其实不用关心这个行集概念 它的功能类似SQL Server中临时表 不过它容积更大 能容纳类型更多 更丰富]
SQL Server 实例的客户机与 OLE DB 访问接口之间的连接
从上图可以看出。客户端借助OLEDB接口可以访问Oracle/MS Jet/MS SQL/ODBC/第三方等这些丰富数据源来我们分布式查询提供数据。 说了这么多关于OLEDB底层支持。 关于在MS SQL 2005中则支持两种方式来进行分布式查询:
使用添加链接服务器方式(Add Link Server)
使用特定名称及特定数据源来直接指定(Add Host Names)
其实这两种方式在实际运用中是有区别的:
方式A:Add Link Server方式建立服务器之间关联。创建一个链接的服务器,使其允许对分布式的、针对 OLE DB 数据源的异类查询进行访问。 一般适用于持久的数据操作 对于数据量偏大 服务器之间交付时间长特点。
方式B: Add Host Name 利用域来唯一识别数据库以及数据库表对象。 来实现跨服务器访问。 这种方式一般比较简单 主要适用于对数据需求临时性查询是使用偏多。 不适合做大批量数据提取。 有性能瓶颈。
《2》分布式查询实现
在进行实现分布式查询之前。本次测试Demo对应的SQL版本:
确定SQL Server版本后如下会演示两种方式来实现分布式查询,并对Distributed Query中详细细节进行说明。
《21》链接服务器查询
链接服务器配置使 SQL Server 可以对远程服务器上的 OLE DB 数据源执行命令。链接服务器具有以下优点:
访问远程服务器。
能够对企业内的异类数据源发出分布式查询、更新、命令和事务。
能够以相似的方式确定不同的数据源
下图显示了链接服务器配置的基础:
现在利用链接服务器方式实现数据访问远程服务器数据库CustomerDB中Users表数据先本地添加LinkServer:
以下是代码片段:
-- 建立连接服务器 第一步建立连接 IP方式来控制
EXEC sp_addlinkedserver '19216810104' , 'SQL Server'
-- 查看链接服务器信息 [测试连接成功]
select name , product, provider, data_source, query_timeout, lazy_schema_validation, is_remote_login_enabled, is_rpc_out_enabled
from sysservers
where is_linked= 1
如上市建立连接服务器最简单方式。建立链接服务器过程其实调用了系统存储过程Sp_addlinkedserver 第一个参数为Name 其实用来唯一标识链接服务器。 当然可以其他任何有意义字符串来定义,但我个人建议使用远程服务器的IP来标识。第二个参数是要添加为链接服务器的 OLE DB 数据源的产品名称。 默认为Null,如果指定”SQL Server“则无需指定其他参数。
如果你的本地装有多个数据库实例。 第一个种方式就不适用。这是就需要用SQL Server2005架构来唯一标识:
-- 含架构名 查询数据两种模式
select top 10 from [19216810104] wl 架构名 表名
-- 架构名 [采用默认架构名 ]
select top 10 from [19216810104] CustomerDB dbo Users
对于SQL Server 2005架构这个概念很多人比较陌生:
在用户角色设置中需要对指定访问数据CustomerDB具有读写权限:
#p#副标题#e#
在远程服务器创建TEst用户时使用SQL Server身份验证方式登录 这时设置密码为RemoteDB在使用非Sa用户进行远程:
以下是代码片段:
-- 执行前先删除已经存在数据
Exec sp_droplinkedsrvlogin [1921681076],Null
Exec sp_dropserver 'demodb'
-- 创建服务器连接
EXEC sp_addlinkedserver
@server='demodb',-- 被访问的服务器别名
@srvproduct='',
@provider='SQLOLEDB',
@datasrc='1921681076' -- 要访问的服务器
EXEC sp_addlinkedsrvlogin
'demodb', -- 被访问的服务器别名
'false',
NULL,
'Test', -- 帐号
'RemoteDB' -- 密码
如上我们首先清除已经可能创建服务器数据记录 然后创建服务器连接sp_addlinkedSrvlogin系统存储过程用来创建链接服务器上远程登录之间的映射 即我们可以详细设置本地与远程服务器详细的映射信息 例如设置我们特定用户访问的用户名和密码
查询数据
-- 查询指定用户Test数据 select from [demodb]CustomerDBdboUsers -- [如上测试成功]
查询结果
指定用户Test对CustomerDB访问数据方式测试成功。
当测试完成后我们不需要这个连接服务器是即可利用SP_DroplinkServer删除掉。 对应参数为创建时Name唯一标识。 通过Sp_helpserver来查看连接服务器详细信息。
注意如上创建连接服务器时设置srvproduct参数即OLED数据源名称时我们采用了SQlServer方式。
下面说明这种方式特点。:
这种方式是最为简单直接的一种建立链接服务器方式。 但是存在前提的。 测试发现:
在所有数据库的远程连接 dbo 的方式必须建立在SA 密码相同的基础上 ,否则容易产生无法连接的情况 Sa用户登录失败。 你也就明白这个SQlServer参数其实就是在本地数据拷贝服务器角色SysAdmin下用户SA来对服务器进行登录。 如果你的本地Sa密码与远程服务器上密码不一致 则无法正常连接。
经过测试还发现一种情况:
利用Windows7访问XP(Sp2)系统时始终提示无法解析或拒绝连接SQL Server2005这个问题我整了好久后来才到官方链接参数中发现。:如果你的XP系统没有打上SP4的补丁包 这个问题会始终出现。 需要特别注意。
《22》直接指定数据源分布式查询
其实相对第一种方式, 直接指定方式在SQL Server架构中 其实跳过本地与远程服务器建立映射关系的这一步。 通过链接关系建立 其实就是建立一种内部映射关系。 如果没有映射关系则 大部分设置需要手动控制。
直接指定数据源方式 需要开启分布式查询的基本权限 来进行查询:
以下是代码片段:
-- 如果想使用分布式查询,必须先开通分布式查询 [外围配置 这点是所有查询操作前提]
-- sp_configure--显示或更改当前服务器的全局配置设置
-- reconfigure 指定如果配置设置不需要服务器停止并重新启动,则更新当前运行的值
-- SQL2005默认是没有开启’Ad Hoc Distributed Queries’ 组件
-- 启用权限
exec sp_configure 'show advanced options',1 -- 显示高级配置
reconfigure -- 更新值
exec sp_configure 'Ad Hoc Distributed Queries',1 -- 启用分布式查询
reconfigure
go
-- 关闭分布式查询
exec sp_configure 'Ad Hoc Distributed Queries',0
reconfigure
exec sp_configure 'show advanced options',0
reconfigure
go
-- 开启权限后 另外一种查询方式
-- 查询格式
SELECT FROM OPENDATASOURCE('SQLOLEDB',
'Data Source=远程ip;User ID=sa;Password=密码')库名dbo表名
WHERE 条件
-- 需要开启权限
-- 开启权限 提示[远程的SqlServer不允许远程连接]
select from OPENDATASOURCE('SQLOLEDB','Data Source=1921681067; User
如上我们首先清除已经可能创建服务器数据记录 然后创建服务器连接sp_addlinkedSrvlogin系统存储过程用来创建链接服务器上远程登录之间的映射 即我们可以详细设置本地与远程服务器详细的映射信息 例如设置我们特定用户访问的用户名和密码
查询数据
-- 查询指定用户Test数据 select from [demodb]CustomerDBdboUsers -- [如上测试成功]
查询结果
指定用户Test对CustomerDB访问数据方式测试成功。
《3》问题排查与更多查询方式
当我们在实际编程中进行访问远程数据时 因为不同操作环境会引发各种各样的异常,如下我会提出一种常见的异常方式解决办法和关于远程数据操作更多查询方式。
《31》无法建立远程连接
其实这个问题在做分布式查询时极其常见。 而引起这个问题的因素过多。 我们一时无法判断真正引发这个异常地方。 只能通过逐个排查方式来进行设置:
例如我们在建立关联关系后 进行查询时会遇到:
提示是: 在进行远程连接时超时, 引起这个问题原因可能是远程服务器积极拒绝访问!
首先要在SQL Server Configuation Manager中保证你服务已经运行 且是开机自动运行。
再次检查SQL Server 2005外围配置DataBaseEngine允许远程连接:
设置完成后。我们还需要设置SQL Server Analysis Services分析服务也支持远程数据查询:
在远程服务器上如果启用了防火墙则可能对目前SQL Server Server方位实例进行拦截。 所以在服务器端启用防火墙情况下要为SQL Server DAtaBase创建例外。防止客户端请求被拦截。
《32》进程被其他用户占用
当我们在远程分布式查询中有创建动作或是类似创建一个新的数据库。 有时会提示 “该数据库无法操作 已经别其他进程占用”异常。 导致我们无法访问数据库。 或是执行我们要做的创建操作
遇到这种情况我们可以利用SA权限查询到Master数据库对应数据库被占用的进程 并杀掉Kill Process查询:
以下是代码片段:
-- [sysprocesses 表中保存关于运行在 Microsoft SQL Server 上的进程的信息。
-- 这些进程可以是客户端进程或系统进程。sysprocesses 只存储在 master 数据库中]
use Master
go
SELECT FROM sysprocesses ,sysdatabases
WHERE sysprocessesdbid=sysdatabasesdbid AND sysdatabasesName='CustomerDB'
select from sysprocesses
select from sysdatabases
-- 杀死占用进程
kill 5
当我们对进程占用清除时有可能访问数据库被系统进程占用。 则这时用Sa无法杀死。这时提示:
“Only use Process can be Kill ”在SQL Server2005 只有只有用户进程才能Kill掉。
《33》更多的查询操作
往往我们在实际操作中需要对数据读写有更多要求。 例如从远程连接多个服务器进行数据读取或是把本地数据提交到服务器上。 为了提高效率和性能采用分布式事务来进行批量操作等等。 如下简单介绍在分布式查询中多中数据操作:
把远程数据导入本地:
以下是代码片段:
-- 把本地表导入远程表 [openWset方式]
insert openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名dbo表名) select from 本地表
-- 把本地表导入远程表 [open Query方式]
insert openquery(ITSV, 'SELECT FROM 数据库dbo表名 ')
导入时使用Into方式 自动在本地创建CopyDB表完全复制远程服务器上Users表的数据结构。但是要注意在进行后 的CopyDB将不包含原表的主键和索引约束。 虽然能快构建 但是主键和索引设置都会丢失。
本地数据导入远程:
-- 把本地表导入远程表 [openWset方式] insert openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名dbo表名) select from 本地表 -- 把本地表导入远程表 [open Query方式] insert openquery(ITSV, 'SELECT FROM 数据库dbo表名 ')
更新本地表数据:
以下是代码片段:
-- 把本地表导入远程表 [opendataSource方式]
insert opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ')数据库dbo表名
-- 更新本地表 [openowset方式]
update b set b列A=a列A from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名dbo表名)
as a inner join 本地表 b on acolumn1=bcolumn1
当然还有更多方式来操作分布式查询操作。各位都可以尝试。
《4》尾 语
如上是我最近在项目中处理关于分布式查询涉及到方方面面。 从系统架构到分部是查询具体操作细节。基本都是一些非常基础运用。当然也参考不少资料。以及动手来验证整个过程出现问题原因所在。 篇幅有限 写的有些仓促。 难免有纰漏地方 还望各位指正。
#p#副标题#e#
0条评论