# Debezium MSSQL CDC with Kafka (KRaft)

# Debezium MySQL CDC with Kafka (KRaft)

# 1. Download Correct Debezium SQL Server Plugin (v3.3)

```
wget https://repo1.maven.org/maven2/io/debezium/debezium-connector-sqlserver/3.3.0.Final/debezium-connector-sqlserver-3.3.0.Final-plugin.tar.gz

```

# Extract plugin And Move to /opt/kafka/connectors

```
tar -xzf debezium-connector-sqlserver-3.3.0.Final-plugin.tar.gz -C /opt/kafka/connectors

```

# Restart your Kafka Connect service:

`systemctl restart kafka-connect`

# Create SQL Server User With Required Permissions

```sql
CREATE DATABASE DebeziumTest;
USE DebeziumTest;
EXEC sys.sp_cdc_enable_db;

CREATE TABLE dbo.Customers (
    CustomerID INT IDENTITY(1,1) PRIMARY KEY,
    FirstName NVARCHAR(100),
    LastName NVARCHAR(100),
    Email NVARCHAR(255),
    CreatedAt DATETIME DEFAULT GETDATE()
);

EXEC sys.sp_cdc_enable_table
    @source_schema = 'dbo',
    @source_name = 'Customers',
    @role_name = NULL,
    @supports_net_changes = 0;

INSERT INTO dbo.Customers (FirstName, LastName, Email)
VALUES
 ('Golam', 'Kibria', 'golam@example.com'),
 ('John', 'Doe', 'john.doe@example.com'),
 ('Jane', 'Smith', 'jane.smith@example.com');

UPDATE dbo.Customers
SET Email = 'golam.kibria@updated.com'
WHERE CustomerID = 1;

SELECT name, is_cdc_enabled FROM sys.databases WHERE name='DebeziumTest';

SELECT name, is_tracked_by_cdc FROM sys.tables WHERE name='Customers';

USE master;
CREATE LOGIN debezium WITH PASSWORD = 'StrongPassword!123';

USE DebeziumTest;
CREATE USER debezium FOR LOGIN debezium;

ALTER ROLE db_owner ADD MEMBER debezium;




```

# Register debezium connector

```bash
curl -X POST http://192.168.1.226:8083/connectors \
  -H "Content-Type: application/json" \
  -d '{
    "name": "mssql-connector",
    "config": {
      "connector.class": "io.debezium.connector.sqlserver.SqlServerConnector",

      "database.hostname": "192.168.1.225",
      "database.port": "1433",
      "database.user": "debezium",
      "database.password": "StrongPassword!123",

      "database.names": "DebeziumTest",
      "database.server.name": "sqlserver",
      "database.encrypt": "false",

      "topic.prefix": "mssql",

      "snapshot.mode": "initial",

      "table.include.list": "dbo.Customers",

     "schema.history.internal.kafka.bootstrap.servers": "192.168.1.226:9092",
     "schema.history.internal.kafka.topic": "schema-changes.mssql",

      "include.schema.changes": "true"
    }
  }'


```

# . Verify Connector

```bash
curl http://localhost:8083/connectors

```

# Check status

```
curl http://localhost:8083/connectors/mssql-connector/status

```

# . Kafka Topics Created

```bash
/opt/kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 --list

```

# Consume CDC Messages

```
/opt/kafka/bin/kafka-console-consumer.sh \
  --bootstrap-server 192.168.1.226:9092 \
  --topic mssql.sqlserver.DebeziumTest.dbo.Customers \
  --from-beginning



```

# Delete Connector

```
curl -X DELETE http://localhost:8083/connectors/mssql-connector

```

# Check kafka-connect log

```
 tail -f /opt/kafka/logs/connect.log


```

# Create User and permissions

# ✅ SQL Server Debezium Test — Without `GO`

### **1. Create Database**

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-create-database-debe"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">`<span class="hljs-keyword">CREATE</span> DATABASE DebeziumTest;`</div></div>### **Switch Database**

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-use-debeziumtest%3B"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">`USE DebeziumTest;`</div></div>---

