使用SQL 2016企业版
默认实例将侦听1433,DAC端口将侦听TCP 1434。SQL浏览器将监听UDP 1434。任何后续命名实例都将从49152到65535范围内的窗口获得动态分配端口,其DAC端口也是如此。对那些命名实例的连接请求(包括DAC)将调用SQL浏览器并告知端口号。
可以使用Server配置工具将命名实例的端口更改为静态端口号,但没有选项将DAC端口设置为静态端口号。
当我向网络团队建议,我希望为远程DAC连接开放整个端口范围时,他们并不那么热情。
是否有任何方法将DAC端口设置为命名实例的已知静态端口号?
发布于 2018-05-10 14:57:00
摘自微软支持站点:
若要为专用管理员连接(DAC)配置静态端口,必须更新与实例对应的注册表项。例如,注册表项可能是: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.X\MSSQLServer\SuperSocketNetLib\AdminConnection\Tcp注"MSSQL.X“中的"X”是一个数字,指示安装Server 2005实例的目录或Server 2008的实例名称。
将TcpDynamicPorts条目更新为您希望使用的端口号。
尽管本文讨论的是Server 2008,但这适用于2005年及以上所有基于Windows的版本。Linux上的SQL Server使用了另一种机制,我还没有意识到这种机制。
要使更改生效,需要停止并启动Server实例。重新启动实例后,检查错误日志以获得以下消息,指示Server专用管理连接使用的是哪个端口:
为远程监听xxxx端口建立了专用的管理连接支持。
我使用此脚本配置远程DAC端口:
/*
Reads the instance's registry settings (via xp_instance_regread
as opposed to xp_regread), to determine if the Dedicated
Aministrator Connection is configured to use the desired TCP
port number.
2022-11-29 Hannah Vernon
*/
SET NOCOUNT ON;
SET XACT_ABORT ON;
DECLARE @desired_dac_port varchar(11) = '1432';
IF NOT EXISTS
(
SELECT
1
FROM
[sys].[configurations] sc
WHERE
sc.[name] = N'show advanced options'
AND sc.[value] = 1
)
BEGIN
PRINT N'Enabling "Show Advanced Options" configuration.';
EXEC sys.sp_configure
@configname = 'show advanced options'
, @configvalue = 1;
RECONFIGURE;
END;
IF NOT EXISTS
(
SELECT
1
FROM
[sys].[configurations] sc
WHERE
sc.[name] = N'remote admin connections'
AND sc.[value] = 1
)
BEGIN
PRINT N'Enabling Remote Dedicated Admin Connections.';
EXEC sys.sp_configure
@configname = 'remote admin connections'
, @configvalue = 1;
RECONFIGURE;
END
ELSE
BEGIN
PRINT N'Remote Dedicated Admin Connections are already enabled.';
END;
DROP TABLE IF EXISTS #dac_port;
CREATE TABLE #dac_port
(
[value] nvarchar(128) NOT NULL
, [data] varchar(255) NULL
);
INSERT INTO #dac_port
(
[value]
, [data]
)
EXEC sys.xp_instance_regread
@rootkey = N'HKEY_LOCAL_MACHINE'
, @key = N'SOFTWARE\Microsoft\Microsoft SQL Server\MSSQLServer\SuperSocketNetLib\AdminConnection\Tcp'
, @value = N'TcpDynamicPorts';
IF NOT EXISTS
(
SELECT *
FROM #dac_port dp
WHERE dp.[value] = N'TcpDynamicPorts'
AND dp.[data] = @desired_dac_port
)
BEGIN
PRINT N'Setting Dedicated Admin Connection to use port ' + @desired_dac_port;
EXEC sys.xp_instance_regwrite
@rootkey = N'HKEY_LOCAL_MACHINE'
, @key = N'SOFTWARE\Microsoft\Microsoft SQL Server\MSSQLServer\SuperSocketNetLib\AdminConnection\Tcp'
, @value_name = N'TcpDynamicPorts'
, @type = N'REG_SZ'
, @value = @desired_dac_port;
END
ELSE
BEGIN
PRINT N'The dedicated admin connection is already configured on port ' + @desired_dac_port;
END;https://dba.stackexchange.com/questions/206367
复制相似问题