Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions samples/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,7 @@ Samples that help with the management of SQL Server and Azure SQL Database.
__[tutorials](tutorials/)__

Samples showing how to connect to SQL databases using various programming languages, including Python, C#, Java, Ruby, Node.js, and PHP.

__[containers](containers/)__

Samples showing various SQL Server in container scenarios.
3 changes: 3 additions & 0 deletions samples/containers/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
__[replication](replication/)__

Example of SQL Server Replication in containers. This demo uses docker-compose to start two SQL Server containers; one that acts as the publisher and distributor, and the other as the subscriber in a push snapshot configuration.
38 changes: 38 additions & 0 deletions samples/containers/replication/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
## SQL Server Replication with Containers

This demo uses docker-compose to start two SQL Server containers; one that acts as the publisher and distributor, and the other as the subscriber in a push snapshot configuration.


### How to Use

1. Run the following command in this directory:

```
docker-compose up
```
note: this will take approx. 2 min.

In your terminal, you should see something like this
```
db1 | Job 'DB1-Sales-SnapshotRepl-1' started successfully.
db1 | Creating Snapshot...
db1 | Job 'db1-Sales-SnapshotRepl-DB2-1' started successfully.
```

2. Connect to the subscriber listening on localhost,2600 and see that the Sales Database has a Customer table with data in it.
note: credentials are listed in the **docker-compose.yml**

3. when you are done, clean up by running the following command
```
docker-compose down
```



### How it Works

1. Both SQL Server containers start with the environment variables specified in the docker-compose file. In this example, **db1** is the publisher/distributor and **db2** is the subscriber.
2. *db1/db-init.sh* and *db2/db-init.sh* waits for SQL Server to start up and run the *db-init.sql* scripts
3. *db1/db-init.sql* creates a *Sales* Database with *Customer* table and sample data, and proceeds by setting up snapshot replication.
4. *db2/db-init.sql* creates a *Sales* Database.
5. db1 starts replication jobs to push the snapshot to db2
6 changes: 6 additions & 0 deletions samples/containers/replication/db1/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
FROM mcr.microsoft.com/mssql/server:vNext-CTP2.0-ubuntu

COPY . /

RUN chmod +x /db-init.sh
CMD /bin/bash ./entrypoint.sh
11 changes: 11 additions & 0 deletions samples/containers/replication/db1/db-init.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#wait for the SQL Server to come up
sleep 25s

mkdir /var/opt/mssql/ReplData/
chown mssql /var/opt/mssql/ReplData/
chgrp mssql /var/opt/mssql/ReplData/


echo "running set up script"
#run the setup script to create the DB and the schema in the DB
/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P MssqlPass123 -d master -i db-init.sql
167 changes: 167 additions & 0 deletions samples/containers/replication/db1/db-init.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
CREATE DATABASE Sales
GO
USE [SALES]
GO
CREATE TABLE CUSTOMER([CustomerID] [int] NOT NULL, [SalesAmount] [decimal] NOT NULL)
GO
INSERT INTO CUSTOMER (CustomerID, SalesAmount) VALUES (1,100),(2,200),(3,300)



DECLARE @distributor AS sysname
DECLARE @distributorlogin AS sysname
DECLARE @distributorpassword AS sysname
-- Specify the Distributor name. Use 'hostname' command on in terminal to find the hostname
SET @distributor = @@SERVERNAME--in this example, it will be the name of the publisher
SET @distributorlogin = N'sa'
SET @distributorpassword = N'MssqlPass123'
-- Specify the distribution database.

use master
exec sp_adddistributor @distributor = @distributor -- this should be the hostname

-- Log into Distributor and create Distribution Database. In this example, our Publisher and Distributor is on the same host
exec sp_adddistributiondb @database = N'distribution', @log_file_size = 2, @deletebatchsize_xact = 5000, @deletebatchsize_cmd = 2000, @security_mode = 0, @login = @distributorlogin, @password = @distributorpassword
GO

DECLARE @snapshotdirectory AS nvarchar(500)
SET @snapshotdirectory = N'/var/opt/mssql/ReplData/'

-- Log into Distributor and create Distribution Database. In this example, our Publisher and Distributor is on the same host
use [distribution]
if (not exists (select * from sysobjects where name = 'UIProperties' and type = 'U '))
create table UIProperties(id int)
if (exists (select * from ::fn_listextendedproperty('SnapshotFolder', 'user', 'dbo', 'table', 'UIProperties', null, null)))
EXEC sp_updateextendedproperty N'SnapshotFolder', @snapshotdirectory, 'user', dbo, 'table', 'UIProperties'
else
EXEC sp_addextendedproperty N'SnapshotFolder', @snapshotdirectory, 'user', dbo, 'table', 'UIProperties'
GO


DECLARE @publisher AS sysname
DECLARE @distributorlogin AS sysname
DECLARE @distributorpassword AS sysname
-- Specify the Distributor name. Use 'hostname' command on in terminal to find the hostname
SET @publisher = @@SERVERNAME
SET @distributorlogin = N'sa'
SET @distributorpassword = N'MssqlPass123'
-- Specify the distribution database.

-- Adding the distribution publishers
exec sp_adddistpublisher @publisher = @publisher, @distribution_db = N'distribution', @security_mode = 0, @login = @distributorlogin, @password = @distributorpassword, @working_directory = N'/var/opt/mssql/ReplData', @trusted = N'false', @thirdparty_flag = 0, @publisher_type = N'MSSQLSERVER'
GO


DECLARE @replicationdb AS sysname
DECLARE @publisherlogin AS sysname
DECLARE @publisherpassword AS sysname
SET @replicationdb = N'Sales'
SET @publisherlogin = N'sa'
SET @publisherpassword = N'MssqlPass123'