# ✅ 2. Enable CDC on the Database

(Works without GO)

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-exec-sys.sp_cdc_enab"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">`<span class="hljs-keyword">EXEC</span> sys.sp_cdc_enable_db;`</div></div>---

# ✅ 3. Create Test Table

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-create-table-dbo.cus"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">`<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> dbo.Customers (    CustomerID <span class="hljs-type">INT</span> <span class="hljs-keyword">IDENTITY</span>(<span class="hljs-number">1</span>,<span class="hljs-number">1</span>) <span class="hljs-keyword">PRIMARY</span> KEY,    FirstName NVARCHAR(<span class="hljs-number">100</span>),    LastName NVARCHAR(<span class="hljs-number">100</span>),    Email NVARCHAR(<span class="hljs-number">255</span>),    CreatedAt DATETIME <span class="hljs-keyword">DEFAULT</span> GETDATE());`</div></div>---

# ✅ 4. Enable CDC on the Table

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-exec-sys.sp_cdc_enab-1"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">`<span class="hljs-keyword">EXEC</span> sys.sp_cdc_enable_table    <span class="hljs-variable">@source_schema</span> <span class="hljs-operator">=</span> <span class="hljs-string">'dbo'</span>,    <span class="hljs-variable">@source_name</span> <span class="hljs-operator">=</span> <span class="hljs-string">'Customers'</span>,    <span class="hljs-variable">@role_name</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">NULL</span>,    <span class="hljs-variable">@supports_net_changes</span> <span class="hljs-operator">=</span> <span class="hljs-number">0</span>;`</div></div>---

# ✅ 5. Insert Sample Data

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-insert-into-dbo.cust"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">`<span class="hljs-keyword">INSERT</span> <span class="hljs-keyword">INTO</span> dbo.Customers (FirstName, LastName, Email)<span class="hljs-keyword">VALUES</span> (<span class="hljs-string">'Golam'</span>, <span class="hljs-string">'Kibria'</span>, <span class="hljs-string">'golam@example.com'</span>), (<span class="hljs-string">'John'</span>, <span class="hljs-string">'Doe'</span>, <span class="hljs-string">'john.doe@example.com'</span>), (<span class="hljs-string">'Jane'</span>, <span class="hljs-string">'Smith'</span>, <span class="hljs-string">'jane.smith@example.com'</span>);`</div></div>---

# ✅ 6. Update Data

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-update-dbo.customers"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">`<span class="hljs-keyword">UPDATE</span> dbo.Customers<span class="hljs-keyword">SET</span> Email <span class="hljs-operator">=</span> <span class="hljs-string">'golam.kibria@updated.com'</span><span class="hljs-keyword">WHERE</span> CustomerID <span class="hljs-operator">=</span> <span class="hljs-number">1</span>;`</div></div>---

# ✅ 7. Delete Data

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-delete-from-dbo.cust"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">`<span class="hljs-keyword">DELETE</span> <span class="hljs-keyword">FROM</span> dbo.Customers<span class="hljs-keyword">WHERE</span> CustomerID <span class="hljs-operator">=</span> <span class="hljs-number">2</span>;`</div></div>---

# 🔍 8. Check CDC Status

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-select-name%2C-is_cdc_"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">`<span class="hljs-keyword">SELECT</span> name, is_cdc_enabled <span class="hljs-keyword">FROM</span> sys.databases <span class="hljs-keyword">WHERE</span> name<span class="hljs-operator">=</span><span class="hljs-string">'DebeziumTest'</span>;`</div></div><div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-select-name%2C-is_trac"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">`<span class="hljs-keyword">SELECT</span> name, is_tracked_by_cdc <span class="hljs-keyword">FROM</span> sys.tables <span class="hljs-keyword">WHERE</span> name<span class="hljs-operator">=</span><span class="hljs-string">'Customers'</span>;`</div></div>