Mirroring in Fabric
Mirroring brings an external database or catalog into OneLake as a unit —
no ETL pipeline, no orchestration, no compute you allocate. It creates a
MirroredDatabase item plus an autogenerated read-only SQL analytics
endpoint.
There is no local file artifact (unlike TMDL or PBIR). You configure
mirroring in the portal or through the REST API.
1. Three kinds — settle this first
Every later answer depends on which kind you are in. All three are called
"mirroring", and only one of them copies data.
| Kind |
Mechanism |
Data location |
Latency |
| Database mirroring |
Continuous replication into OneLake as Delta |
Copied into OneLake |
Changes published as fast as every 15 s |
| Metadata mirroring |
Syncs catalog names, schemas, tables; reads through OneLake shortcuts |
Stays at the source |
Source access + shortcut time; no replication step |
| Open mirroring |
You write change files to a landing zone; Fabric merges them into Delta |
Copied into OneLake |
As fast as you land files |
Database mirroring is source-driven, not polled. The source engine
identifies changed data — SQL Server 2025 scans its own transaction log —
and publishes to a Fabric landing zone. A replicator engine inside Fabric
scans for new files at high frequency and merges them into the target Delta
table. Backoff logic slows polling for idle tables to avoid loading the
source engine, and resumes automatically when changes reappear.
Metadata mirroring supports cross-tenant consumption precisely because
it is shortcuts underneath — you can read live governed data from another
tenant via OneLake external data sharing with no copy.
2. Which kind each source uses
From the mirroring/overview platform table as of 2026-08-30.
| Source |
Kind |
| Azure SQL Database, Azure SQL Managed Instance, SQL Server |
Database |
| Fabric SQL database |
Database — automatic, nothing to configure |
| Azure Cosmos DB |
Database |
| Azure Database for PostgreSQL |
Database |
| Azure Database for MySQL (preview) |
Database |
| Google BigQuery |
Database — GA as of Aug 2026 |
| Oracle, SAP |
Database |
| SharePoint List (preview) |
Database |
| Snowflake |
Metadata |
| Azure Databricks |
Metadata (Unity Catalog structure) |
| Dremio catalog (preview) |
Metadata |
| AWS Glue catalog (preview) |
Metadata — Iceberg tables stay in S3 |
| Azure Monitor (preview) |
Metadata — connection-based, surfaces via Eventhouse |
| Open mirrored database |
Open |
Per-source limits, auth, and setup detail: references/source-matrix.md.
Read the source's own limitations page before promising behaviour — the
per-source pages carry constraints the general docs don't, and they lag
each other (see the table-cap conflict in §8).
3. Mirroring vs Copy job vs shortcut vs pipeline
Both Mirroring and Copy job are pitched as "no pipeline". They are not
interchangeable.
- Mirroring — you want an entire external database or catalog in
Fabric, continuously in sync, as a unit. You do not choose a schedule.
- Copy job (
fabric-copy-job) — you want guided many-source →
many-destination movement with full or incremental modes you configure,
including into destinations mirroring cannot target.
- Shortcut — you want specific tables, folders, or files referenced in
place. Open formats only. Mirroring is your only option if the source
stores data in a proprietary format.
- Pipeline / dataflow / eventstream — you need multi-source transformation
logic, your own schedule or trigger, a destination outside OneLake, or
streaming.
They compose: mirror once, consume everywhere — one workspace mirrors the
source, other workspaces shortcut to the mirrored tables rather than mirroring
the same source again. Shortcuts to mirrored tables are read-only, inherit the
mirrored item's security model, and show the mirrored item's error state if
replication breaks.
4. What you get
- A
MirroredDatabase item and an autogenerated read-only SQL analytics
endpoint — same experience as the Lakehouse SQL analytics endpoint, same
limitations.
- Direct Lake works over mirrored data with no extra step; it is Delta in
OneLake.
- Cross-database queries with three-part names, joining mirrored
databases, warehouses, and Lakehouse SQL analytics endpoints in one T-SQL
query.
- Sharing a mirrored database also grants access to its SQL analytics
endpoint, without granting workspace access.
5. Cost, retention, and capacity
- Core mirroring compute is free and does not consume CUs. Querying the
data via SQL, Power BI, or Spark bills at normal rates, as do direct
OneLake requests.
- Storage is free up to 1 TB per capacity unit — an F64 gets 64 TB of
mirroring storage. You pay OneLake rates above that, or when the capacity
is paused.
- A running capacity is required. Paused → mirroring stops and the item
isn't listable. Resumed → status shows Paused and you must select
Resume replication manually. A long pause can force a full reseed,
because the source transaction log can't truncate while mirroring is
stopped. Trial expiry stops mirroring outright.
- Extended capabilities are paid (§7).
- Retention: mirroring auto-vacuums old Delta files. Configure via
retentionInDays, allowed 1–30. The docs conflict on the default —
mirroring/overview says 1 day for mirrored databases created from the
portal after mid-June 2025 (7 for older ones), while
mirrored-database-rest-api says flatly 7. Set it explicitly rather than
relying on the default.
6. REST API
Item CRUD lives under mirroredDatabases; start/stop/status are separate
operations. These APIs do not apply to Azure Databricks mirrored
databases. Generic Fabric REST patterns (LRO polling, continuation tokens,
the definition envelope) are in fabric-rest-api.
POST /v1/workspaces/{ws}/mirroredDatabases create
GET /v1/workspaces/{ws}/mirroredDatabases list
GET /v1/workspaces/{ws}/mirroredDatabases/{id} get
PATCH /v1/workspaces/{ws}/mirroredDatabases/{id} rename/describe
DELETE /v1/workspaces/{ws}/mirroredDatabases/{id} delete
POST .../{id}/getDefinition .../{id}/updateDefinition
POST .../{id}/startMirroring .../{id}/stopMirroring
POST .../{id}/getMirroringStatus .../{id}/getTablesMirroringStatus
A data source connection must exist first — create it in the portal or
via the Connections API, then reference its ID in the definition.
The definition is a single part, mirroring.json, base64 as
InlineBase64:
{
"properties": {
"source": {
"type": "<source type>",
"typeProperties": { "connection": "<connection GUID>", "database": "xxxx" }
},
"target": {
"type": "MountedRelationalDatabase",
"typeProperties": {
"defaultSchema": "xxxx",
"format": "Delta",
"retentionInDays": 1,
"enableDeltaChangeDataFeed": true
}
}
}
}
- Omit
mountedTables to mirror the whole database; supply it — an array of
{ "source": { "typeProperties": { "schemaName", "tableName" } } } — to
mirror selected tables. updateDefinition refreshes that list to add or
remove tables.
defaultSchema preserves the source schema hierarchy. Without it, older
mirrored databases flatten the schema into the table name and the only fix
is recreating the item. (The REST doc's prose misspells this as
deafultSchema; the property is defaultSchema, as its own examples show.)
connection, database, and defaultSchema can only be updated while
Get mirroring status returns Initialized or Stopped.
startMirroring fails while status is Initializing.
The non-obvious prerequisite. For Azure SQL Database, Azure SQL Managed
Instance, Azure Database for PostgreSQL, Azure Database for MySQL, and SQL
Server 2025 you must additionally: (1) enable the source server's managed
identity, and (2) grant that identity Read and Write on the mirrored
database — currently portal-only, or via the Add Workspace Role
Assignment API. Nothing in the create call surfaces this; mirroring simply
doesn't work without it.
.NET SDK support requires Microsoft.Fabric.Api ≥ 1.0.0-beta.11.
7. Extended capabilities (paid, preview)
Core mirroring is free; these are not. Billing resumed in all regions the
week of 2026-05-25.
- Delta change data feed (CDF) — row-level insert/update/delete tracking,
enabled per mirrored database via
enableDeltaChangeDataFeed. Available
for all mirroring sources including open mirroring partners. Billed on
incremental compute for real changes only — no charge for idle periods —
and it increases storage through extra _change_data files. Enable
selectively.
- Mirroring views — replicates source view logic instead of physical
tables. Snowflake only in preview.
Core mirroring pricing is unaffected by enabling either.
8. Limits and gotchas
Capacity limits
- 1,000 tables per mirrored database. "Mirror all data" takes the first
1,000 sorted by schema then table name; the rest are silently not
mirrored. Per-source pages can be lower and can lag —
snowflake-limitations
still states 500.
- 1 TB of change data per mirrored database per day. Exceeding it
produces "The replication is being throttled and expected to continue at
…"; wait it out.
Things that cannot be changed after creation
- The source database. Not supported — create a new mirrored database.
- Item ownership. Not supported. If the owner leaves the organization,
recreate the mirrored database.
keyColumns in open mirroring, once set.
Things that trigger a reseed
- Any DDL change on a mirrored source table reseeds that table.
stopMirroring then startMirroring reseeds all tables from scratch.
- A long capacity pause can force a full reseed.
Data-shape traps
- Views are not replicated by core mirroring — regular tables only.
(Mirroring views is the paid preview add-on in §7.)
- varchar truncation. The SQL analytics endpoint supports
varchar(max)
to 16 MB, but only for tables created after 2025-11-18, and per-item
caps are lower — 1 MB for mirrored SQL Server / Azure SQL / MI and Fabric
SQL database, 2 MB for Cosmos DB. Tables created before that date are
varchar(8000) and must be recreated.
- Columns with spaces or special characters (
, ; { } ( ) \n \t =)
replicate via Delta column mapping — but tables already replicating from
before that feature need the table removed and re-added, or a full stop and
restart, to pick the columns up.
Security does not travel
Row-level security, object-level permissions, dynamic data masking, and
Purview sensitivity labels defined on the source are not propagated to
the replicated data in OneLake. Secure the mirrored item on the Fabric side;
see fabric-security.
Dropping in the source is asymmetric
- Mirroring all data + source table dropped → mirrored table is deleted.
- Mirroring a selective list + source table dropped → the mirrored table
stays, with "The source table doesn't exist" in monitoring. Remove it from
the configuration to delete it.
- Dropping a source schema leaves an empty schema in the SQL analytics
endpoint either way.
9. Open mirroring landing zone
You get a landing zone URL on the mirrored database's Home page. Write
Parquet or delimited text (uncompressed, or Snappy / GZIP / ZSTD) into
per-table folders:
https://onelake.dfs.fabric.microsoft.com/<workspace id>/<mirrored db id>/Files/LandingZone/TableA
.../LandingZone/Schema1.schema/TableB
Non-negotiable rules:
- Every table folder needs
_metadata.json declaring keyColumns.
Without it, updates and deletes are impossible — everything is an insert.
It can be added later, but keyColumns is immutable once set.
__rowMarker__ must be the final column. Values: 0 insert,
1 update, 2 delete, 4 upsert.
- File names are 20 digits,
00000000000000000001.parquet, continuous
and monotonically increasing. Fabric deletes processed files but leaves the
last one so you can find your place.
- Omit
__rowMarker__ on the initial load — the whole file is treated as
INSERT, which is faster and gives better metrics.
- Updates must carry the full row, every column.
- Schema folders are named
<schemaname>.schema.
Full protocol — delimited-text properties, supported data types, table and
column operations, nonsequential-file mode, the cleanup process — is in
references/open-mirroring.md.
10. When nothing is replicating
Work down, in order:
- Portal → Monitor replication. Database status is one of Running,
Running with warning, Stopping/Stopped, Failed, Paused. Check the
Last completed column per table — empty means that table has never
mirrored. Programmatically:
getTablesMirroringStatus, which returns
per-table status plus processedRows, processedBytes, lastSyncDateTime.
- Is it a capacity state? Paused means the capacity was paused and
resumed — you must select Resume replication.
- Is the data in OneLake? Shortcut the mirrored tables into a Lakehouse
and query with Spark. If it is there, the problem is downstream.
- Is it only the SQL analytics endpoint? Data in OneLake but not in
T-SQL is a metadata-sync delay. Hit Refresh on the SQL analytics
endpoint page and re-query.
- Enable workspace monitoring for latency: mirrored-database operation
logs land in the
MirroredDatabaseTableExecution table in the monitoring
KQL database; ReplicatorBatchLatency is the execution-latency value.
- Then go source-specific. Azure SQL DB, Azure SQL MI, MySQL, and
PostgreSQL each have their own troubleshooting page with SQL checks.
Common non-bugs: views aren't replicated; columns are missing
because their type is unsupported — check the Alert icon next to the table
under Configure replication.
11. Constraints
MUST
- Establish which of the three kinds you are in before answering anything
about latency, cost, or where the data physically lives.
- Create the source connection before the mirrored database.
- Enable the source server's managed identity and grant it Read/Write on
the mirrored database for Azure SQL DB / MI / PostgreSQL / MySQL / SQL
Server 2025.
- Put
__rowMarker__ last, and give every open mirroring table folder a
_metadata.json with keyColumns, before expecting updates or deletes.
- Read the per-source limitations page before committing to a source.
PREFER
- Setting
retentionInDays explicitly over trusting a default the docs
disagree about.
- Mirror once and shortcut, over mirroring the same source in several
workspaces.
defaultSchema on creation, over discovering flattened schema names later
and having to recreate the item.
- Enabling delta change data feed selectively, per mirrored database.
AVOID
- Planning on changing the source database, the item owner, or
keyColumns
later — all three mean recreating the item.
stopMirroring/startMirroring as a routine fix; it reseeds every table.
- Assuming source RLS, column permissions, masking, or sensitivity labels
reach OneLake. They do not.
- Quoting a per-source table cap or limit from memory — the pages disagree
with each other and with the general limits.
12. See also
fabric-copy-job — guided many-source → many-destination ingestion, with
configurable full/incremental modes. The other "no-pipeline" item.
fabric-database — Fabric SQL database, which mirrors to OneLake
automatically with nothing to configure.
fabric-rest-api — generic Fabric REST patterns behind §6.
fabric-security — the workspace-role and OneLake security model that
mirrored-item sharing sits on.
fabric-eventhouse, fabric-realtime-dashboard — the Azure Monitor
mirrored catalog surfaces through an Eventhouse endpoint.
1---2name: fabric-mirroring3description: Use for Mirroring in Fabric — the `MirroredDatabase` item that brings an external database or catalog into OneLake with no ETL pipeline. Three kinds, and which each source uses: database mirroring (continuous replication to Delta — Azure SQL DB/MI, SQL Server, Cosmos DB, PostgreSQL, MySQL, Oracle, SAP, BigQuery), metadata mirroring (catalog sync over OneLake shortcuts, data never moves — Snowflake, Databricks, Dremio, AWS Glue, Azure Monitor), open mirroring (you write change files to a landing zone). REST surface (`mirroring.json`, `mountedTables`, `retentionInDays`, startMirroring/getTablesMirroringStatus), landing-zone protocol (`_metadata.json` keyColumns, `__rowMarker__`), extended capabilities (change data feed, mirroring views), and gotchas: 1,000-table cap, 1 TB/day throttle, no views, DDL and capacity-pause reseeds, varchar truncation, RLS/DDM not propagated. For many-source→many-destination ingestion use fabric-copy-job.4---56# Mirroring in Fabric78Mirroring brings an external database or catalog into OneLake as a unit —9no ETL pipeline, no orchestration, no compute you allocate. It creates a10**`MirroredDatabase`** item plus an autogenerated read-only **SQL analytics11endpoint**.1213There is **no local file artifact** (unlike TMDL or PBIR). You configure14mirroring in the portal or through the REST API.1516## 1. Three kinds — settle this first1718Every later answer depends on which kind you are in. All three are called19"mirroring", and only one of them copies data.2021| Kind | Mechanism | Data location | Latency |22| --- | --- | --- | --- |23| **Database mirroring** | Continuous replication into OneLake as Delta | Copied into OneLake | Changes published as fast as **every 15 s** |24| **Metadata mirroring** | Syncs catalog names, schemas, tables; reads through **OneLake shortcuts** | Stays at the source | Source access + shortcut time; no replication step |25| **Open mirroring** | *You* write change files to a landing zone; Fabric merges them into Delta | Copied into OneLake | As fast as you land files |2627**Database mirroring is source-driven, not polled.** The source engine28identifies changed data — SQL Server 2025 scans its own transaction log —29and publishes to a Fabric landing zone. A replicator engine inside Fabric30scans for new files at high frequency and merges them into the target Delta31table. **Backoff logic** slows polling for idle tables to avoid loading the32source engine, and resumes automatically when changes reappear.3334**Metadata mirroring supports cross-tenant consumption** precisely because35it is shortcuts underneath — you can read live governed data from another36tenant via OneLake external data sharing with no copy.3738## 2. Which kind each source uses3940From the `mirroring/overview` platform table as of 2026-08-30.4142| Source | Kind |43| --- | --- |44| Azure SQL Database, Azure SQL Managed Instance, SQL Server | Database |45| Fabric SQL database | Database — **automatic, nothing to configure** |46| Azure Cosmos DB | Database |47| Azure Database for PostgreSQL | Database |48| Azure Database for MySQL (preview) | Database |49| Google BigQuery | Database — **GA as of Aug 2026** |50| Oracle, SAP | Database |51| SharePoint List (preview) | Database |52| Snowflake | Metadata |53| Azure Databricks | Metadata (Unity Catalog structure) |54| Dremio catalog (preview) | Metadata |55| AWS Glue catalog (preview) | Metadata — Iceberg tables stay in S3 |56| Azure Monitor (preview) | Metadata — connection-based, surfaces via Eventhouse |57| Open mirrored database | Open |5859Per-source limits, auth, and setup detail: `references/source-matrix.md`.60**Read the source's own limitations page before promising behaviour** — the61per-source pages carry constraints the general docs don't, and they lag62each other (see the table-cap conflict in §8).6364## 3. Mirroring vs Copy job vs shortcut vs pipeline6566Both Mirroring and Copy job are pitched as "no pipeline". They are not67interchangeable.6869- **Mirroring** — you want an *entire external database or catalog* in70 Fabric, continuously in sync, as a unit. You do not choose a schedule.71- **Copy job** (`fabric-copy-job`) — you want *guided many-source →72 many-destination movement* with full or incremental modes you configure,73 including into destinations mirroring cannot target.74- **Shortcut** — you want *specific* tables, folders, or files referenced in75 place. Open formats only. Mirroring is your only option if the source76 stores data in a proprietary format.77- **Pipeline / dataflow / eventstream** — you need multi-source transformation78 logic, your own schedule or trigger, a destination outside OneLake, or79 streaming.8081They compose: **mirror once, consume everywhere** — one workspace mirrors the82source, other workspaces shortcut to the mirrored tables rather than mirroring83the same source again. Shortcuts to mirrored tables are read-only, inherit the84mirrored item's security model, and show the mirrored item's error state if85replication breaks.8687## 4. What you get8889- A `MirroredDatabase` item and an autogenerated **read-only SQL analytics90 endpoint** — same experience as the Lakehouse SQL analytics endpoint, same91 limitations.92- **Direct Lake** works over mirrored data with no extra step; it is Delta in93 OneLake.94- **Cross-database queries** with three-part names, joining mirrored95 databases, warehouses, and Lakehouse SQL analytics endpoints in one T-SQL96 query.97- **Sharing** a mirrored database also grants access to its SQL analytics98 endpoint, without granting workspace access.99100## 5. Cost, retention, and capacity101102- **Core mirroring compute is free** and does not consume CUs. Querying the103 data via SQL, Power BI, or Spark bills at normal rates, as do direct104 OneLake requests.105- **Storage is free up to 1 TB per capacity unit** — an F64 gets 64 TB of106 mirroring storage. You pay OneLake rates above that, or when the capacity107 is paused.108- **A running capacity is required.** Paused → mirroring stops and the item109 isn't listable. Resumed → status shows **Paused** and you must select110 **Resume replication** manually. A *long* pause can force a full reseed,111 because the source transaction log can't truncate while mirroring is112 stopped. Trial expiry stops mirroring outright.113- **Extended capabilities are paid** (§7).114- **Retention**: mirroring auto-vacuums old Delta files. Configure via115 `retentionInDays`, allowed 1–30. The docs conflict on the default —116 `mirroring/overview` says 1 day for mirrored databases created from the117 portal after mid-June 2025 (7 for older ones), while118 `mirrored-database-rest-api` says flatly 7. **Set it explicitly rather than119 relying on the default.**120121## 6. REST API122123Item CRUD lives under `mirroredDatabases`; start/stop/status are separate124operations. **These APIs do not apply to Azure Databricks mirrored125databases.** Generic Fabric REST patterns (LRO polling, continuation tokens,126the definition envelope) are in `fabric-rest-api`.127128```129POST /v1/workspaces/{ws}/mirroredDatabases create130GET /v1/workspaces/{ws}/mirroredDatabases list131GET /v1/workspaces/{ws}/mirroredDatabases/{id} get132PATCH /v1/workspaces/{ws}/mirroredDatabases/{id} rename/describe133DELETE /v1/workspaces/{ws}/mirroredDatabases/{id} delete134POST .../{id}/getDefinition .../{id}/updateDefinition135POST .../{id}/startMirroring .../{id}/stopMirroring136POST .../{id}/getMirroringStatus .../{id}/getTablesMirroringStatus137```138139**A data source connection must exist first** — create it in the portal or140via the Connections API, then reference its ID in the definition.141142The definition is a single part, `mirroring.json`, base64 as143`InlineBase64`:144145```json146{147 "properties": {148 "source": {149 "type": "<source type>",150 "typeProperties": { "connection": "<connection GUID>", "database": "xxxx" }151 },152 "target": {153 "type": "MountedRelationalDatabase",154 "typeProperties": {155 "defaultSchema": "xxxx",156 "format": "Delta",157 "retentionInDays": 1,158 "enableDeltaChangeDataFeed": true159 }160 }161 }162}163```164165- Omit `mountedTables` to mirror the whole database; supply it — an array of166 `{ "source": { "typeProperties": { "schemaName", "tableName" } } }` — to167 mirror selected tables. `updateDefinition` refreshes that list to add or168 remove tables.169- `defaultSchema` preserves the source schema hierarchy. Without it, older170 mirrored databases flatten the schema into the table name and the only fix171 is recreating the item. (The REST doc's prose misspells this as172 `deafultSchema`; the property is `defaultSchema`, as its own examples show.)173- `connection`, `database`, and `defaultSchema` can only be updated while174 **Get mirroring status** returns `Initialized` or `Stopped`.175- `startMirroring` fails while status is `Initializing`.176177**The non-obvious prerequisite.** For Azure SQL Database, Azure SQL Managed178Instance, Azure Database for PostgreSQL, Azure Database for MySQL, and SQL179Server 2025 you must additionally: (1) enable the source server's managed180identity, and (2) grant that identity **Read and Write** on the mirrored181database — **currently portal-only**, or via the Add Workspace Role182Assignment API. Nothing in the create call surfaces this; mirroring simply183doesn't work without it.184185.NET SDK support requires `Microsoft.Fabric.Api` **≥ 1.0.0-beta.11**.186187## 7. Extended capabilities (paid, preview)188189Core mirroring is free; these are not. Billing resumed in all regions the190week of 2026-05-25.191192- **Delta change data feed (CDF)** — row-level insert/update/delete tracking,193 enabled per mirrored database via `enableDeltaChangeDataFeed`. Available194 for all mirroring sources including open mirroring partners. Billed on195 incremental compute for real changes only — no charge for idle periods —196 and it increases storage through extra `_change_data` files. Enable197 selectively.198- **Mirroring views** — replicates source view logic instead of physical199 tables. **Snowflake only** in preview.200201Core mirroring pricing is unaffected by enabling either.202203## 8. Limits and gotchas204205**Capacity limits**206207- **1,000 tables** per mirrored database. "Mirror all data" takes the first208 1,000 sorted by schema then table name; the rest are silently not209 mirrored. *Per-source pages can be lower and can lag* — `snowflake-limitations`210 still states 500.211- **1 TB of change data per mirrored database per day.** Exceeding it212 produces "The replication is being throttled and expected to continue at213 …"; wait it out.214215**Things that cannot be changed after creation**216217- **The source database.** Not supported — create a new mirrored database.218- **Item ownership.** Not supported. If the owner leaves the organization,219 recreate the mirrored database.220- **`keyColumns`** in open mirroring, once set.221222**Things that trigger a reseed**223224- Any DDL change on a mirrored source table reseeds *that* table.225- `stopMirroring` then `startMirroring` reseeds **all** tables from scratch.226- A long capacity pause can force a full reseed.227228**Data-shape traps**229230- **Views are not replicated** by core mirroring — regular tables only.231 (Mirroring views is the paid preview add-on in §7.)232- **varchar truncation.** The SQL analytics endpoint supports `varchar(max)`233 to 16 MB, but only for tables created **after 2025-11-18**, and per-item234 caps are lower — 1 MB for mirrored SQL Server / Azure SQL / MI and Fabric235 SQL database, 2 MB for Cosmos DB. Tables created before that date are236 `varchar(8000)` and must be recreated.237- **Columns with spaces or special characters** (`, ; { } ( ) \n \t =`)238 replicate via Delta column mapping — but tables already replicating from239 before that feature need the table removed and re-added, or a full stop and240 restart, to pick the columns up.241242**Security does not travel**243244Row-level security, object-level permissions, dynamic data masking, and245Purview sensitivity labels defined on the source are **not** propagated to246the replicated data in OneLake. Secure the mirrored item on the Fabric side;247see `fabric-security`.248249**Dropping in the source is asymmetric**250251- Mirroring *all* data + source table dropped → mirrored table is deleted.252- Mirroring a *selective list* + source table dropped → the mirrored table253 stays, with "The source table doesn't exist" in monitoring. Remove it from254 the configuration to delete it.255- Dropping a source *schema* leaves an empty schema in the SQL analytics256 endpoint either way.257258## 9. Open mirroring landing zone259260You get a landing zone URL on the mirrored database's Home page. Write261Parquet or delimited text (uncompressed, or Snappy / GZIP / ZSTD) into262per-table folders:263264```265https://onelake.dfs.fabric.microsoft.com/<workspace id>/<mirrored db id>/Files/LandingZone/TableA266 .../LandingZone/Schema1.schema/TableB267```268269Non-negotiable rules:270271- **Every table folder needs `_metadata.json`** declaring `keyColumns`.272 Without it, updates and deletes are impossible — everything is an insert.273 It can be added later, but `keyColumns` is immutable once set.274- **`__rowMarker__` must be the final column.** Values: `0` insert,275 `1` update, `2` delete, `4` upsert.276- **File names are 20 digits**, `00000000000000000001.parquet`, continuous277 and monotonically increasing. Fabric deletes processed files but leaves the278 last one so you can find your place.279- **Omit `__rowMarker__` on the initial load** — the whole file is treated as280 INSERT, which is faster and gives better metrics.281- **Updates must carry the full row**, every column.282- Schema folders are named `<schemaname>.schema`.283284Full protocol — delimited-text properties, supported data types, table and285column operations, nonsequential-file mode, the cleanup process — is in286`references/open-mirroring.md`.287288## 10. When nothing is replicating289290Work down, in order:2912921. **Portal → Monitor replication.** Database status is one of *Running*,293 *Running with warning*, *Stopping/Stopped*, *Failed*, *Paused*. Check the294 **Last completed** column per table — empty means that table has never295 mirrored. Programmatically: `getTablesMirroringStatus`, which returns296 per-table status plus `processedRows`, `processedBytes`, `lastSyncDateTime`.2972. **Is it a capacity state?** *Paused* means the capacity was paused and298 resumed — you must select **Resume replication**.2993. **Is the data in OneLake?** Shortcut the mirrored tables into a Lakehouse300 and query with Spark. If it is there, the problem is downstream.3014. **Is it only the SQL analytics endpoint?** Data in OneLake but not in302 T-SQL is a metadata-sync delay. Hit **Refresh** on the SQL analytics303 endpoint page and re-query.3045. **Enable workspace monitoring** for latency: mirrored-database operation305 logs land in the `MirroredDatabaseTableExecution` table in the monitoring306 KQL database; `ReplicatorBatchLatency` is the execution-latency value.3076. **Then go source-specific.** Azure SQL DB, Azure SQL MI, MySQL, and308 PostgreSQL each have their own troubleshooting page with SQL checks.309310Common non-bugs: **views** aren't replicated; **columns are missing**311because their type is unsupported — check the Alert icon next to the table312under **Configure replication**.313314## 11. Constraints315316**MUST**317318- Establish which of the three kinds you are in before answering anything319 about latency, cost, or where the data physically lives.320- Create the source connection before the mirrored database.321- Enable the source server's managed identity **and** grant it Read/Write on322 the mirrored database for Azure SQL DB / MI / PostgreSQL / MySQL / SQL323 Server 2025.324- Put `__rowMarker__` last, and give every open mirroring table folder a325 `_metadata.json` with `keyColumns`, before expecting updates or deletes.326- Read the per-source limitations page before committing to a source.327328**PREFER**329330- Setting `retentionInDays` explicitly over trusting a default the docs331 disagree about.332- Mirror once and shortcut, over mirroring the same source in several333 workspaces.334- `defaultSchema` on creation, over discovering flattened schema names later335 and having to recreate the item.336- Enabling delta change data feed selectively, per mirrored database.337338**AVOID**339340- Planning on changing the source database, the item owner, or `keyColumns`341 later — all three mean recreating the item.342- `stopMirroring`/`startMirroring` as a routine fix; it reseeds every table.343- Assuming source RLS, column permissions, masking, or sensitivity labels344 reach OneLake. They do not.345- Quoting a per-source table cap or limit from memory — the pages disagree346 with each other and with the general limits.347348## 12. See also349350- `fabric-copy-job` — guided many-source → many-destination ingestion, with351 configurable full/incremental modes. The other "no-pipeline" item.352- `fabric-database` — Fabric SQL database, which mirrors to OneLake353 automatically with nothing to configure.354- `fabric-rest-api` — generic Fabric REST patterns behind §6.355- `fabric-security` — the workspace-role and OneLake security model that356 mirrored-item sharing sits on.357- `fabric-eventhouse`, `fabric-realtime-dashboard` — the Azure Monitor358 mirrored catalog surfaces through an Eventhouse endpoint.