use [Sales]
exec sp_replicationdboption @dbname = N'Sales', @optname = N'publish', @value = N'true'

-- Addi the snapshot publication
exec sp_addpublication
@publication = N'SnapshotRepl',
@description = N'Snapshot publication of database ''Sales'' from Publisher ''<PUBLISHER HOSTNAME>''.',
@retention = 0,
@allow_push = N'true',
@repl_freq = N'snapshot',
@status = N'active',
@independent_agent = N'true'

exec sp_addpublication_snapshot @publication = N'SnapshotRepl',
@frequency_type = 128,
@frequency_interval = 8,
@frequency_relative_interval = 1,
@frequency_recurrence_factor = 0,
@frequency_subday = 4,
@frequency_subday_interval = 2,
@active_start_time_of_day = 0,
@active_end_time_of_day = 235959,
@active_start_date = 0,
@active_end_date = 0,
@publisher_security_mode = 0,
@publisher_login = @publisherlogin,
@publisher_password = @publisherpassword


use [Sales]
exec sp_addarticle
@publication = N'SnapshotRepl',
@article = N'customer',
@source_owner = N'dbo',
@source_object = N'customer',
@type = N'logbased',
@description = null,
@creation_script = null,
@pre_creation_cmd = N'drop',
@schema_option = 0x000000000803509D,
@identityrangemanagementoption = N'manual',
@destination_table = N'customer',
@destination_owner = N'dbo',
@vertical_partition = N'false'


DECLARE @subscriber AS sysname
DECLARE @subscriber_db AS sysname
DECLARE @subscriberLogin AS sysname
DECLARE @subscriberPassword AS sysname
SET @subscriber = N'db2' -- for example, MSSQLSERVER
SET @subscriber_db = N'Sales'
SET @subscriberLogin = N'sa'
SET @subscriberPassword = N'MssqlPass123'

use [Sales]
exec sp_addsubscription
@publication = N'SnapshotRepl',
@subscriber = @subscriber,
@destination_db = @subscriber_db,
@subscription_type = N'Push',
@sync_type = N'automatic',
@article = N'all',
@update_mode = N'read only',
@subscriber_type = 0


exec sp_addpushsubscription_agent
@publication = N'SnapshotRepl',
@subscriber = @subscriber,
@subscriber_db = @subscriber_db,
@subscriber_security_mode = 0,
@subscriber_login = @subscriberLogin,
@subscriber_password = @subscriberPassword,
@frequency_type = 128,
@frequency_interval = 8,
@frequency_relative_interval = 0,
@frequency_recurrence_factor = 0,
@frequency_subday = 4,
@frequency_subday_interval = 2,
@active_start_time_of_day = 0,
@active_end_time_of_day = 0,
@active_start_date = 0,
@active_end_date = 19950101
GO

exec sp_startpublication_snapshot
@publication = N'SnapshotRepl',
@publisher = NULL
GO
PRINT 'Creating Snapshot...'

WAITFOR DELAY '00:00:17'

DECLARE @jobname NVARCHAR(max)

--use the following query to query for the jobname of replication job
select @jobname=s.name
from msdb.dbo.sysjobs s inner join msdb.dbo.syscategories c on s.category_id = c.category_id
where c.name in ('REPL-Distribution')

--select @jobname

exec msdb.dbo.sp_start_job @jobname

-- SELECT name, date_modified FROM msdb.dbo.sysjobs order by date_modified desc
5 changes: 5 additions & 0 deletions samples/containers/replication/db1/entrypoint.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#start SQL Server, start the script to create/setup the DB
#You need a non-terminating process to keep the container alive.
#In a series of commands separated by single ampersands the commands to the left of the right-most ampersand are run in the background.
#So - if you are executing a series of commands simultaneously using single ampersands, the command at the right-most position needs to be non-terminating
/db-init.sh & /opt/mssql/bin/sqlservr
6 changes: 6 additions & 0 deletions samples/containers/replication/db2/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
FROM mcr.microsoft.com/mssql/server:vNext-CTP2.0-ubuntu

COPY . /

RUN chmod +x /db-init.sh
CMD /bin/bash ./entrypoint.sh
6 changes: 6 additions & 0 deletions samples/containers/replication/db2/db-init.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#wait for the SQL Server to come up
sleep 20s

echo "running set up script"
#run the setup script to create the DB and the schema in the DB
/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P MssqlPass123 -d master -i db-init.sql
2 changes: 2 additions & 0 deletions samples/containers/replication/db2/db-init.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
CREATE DATABASE Sales
GO
5 changes: 5 additions & 0 deletions samples/containers/replication/db2/entrypoint.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#start SQL Server, start the script to create/setup the DB
#You need a non-terminating process to keep the container alive.
#In a series of commands separated by single ampersands the commands to the left of the right-most ampersand are run in the background.
#So - if you are executing a series of commands simultaneously using single ampersands, the command at the right-most position needs to be non-terminating
/db-init.sh & /opt/mssql/bin/sqlservr
23 changes: 23 additions & 0 deletions samples/containers/replication/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
version: "3"
services:
db1:
build: ./db1
environment:
SA_PASSWORD: "MssqlPass123"
ACCEPT_EULA: "Y"
MSSQL_AGENT_ENABLED: "true"
ports:
- "2500:1433"
container_name: db1
hostname: db1
db2:
build: ./db2
environment:
SA_PASSWORD: "MssqlPass123"
ACCEPT_EULA: "Y"
MSSQL_AGENT_ENABLED: "true"
ports:
- "2600:1433"
container_name: db2
hostname: db2