Ubuntu环境下SQL Server 2022创建Publisher报错,求解决方案
Ubuntu上SQL Server 2022事务复制创建Publisher失败的常见原因及解决办法
1. 复制依赖组件未安装或未启动
- 原因:SQL Server在Linux环境下的复制功能依赖
mssql-server-agent和mssql-server-replication扩展包,若未安装或服务未正常运行,会导致发布者创建失败。 - 解决步骤:
- 安装扩展包:
sudo apt-get update sudo apt-get install mssql-server-agent mssql-server-replication - 重启SQL Server服务以加载组件:
sudo systemctl restart mssql-server - 验证代理服务状态:
确保服务显示为sudo systemctl status mssql-server-agentactive (running)状态。
- 安装扩展包:
2. 操作账号权限不足
- 原因:用于配置发布的SQL账号缺少
sysadmin服务器角色权限,或者Linux系统层面mssql用户对关键目录无读写权限。 - 解决步骤:
- 验证SQL账号权限:执行以下T-SQL命令,返回值为1表示拥有
sysadmin权限:
若权限不足,使用SELECT IS_SRVROLEMEMBER('sysadmin');ALTER SERVER ROLE sysadmin ADD MEMBER [你的登录账号];添加角色。 - 检查系统目录权限:
确保目录所有者为ls -ld /var/opt/mssql/datamssql:mssql,否则执行sudo chown -R mssql:mssql /var/opt/mssql/data修正。
- 验证SQL账号权限:执行以下T-SQL命令,返回值为1表示拥有
3. 分发服务器配置不完整或关联异常
- 原因:虽然已配置分发服务器,但发布者未正确注册到分发服务器,或分发数据库(默认
distribution)存在权限问题。 - 解决步骤:
- 验证分发服务器配置:在分发服务器上执行:
检查结果中EXEC sp_helpdistributor;publisher字段是否包含目标发布者实例。 - 检查分发数据库权限:确保发布者实例的登录账号对
distribution数据库拥有db_owner角色权限。 - 重新关联分发与发布者:若关联异常,先删除分发配置:
再重新创建分发服务器并注册发布者。EXEC sp_dropdistributor @no_checks = 1;
- 验证分发服务器配置:在分发服务器上执行:
4. 版本兼容性问题
- 原因:尽管使用了RTM-CU12-GDR版本,但复制组件可能存在版本不匹配或已知bug,导致发布者创建失败。
- 解决步骤:
- 验证组件版本一致性:执行以下命令检查复制组件版本:
确保组件版本与SQL Server主版本(16.0.4120.1)一致。SELECT name, version FROM sys.syscomponents WHERE name LIKE '%repl%'; - 升级到最新累积更新:
确保所有SQL Server相关组件同步更新。sudo apt-get update sudo apt-get install mssql-server mssql-server-agent mssql-server-replication
- 验证组件版本一致性:执行以下命令检查复制组件版本:
5. 网络或防火墙限制
- 原因:两台服务器之间的SQL Server端口(默认1433)未开放,导致发布者与分发服务器无法通信。
- 解决步骤:
- 开放防火墙端口:
若使用自定义端口,替换为对应端口号。sudo ufw allow 1433/tcp - 验证连通性:在发布者服务器上执行:
确认端口可正常访问。nc -zv <分发服务器IP> 1433
- 开放防火墙端口:
6. SSMS远程UI兼容性问题
- 原因:通过Windows上的SSMS远程连接Linux SQL Server时,可能存在向导UI兼容性问题,导致无法启动“New publication”向导。
- 解决步骤:
使用T-SQL命令手动创建发布,绕过UI限制,示例代码如下:-- 启用数据库的发布功能 USE [你的目标数据库名] EXEC sp_replicationdboption @dbname = N'你的目标数据库名', @optname = N'publish', @value = N'true'; -- 创建事务发布 DECLARE @publication AS sysname = N'你的发布名称'; EXEC sp_addpublication @publication = @publication, @description = N'基于目标数据库的事务发布', @sync_method = N'concurrent', @retention = 0, @allow_push = N'true', @allow_pull = N'true', @allow_anonymous = N'false', @repl_freq = N'continuous', @status = N'active', @independent_agent = N'true', @replicate_ddl = 1;
内容的提问来源于stack exchange,提问作者Mahdi Khalil Nejad
相关产品推荐
相关产品推荐

