Docker下的SqlServer发布订阅启用
一、准备一个Docker的sqlserver
#创建挂载数据文件夹 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:latest
安装完通过SqlServer Management能连上了
二、配置分发服务器
这里分发服务器也是用数据库服务器充当,实际项目中如果有多余服务器可以用另外的服务器
1、创建发布服务器存快照的文件夹
#进入docker docker exec -it mssql bin/bash #创建快照文件夹 mkdir /var/opt/mssql/ReplData #给权限 chmod 777 /var/opt/mssql/ReplData #退出容器 exit
2、错误的配置分发服务器做法
这里不要用数据库管理工具上面的配置分发服务器,下面的是错误的做法
如果直接在界面配置的分发服务器,虽然能成功,但下发创建本地发布的时候会报"必须先将 xxx 作为发布服务器启用,然后才能创建发布。在下列对话框中,将此服务器作为发布服务器启用"
3、正确配置分发服务器方法
1 )查询数据库的所在docker的hostname
select @@servername
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 GO
@distributor:上面查出的数据库的hostname
@database:分发数据库名称
其他参数代表什么意思在这里查看:https://learn.microsoft.com/zh-cn/SQL/relational-databases/system-stored-procedures/sp-adddistributiondb-transact-sql?view=sql-server-ver16
3)创建分发服务器
在数据库中执行
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'
@publisher:上面的hostname
@distribution_db:分发数据库名称
/var/opt/mssql/ReplData:这个路径为上面创建的路径
执行完就创建成功分发服务器了,能看到复制文件夹多出了一些菜单了
三、创建数据库发布
1、准备数据库
这里创建一个数据库 MyDb(主库)和创建一个数据库MyDbSlaver(从库,不建表,通过主库的快照同步)
如果是实际项目中,数据库的数据量已经很大的情况下,建议从库从主库还原一份,不要通过快照同步,因为这个过程会占服务器的cpu很高,会影响到服务器
然后给MyDb(主库)创建一个表测试用
CREATE TABLE SysUser ( ID INT PRIMARY KEY, UserName NVARCHAR(50), Age INT );
2、新建发布
选择事务发布,如想用其它发布类型,看对应说明
全部勾选
成功创建发布
四、创建数据库订阅
1、创建订阅
创建订阅成功
创建订阅成功后能看到从库把主库的表也同步过来了
2、验证效果
在MyDb操作的数据,在从库MyDbSlaver查到的结果是一样的