mportant; font-size: 1rem; word-break: break-all; color: rgb(51, 51, 51); line-height: 1.74; max-width: 100%;">
#创建挂载数据文件夹
mkdir -p /home/mssql/data
#创建挂载日志文件夹
mkdir /home/mssql/log
#给文件夹权限
chmod 777 /home/mssql/data
chmod 777 /home/mssql/log
#创建mssql的docker容器
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=sa123456." -e "MSSQL_AGENT_ENABLED=true"  -p 1433:1433 --name mssql -h mssql \
-v /home/mssql/data:/var/opt/mssql/data \
-v /home/mssql/log:/var/opt/mssql/log \
-d mcr.microsoft.com/mssql/server:latest1.2.3.4.5.6.7.8.9.10.11.12.

 

安装完通过SqlServer Management能连上了

Docker下的SqlServer发布订阅启用_服务器

 二、配置分发服务器

这里分发服务器也是用数据库服务器充当,实际项目中如果有多余服务器可以用另外的服务器

1、创建发布服务器存快照的文件夹

#进入docker
docker exec -it mssql bin/bash
#创建快照文件夹
mkdir /var/opt/mssql/ReplData
#给权限
chmod 777 /var/opt/mssql/ReplData
#退出容器
exit1.2.3.4.5.6.7.8.

2、错误的配置分发服务器做法

这里不要用数据库管理工具上面的配置分发服务器,下面的是错误的做法

Docker下的SqlServer发布订阅启用_数据库_02

 如果直接在界面配置的分发服务器,虽然能成功,但下发创建本地发布的时候会报"必须先将 xxx 作为发布服务器启用,然后才能创建发布。在下列对话框中,将此服务器作为发布服务器启用"

Docker下的SqlServer发布订阅启用_数据库_03

 3、正确配置分发服务器方法

 1 )查询数据库的所在docker的hostname

select @@servername1.

Docker下的SqlServer发布订阅启用_sql_04

  2)创建分发数据库

在数据库中执行

use master
GO
EXEC sp_adddistributor @distributor = N'mssql'
GO
EXEC sp_adddistributiondb @database = N'distribution', @data_folder = N'/var/opt/mssql/data',
@log_folder = N'/var/opt/mssql/data', @log_file_size = 2, @min_distretention = 0, @max_distretention = 72,
@history_retention = 48, @deletebatchsize_xact = 5000, @deletebatchsize_cmd = 2000, @security_mode = 1,@password='sa123456.'
GO
SELECT name, create_date FROM sys.databases
GO1.2.3.4.5.6.7.8.9.10.
@distributor:上面查出的数据库的hostname1.
@database:分发数据库名称1.
其他参数代表什么意思在这里查看:https://learn.microsoft.com/zh-cn/SQL/relational-databases/system-stored-procedures/sp-adddistributiondb-transact-sql?view=sql-server-ver16

3)创建分发服务器
在数据库中执行1.2.3.4.
USE [distribution]

IF (NOT EXISTS (SELECT * FROM sysobjects WHERE name = 'UIProperties' AND type = 'U ')) 

CREATE TABLE UIProperties(id INT)

GO

IF (EXISTS (SELECT * FROM ::fn_listextendedproperty('SnapshotFolder', 'user', 'dbo', 'table', 'UIProperties', null, null)))
  EXEC sp_updateextendedproperty N'SnapshotFolder', N'/var/opt/mssql/ReplData', 'user', dbo, 'table', 'UIProperties'

ELSE

  EXEC sp_addextendedproperty N'SnapshotFolder', N'/var/opt/mssql/ReplData', 'user', dbo, 'table', 'UIProperties'

GO

EXEC sp_adddistpublisher @publisher = N'mssql', @distribution_db = N'distribution', @security_mode = 1,

@working_directory = N'/var/opt/mssql/ReplData', @trusted = N'false', @thirdparty_flag = 0,

@publisher_type = N'MSSQLSERVER'1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.
@publisher:上面的hostname1.
@distribution_db:分发数据库名称1.
/var/opt/mssql/ReplData:这个路径为上面创建的路径

执行完就创建成功分发服务器了,能看到复制文件夹多出了一些菜单了1.2.3.

Docker下的SqlServer发布订阅启用_sql_05

 

三、创建数据库发布

1、准备数据库
这里创建一个数据库 MyDb(主库)和创建一个数据库MyDbSlaver(从库,不建表,通过主库的快照同步)
如果是实际项目中,数据库的数据量已经很大的情况下,建议从库从主库还原一份,不要通过快照同步,因为这个过程会占服务器的cpu很高,会影响到服务器
然后给MyDb(主库)创建一个表测试用1.2.3.4.
CREATE TABLE SysUser (
    ID INT PRIMARY KEY,
    UserName NVARCHAR(50),
    Age INT
);1.2.3.4.5.

Docker下的SqlServer发布订阅启用_sql_06

 

2、新建发布

Docker下的SqlServer发布订阅启用_数据库_07

 

Docker下的SqlServer发布订阅启用_sql_08

 选择事务发布,如想用其它发布类型,看对应说明

Docker下的SqlServer发布订阅启用_服务器_09

 全部勾选

Docker下的SqlServer发布订阅启用_服务器_10

 

Docker下的SqlServer发布订阅启用_数据库_11

 

Docker下的SqlServer发布订阅启用_服务器_12

 

Docker下的SqlServer发布订阅启用_服务器_13

 

Docker下的SqlServer发布订阅启用_数据库_14

 

Docker下的SqlServer发布订阅启用_sql_15

 

Docker下的SqlServer发布订阅启用_服务器_16

 成功创建发布

Docker下的SqlServer发布订阅启用_数据库_17

 

四、创建数据库订阅

1、创建订阅

Docker下的SqlServer发布订阅启用_sql_18

 

Docker下的SqlServer发布订阅启用_服务器_19

 

Docker下的SqlServer发布订阅启用_sql_20

 

Docker下的SqlServer发布订阅启用_数据库_21

 

Docker下的SqlServer发布订阅启用_数据库_22

 

Docker下的SqlServer发布订阅启用_sql_23

 

Docker下的SqlServer发布订阅启用_数据库_24

 

创建订阅成功1.

Docker下的SqlServer发布订阅启用_sql_25

 创建订阅成功后能看到从库把主库的表也同步过来了

Docker下的SqlServer发布订阅启用_数据库_26

 

 2、验证效果

在MyDb操作的数据,在从库MyDbSlaver查到的结果是一样的

Docker下的SqlServer发布订阅启用_sql_27