doc/user/content/sql/create-source/sql-server.md
{{% create-source/intro %}}
Materialize supports SQL Server (2016+) as a real-time data source. To connect to a
SQL Server database, you first need to tweak its configuration to enable Change Data
Capture
and SNAPSHOT transaction isolation
for the database that you would like to replicate. Then create a connection
in Materialize that specifies access and authentication parameters.
{{% /create-source/intro %}}
{{% include-syntax file="examples/create_source_sql_server_legacy" example="syntax" %}}
Materialize ingests the CDC stream for all (or a specific set of) tables in your upstream SQL Server database that have Change Data Capture enabled.
CREATE SOURCE mz_source
FROM SQL SERVER CONNECTION sql_server_connection
FOR ALL TABLES;
When you define a source, Materialize will automatically:
Create a subsource for each capture instance upstream, and perform an initial, snapshot-based sync of the associated tables before it starts ingesting change events.
SHOW SOURCES;
name | type | cluster |
----------------------+------------+------------
mz_source | sql-server |
mz_source_progress | progress |
table_1 | subsource |
table_2 | subsource |
Incrementally update any materialized or indexed views that depend on the
source as change events stream in, as a result of INSERT, UPDATE and
DELETE operations in the upstream SQL Server database.
CREATE SOURCE will attempt to create each upstream table in the same schema as
the source. This may lead to naming collisions if, for example, you are
replicating schema1.table_1 and schema2.table_1. Use the FOR TABLES
clause to provide aliases for each upstream table, in such cases, or to specify
an alternative destination schema in Materialize.
CREATE SOURCE mz_source
FROM SQL SERVER CONNECTION sql_server_connection
FOR TABLES (schema1.table_1 AS s1_table_1, schema2.table_1 AS s2_table_1);
By default, SQL Server sources expose progress metadata as a subsource that you
can use to monitor source ingestion progress. The name of the progress
subsource can be specified when creating a source using the EXPOSE PROGRESS AS clause; otherwise, it will be named <src_name>_progress.
The following metadata is available for each source as a progress subsource:
| Field | Type | Details |
|---|---|---|
lsn | bytea | The upper-bound Log Sequence Number replicated thus far into Materialize. |
And can be queried using:
SELECT lsn
FROM <src_name>_progress;
The reported lsn should increase as Materialize consumes new CDC events
from the upstream SQL Server database. For more details on monitoring source
ingestion progress and debugging related issues, see Troubleshooting.
{{% include-headless "/headless/sql-server-considerations" %}}
{{< important >}}
Before creating a SQL Server source, you must enable Change Data Capture and
SNAPSHOT transaction isolation in the upstream database.
{{</ important >}}
A connection describes how to connect and authenticate to an external system you want Materialize to read data from.
Once created, a connection is reusable across multiple CREATE SOURCE
statements. For more details on creating connections, check the
CREATE CONNECTION documentation page.
CREATE SECRET sqlserver_pass AS '<SQL_SERVER_PASSWORD>';
CREATE CONNECTION sqlserver_connection TO SQL SERVER (
HOST 'instance.foo000.us-west-1.rds.amazonaws.com',
PORT 1433,
USER 'materialize',
PASSWORD SECRET sqlserver_pass,
DATABASE '<DATABASE_NAME>'
);
If your SQL Server instance is not exposed to the public internet, you can tunnel the connection through and SSH bastion host.
{{< tabs tabID="1" >}} {{< tab "SSH tunnel">}}
CREATE CONNECTION ssh_connection TO SSH TUNNEL (
HOST 'bastion-host',
PORT 22,
USER 'materialize',
DATABASE '<DATABASE_NAME>'
);
CREATE CONNECTION sqlserver_connection TO SQL SERVER (
HOST 'instance.foo000.us-west-1.rds.amazonaws.com',
SSH TUNNEL ssh_connection,
DATABASE '<DATABASE_NAME>'
);
For step-by-step instructions on creating SSH tunnel connections and configuring an SSH bastion server to accept connections from Materialize, check this guide.
{{< /tab >}} {{< /tabs >}}
You must enable Change Data Capture, see Enable Change Data Capture SQL Server Instructions.
Once CDC is enabled for all of the relevant tables, you can create a SOURCE in
Materialize to begin replicating data!
Create subsources for all tables in SQL Server
CREATE SOURCE mz_source
FROM SQL SERVER CONNECTION sqlserver_connection
FOR ALL TABLES;
Create subsources for specific tables in SQL Server
CREATE SOURCE mz_source
FROM SQL SERVER CONNECTION sqlserver_connection
FOR TABLES (mydb.table_1, mydb.table_2 AS alias_table_2);
If you're replicating tables that use data types unsupported
by SQL Server's CDC feature, use the EXCLUDE COLUMNS option to exclude them from
replication. This option expects the upstream fully-qualified names of the
replicated table and column (i.e. as defined in your SQL Server database).
CREATE SOURCE mz_source
FROM SQL SERVER CONNECTION sqlserver_connection (
EXCLUDE COLUMNS (mydb.table_1.column_of_unsupported_type)
)
FOR ALL TABLES;
{{% include-headless "/headless/schema-changes-in-progress" %}}
To handle upstream schema changes or errored subsources, use
the DROP SOURCE syntax to drop the affected
subsource, and then ALTER SOURCE...ADD SUBSOURCE to add
the subsource back to the source.
-- List all subsources in mz_source
SHOW SUBSOURCES ON mz_source;
-- Get rid of an outdated or errored subsource
DROP SOURCE table_1;
-- Start ingesting the table with the updated schema or fix
ALTER SOURCE mz_source ADD SUBSOURCE table_1;