了解数据库镜像连接问题
数据库镜像是确保 SQL Server 环境中高可用性和冗余的重要策略。但是,配置镜像有时会导致令人沮丧的错误,例如错误 1418,该错误表明服务器网络地址无法访问或不存在。
当尝试在两个 SQL Server 实例之间设置镜像会话时,即使两个数据库都可以单独访问,也经常会发生此特定错误。当镜像端点无法相互通信时就会出现问题。
在本例中,镜像过程涉及本地桌面 (192.168.0.80) 和迷你 PC (192.168.0.85)。迷你 PC 旨在用作移动应用程序的只读副本,使用“高性能”镜像模式。
尽管端口配置和防火墙调整正确,但用户在尝试启动镜像会话时仍会遇到错误 1418。本文将探讨解决此问题的潜在原因和解决方案。
命令 | 使用示例 |
---|---|
ALTER ENDPOINT | 此命令用于修改 SQL Server 中数据库镜像端点的状态。在解决错误 1418 的上下文中,它确保端点正确启动并侦听指定端口。示例:ALTER ENDPOINT [镜像] STATE = STARTED; |
GRANT CONNECT ON ENDPOINT | 允许特定登录连接到镜像端点。这对于允许 SQL Server 实例在数据库镜像期间安全通信至关重要。示例: GRANT CONNECT ON ENDPOINT::[Mirroring_Endpoint] TO [DOMAINUserAccount]; |
SET PARTNER | 将一个 SQL Server 实例配置为数据库镜像会话中的伙伴。此命令建立伙伴服务器的网络地址。示例: ALTER DATABASE YourDatabaseName SET PARTNER = 'TCP://192.168.0.85:5022'; |
CREATE ENDPOINT | 创建一个监听特定端口并管理数据库镜像会话的镜像端点。它指定通信角色(例如,合作伙伴)。示例:CREATE ENDPOINT [Mirroring_Endpoint] AS TCP (LISTENER_PORT = 5022) FOR DATABASE_MIRRORING (ROLE = PARTNER); |
netsh advfirewall firewall add rule | 用于配置防火墙规则以允许流量通过 SQL Server 和镜像所需的特定端口(例如 1433 和 5022)。这对于实现镜像合作伙伴之间的通信至关重要。示例:netsh advfirewall 防火墙添加规则名称=“SQLPort”dir=in action=allow protocol=TCP localport=1433 |
socket.create_connection | 用于建立到指定服务器和端口的 TCP 连接的 Python 命令。在这种情况下,它用于检查 SQL Server 实例是否可以通过网络访问。示例:socket.create_connection((服务器,端口),超时=5); |
New-Object System.Net.Sockets.TcpClient | 用于创建 TCP 客户端以测试端口连接的 PowerShell 命令。它有助于验证服务器之间必要的镜像端口是否打开且可访问。示例: $tcpClient = New-Object System.Net.Sockets.TcpClient($server, $port) |
SELECT * FROM sys.database_mirroring | 此 SQL 命令检索数据库镜像会话的状态,帮助诊断镜像设置是否已正确建立或是否面临问题。示例: SELECT * FROM sys.database_mirroring; |
镜像错误解决脚本的详细分解
前面的示例中提供的第一个脚本使用 事务 SQL (T-SQL) 用于配置和解决 SQL Server 中的镜像错误的命令。脚本中最关键的部分是创建和配置 镜像端点。这些端点是网络接口,SQL Server 实例在镜像期间通过它们进行通信。命令 改变端点 确保两台服务器上的端点均处于“已启动”状态,从而允许进行通信。这 设定合作伙伴 然后使用命令链接数据库,指定合作伙伴服务器的网络地址,这允许两个 SQL 实例通过网络镜像数据。
第二个脚本是一个 PowerShell 解决方案,旨在测试两台服务器之间的网络连接。 PowerShell 使用 新对象 System.Net.Sockets.TcpClient 命令创建尝试连接到指定 IP 地址和端口的 TCP 客户端。这是验证所需端口(对于 SQL Server 为 1433,对于镜像为 5022)是否打开且可访问的有效方法。此脚本对于诊断防火墙或网络问题特别有用,这些问题可能会阻止两个 SQL 实例通信,从而导致 错误1418。
第三个脚本利用 Windows 命令提示符命令来管理防火墙设置。具体来说, netsh advfirewall 防火墙添加规则 命令用于打开 SQL Server 和镜像所需的端口。这样可以确保数据库流量(端口 1433)和镜像流量(端口 5022)都可以在两台服务器之间自由流动。通过暂时禁用防火墙 netsh advfirewall 将所有配置文件状态设置为关闭 命令,该脚本可以验证防火墙是否是网络访问问题的根本原因。在安全环境中排除服务器通信问题时,此解决方案尤其重要。
最后,Python 脚本使用 套接字.create_connection 功能在两个服务器之间执行网络检查。此脚本提供了一种快速有效的方法来验证服务器是否可以通过所需的 TCP 端口相互访问。它尝试建立连接,如果成功,则确认网络设置正确。 Python 在处理网络相关问题方面的简单性使其成为测试连接性的不错选择,特别是在其他工具不可用或使用起来很麻烦的环境中。这些脚本共同提供了一种全面的方法来解决 数据库镜像 错误并确保 SQL Server 实例之间的顺利通信。
解决方案 1:修复 SQL Server 数据库镜像中的错误 1418(T-SQL 方法)
该解决方案使用 Transact-SQL (T-SQL) 通过配置端点、验证连接和验证服务器地址来解决数据库镜像问题。
-- Enable server to listen on the specified ports
ALTER ENDPOINT [Mirroring]
STATE = STARTED;
GO
-- Ensure both databases are in FULL recovery mode
ALTER DATABASE YourDatabaseName
SET RECOVERY FULL;
GO
-- Create mirroring endpoints on both servers
CREATE ENDPOINT [Mirroring_Endpoint]
STATE = STARTED
AS TCP (LISTENER_PORT = 5022)
FOR DATABASE_MIRRORING (ROLE = PARTNER);
GO
-- Grant CONNECT permissions to the login account
GRANT CONNECT ON ENDPOINT::[Mirroring_Endpoint]
TO [DOMAIN\UserAccount];
GO
-- Set up mirroring using T-SQL command
ALTER DATABASE YourDatabaseName
SET PARTNER = 'TCP://192.168.0.85:5022';
GO
-- Verify the status of the mirroring configuration
SELECT * FROM sys.database_mirroring;
GO
解决方案 2:用于测试 SQL Server 端口可访问性的 PowerShell 脚本
该解决方案使用 PowerShell 测试服务器之间的端口连接,确保所需的端口已打开并正在侦听。
# Define server IPs and ports
$server1 = "192.168.0.80"
$server2 = "192.168.0.85"
$port = 5022
# Function to test port connectivity
function Test-Port {
param([string]$server, [int]$port)
try {
$tcpClient = New-Object System.Net.Sockets.TcpClient($server, $port)
Write-Host "$server on port $port is reachable."
$tcpClient.Close()
} catch {
Write-Host "$server on port $port is not reachable."
}
}
# Test both servers
Test-Port -server $server1 -port $port
Test-Port -server $server2 -port $port
解决方案 3:修复 SQL Server 错误 1418(防火墙配置)
此方法使用 Windows 命令提示符检查防火墙配置,确保所需端口(1433、5022)在两台服务器上均打开。
-- Check if SQL Server and mirroring ports are open
netsh advfirewall firewall add rule name="SQLPort" dir=in action=allow protocol=TCP localport=1433
netsh advfirewall firewall add rule name="MirrorPort" dir=in action=allow protocol=TCP localport=5022
-- Disable firewall temporarily for testing purposes
netsh advfirewall set allprofiles state off
-- Enable firewall again after testing
netsh advfirewall set allprofiles state on
解决方案 4:验证服务器之间 TCP 连接的 Python 脚本
此解决方案使用 Python 通过检查 TCP 连接来验证 SQL Server 实例是否可以通过网络进行通信。
import socket
# Define server IPs and port
server1 = '192.168.0.80'
server2 = '192.168.0.85'
port = 5022
# Function to check connectivity
def check_connection(server, port):
try:
sock = socket.create_connection((server, port), timeout=5)
print(f'Connection successful to {server}:{port}')
sock.close()
except socket.error:
print(f'Cannot connect to {server}:{port}')
# Check both servers
check_connection(server1, port)
check_connection(server2, port)
解决方案 5:SQL Server Management Studio (SSMS) GUI 配置
此解决方案引导不喜欢使用命令行界面的用户使用 SSMS GUI 设置镜像。
1. Open SQL Server Management Studio (SSMS).
2. Right-click your database -> Tasks -> Mirror...
3. Click Configure Security and follow the wizard.
4. Ensure both Principal and Mirror servers are correct.
5. Set the port for the mirroring endpoints to 5022.
6. Complete the configuration and click Start Mirroring.
7. Verify the mirroring status by checking the "Database Properties" window.
探索 SQL Server 镜像中的网络和安全挑战
设置时 SQL Server数据库镜像经常被忽视的一个方面是网络配置和安全设置的作用。错误1418,表示无法访问服务器网络地址,通常是由底层网络问题引起的。即使打开正确的端口(1433 和 5022)并禁用防火墙,其他网络元素(例如路由和 DNS 配置)也可能导致通信失败。确保两台服务器正确解析彼此的 IP 地址非常重要,尤其是在多子网环境中。
另一个挑战涉及 SQL Server 身份验证 镜像设置期间的设置。数据库镜像要求主体服务器和镜像服务器通过证书或基于域的身份验证 (Kerberos) 相互验证。如果此设置配置不正确,或者两个服务器之间的安全协议不匹配,则可能会出现错误 1418。此外,SQL Server 服务帐户必须在两台计算机上拥有正确的权限,特别是对镜像端点的访问权限。
最后,操作系统的选择也会影响镜像的行为方式。不同的 Windows 版本可能会以不同的方式处理 TCP 连接,特别是在管理防火墙规则和网络流量路由的方式方面。如果任一服务器的操作系统已过时或不匹配的网络驱动程序,服务器之间的通信可能会失败。确保操作系统已安装最新补丁并且适当的服务正在运行对于解决错误 1418 等连接问题至关重要。
有关 SQL Server 镜像设置和错误 1418 的常见问题
- SQL Server镜像中出现错误1418的原因是什么?
- 错误 1418 通常是由两个服务器之间的通信故障引起的。这可能是由于防火墙设置不正确 mirroring endpoints,或网络连接问题。
- 如何检查我的端口是否对 SQL Server 镜像开放?
- 使用 telnet 命令或脚本,例如 New-Object System.Net.Sockets.TcpClient 在 PowerShell 中测试端口 1433 和 5022 是否打开。
- 两台服务器需要在同一个域中才能进行镜像吗?
- 不需要,但域身份验证可以简化该过程。否则,您必须使用基于证书的身份验证来保护 mirroring endpoints。
- 数据库镜像中端点的作用是什么?
- 这 CREATE ENDPOINT 命令创建允许 SQL Server 实例在镜像期间进行通信的网络接口。每台服务器都必须有一个正常运行的镜像端点。
- 我可以在不同的 SQL Server 版本上镜像数据库吗?
- 不可以,数据库镜像要求两个 SQL Server 实例具有相同的版本和版本才能正常工作。
关于解决数据库镜像错误 1418 的最终想法
诸如错误 1418 之类的数据库镜像错误通常是由服务器之间的网络问题引起的。确保打开正确的端口、配置防火墙并正确设置端点可以解决此问题。
此外,使用 PowerShell 等工具验证网络访问并确保服务器之间的身份验证协议一致将提高成功的机会。遵循这些步骤有助于实现可靠的 SQL Server 镜像以实现高性能操作。
数据库镜像解决方案的参考和资源
- 有关 SQL Server 镜像配置和故障排除的详细信息(包括错误 1418 和端点设置),请访问 微软SQL文档 。
- 有关为 SQL Server 镜像配置防火墙规则和网络故障排除的综合指南,请访问: Windows 防火墙配置 。
- 用于 SQL Server 实例之间的端口测试和网络验证的 PowerShell 脚本可在以下位置获取: PowerShell 文档 。
- 有关测试服务器连接性时使用的 Python 套接字编程技术,请访问 Python 套接字模块 。