This is an automated email from the ASF dual-hosted git repository.

morningman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris-website.git


The following commit(s) were added to refs/heads/master by this push:
     new b3c8d921f23 [docs] Add verified migration guides for dev and 4.x 
(#3341)
b3c8d921f23 is described below

commit b3c8d921f234bd4336bc52a98712528627b73b14
Author: Yongqiang YANG <[email protected]>
AuthorDate: Fri Oct 16 14:40:49 2026 -0700

    [docs] Add verified migration guides for dev and 4.x (#3341)
    
    ## Summary
    
    Add five migration guides covering planning, MySQL, PostgreSQL,
    Elasticsearch, ClickHouse/Greenplum, and lakehouse sources. The guides
    distinguish querying external data from copying a stable snapshot and
    from continuously replicating updates and deletes.
    
    - Include source setup, driver and permission prerequisites, explicit
    target DDL, complete JDBC/ES imports, and expected sample results.
    - Explain source snapshot consistency, replay, NULL/decimal checks,
    document IDs, type/driver/version differences, and cutover validation.
    - Link to the maintained catalog/connector references for complete
    options instead of duplicating inaccurate type tables or implying
    source-engine equivalence.
    - Add matching navigation for both versions, including the Chinese
    category label.
    
    ## Versions
    
    - [x] dev
    - [x] 4.x
    - [ ] 3.x
    - [ ] 2.1 or older
    
    General batch migration guidance is synchronized across dev and 4.x.
    Native MySQL/PostgreSQL Streaming Job CDC is described only in dev and
    marked accordingly; 4.x uses the connector reference available in that
    version. JDBC timestamp/binary differences since 4.1.5 are stated
    explicitly.
    
    ## Languages
    
    - [x] English
    - [x] Chinese
    
    ## Validation
    
    Verified JDBC MySQL/PostgreSQL/ClickHouse and ES mappings against
    current Doris master and branch-4.0/4.1/4.2 source. Reviewed CDC
    prerequisites and at-least-once semantics against the current native CDC
    reference and source configuration. Rebased all 12 commits onto website
    master.
    
    - Internal links: 0 findings across the 20 changed pages.
    - Version/language synchronization: 0 findings.
    - Feature-document checks: 0 findings.
    - Navigation JSON and git diff whitespace checks passed.
    - No Doris cluster or website build was run; examples were statically
    reviewed against the implementation.
    
    ---------
    
    Co-authored-by: Claude Opus 4.5 <[email protected]>
    Co-authored-by: morningman <[email protected]>
---
 docs/migration/elasticsearch-to-doris.md           | 107 +++++++++++++++++++
 docs/migration/mysql-to-doris.md                   | 118 +++++++++++++++++++++
 docs/migration/other-olap-to-doris.md              |  68 ++++++++++++
 docs/migration/overview.md                         |  56 ++++++++++
 docs/migration/postgresql-to-doris.md              | 118 +++++++++++++++++++++
 .../docusaurus-plugin-content-docs/current.json    |   4 +
 .../current/migration/elasticsearch-to-doris.md    | 107 +++++++++++++++++++
 .../current/migration/mysql-to-doris.md            | 118 +++++++++++++++++++++
 .../current/migration/other-olap-to-doris.md       |  68 ++++++++++++
 .../current/migration/overview.md                  |  56 ++++++++++
 .../current/migration/postgresql-to-doris.md       | 118 +++++++++++++++++++++
 .../version-4.x.json                               |   4 +
 .../migration/elasticsearch-to-doris.md            | 107 +++++++++++++++++++
 .../version-4.x/migration/mysql-to-doris.md        | 112 +++++++++++++++++++
 .../version-4.x/migration/other-olap-to-doris.md   |  68 ++++++++++++
 .../version-4.x/migration/overview.md              |  56 ++++++++++
 .../version-4.x/migration/postgresql-to-doris.md   | 112 +++++++++++++++++++
 sidebars.ts                                        |  12 +++
 .../migration/elasticsearch-to-doris.md            | 107 +++++++++++++++++++
 .../version-4.x/migration/mysql-to-doris.md        | 112 +++++++++++++++++++
 .../version-4.x/migration/other-olap-to-doris.md   |  68 ++++++++++++
 versioned_docs/version-4.x/migration/overview.md   |  56 ++++++++++
 .../version-4.x/migration/postgresql-to-doris.md   | 112 +++++++++++++++++++
 versioned_sidebars/version-4.x-sidebars.json       |  15 +++
 24 files changed, 1879 insertions(+)

diff --git a/docs/migration/elasticsearch-to-doris.md 
b/docs/migration/elasticsearch-to-doris.md
new file mode 100644
index 00000000000..574093fce9f
--- /dev/null
+++ b/docs/migration/elasticsearch-to-doris.md
@@ -0,0 +1,107 @@
+---
+{
+    "title": "Elasticsearch to Doris",
+    "language": "en",
+    "description": "Copy indexes through an ES Catalog and validate fields, 
document IDs, and search semantics."
+}
+---
+
+Use an ES Catalog to query Elasticsearch indexes, then copy selected columns 
into Doris internal tables with `INSERT INTO ... SELECT`. This example is a 
small one-time migration and does not continuously propagate later updates or 
deletes. Search workloads also require separate validation of analyzers, 
scoring, nested objects, and query semantics.
+
+## Prerequisites
+
+This example uses the typeless mapping API in Elasticsearch 7.x or 8.x. Adapt 
index setup for other source versions and check the catalog support range.
+
+- An accessible Elasticsearch cluster and an account that can create, write, 
and read the sample index. A production migration account also needs catalog 
metadata permissions; see [ES Catalog](../lakehouse/catalogs/es-catalog.md).
+- Connectivity from every Doris FE/BE to ES, and a Doris account allowed to 
create catalogs/databases/tables, read external tables, and load the target.
+- An empty target table. Replace connection addresses and credentials. One 
replica and one bucket are used only to keep the example small.
+
+## Basic usage
+
+### 1. Prepare the source index
+
+Run in Elasticsearch Dev Tools or an equivalent HTTP client:
+
+```http
+PUT /migration_demo
+{
+  "mappings": {
+    "properties": {
+      "title": { "type": "keyword" }
+    }
+  }
+}
+
+PUT /migration_demo/_doc/one?refresh=true
+{ "title": "first" }
+
+PUT /migration_demo/_doc/two?refresh=true
+{ "title": "second" }
+```
+
+Expected result: the index contains two searchable documents with IDs `one` 
and `two`.
+
+### 2. Create the catalog and preserve document IDs
+
+```sql
+CREATE CATALOG migration_es PROPERTIES (
+    'type' = 'es',
+    'hosts' = 'http://es-host:9200',
+    'user' = '<es_user>',
+    'password' = '<es_password>',
+    'mapping_es_id' = 'true'
+);
+DESC migration_es.default_db.migration_demo;
+
+CREATE DATABASE IF NOT EXISTS migration_target;
+CREATE TABLE migration_target.es_demo (
+    doc_id VARCHAR(512),
+    title STRING
+)
+DUPLICATE KEY(doc_id)
+DISTRIBUTED BY HASH(doc_id) BUCKETS 1
+PROPERTIES ('replication_num' = '1');
+
+INSERT INTO migration_target.es_demo (doc_id, title)
+SELECT _id, title FROM migration_es.default_db.migration_demo;
+
+SELECT doc_id, title FROM migration_target.es_demo ORDER BY doc_id;
+```
+
+```text
++--------+--------+
+| doc_id | title  |
++--------+--------+
+| one    | first  |
+| two    | second |
++--------+--------+
+```
+
+## Options reference
+
+| Parameter | Type | Required | Default | Description |
+| --- | --- | --- | --- | --- |
+| `hosts` | STRING | Yes | None | ES HTTP addresses reachable from every FE/BE 
|
+| `user` / `password` | STRING | Depends on ES authentication | Empty | 
Credentials when Basic authentication is enabled |
+| `mapping_es_id` | boolean | No | `false` | Exposes document `_id`; enabled 
in this example |
+| `enable_docvalue_scan` | boolean | No | `true` | Attempts doc-values reads 
for supported fields |
+| `nodes_discovery` | boolean | No | `true` | Discovers nodes; may need 
disabling in isolated networks |
+
+See [ES Catalog](../lakehouse/catalogs/es-catalog.md) for all parameters, 
authentication, and array annotations.
+
+## Types and search semantics
+
+- The ES Catalog maps `object` and `nested` to JSON, not automatically to 
VARIANT. Convert explicitly and test before using a different target type.
+- ES fields may contain both scalars and arrays. Configure 
`_meta.doris.array_fields` as documented, inspect `DESC`, and examine real 
samples rather than inferring the entire column from one document.
+- Validate date formats, time zones, numeric ranges, and missing fields. An 
analyzed `text` field differs from a `keyword` field used for exact matching.
+- Doris [inverted indexes](../table-design/index/inverted-index/overview.md) 
support full-text search, but ES DSL, scoring, nested queries, and analyzers 
are not automatically equivalent. Test real query results rather than 
mechanically replacing syntax.
+
+## Validation and errors
+
+During a write-free source window, compare document counts and distinct `_id` 
counts; both should be 2 in this example. Compare original `_source` samples 
with target columns, including missing values, JSON arrays, and dates.
+
+For metadata errors, check index-read, cluster-state, and node HTTP 
permissions. For paging failures, check source-node connectivity and 
node-discovery settings. Index changes during migration can affect consistency; 
establish a stable snapshot or a defined write-free window. Repeating INSERT 
appends rows, so establish the imported ranges before resuming.
+
+## Best practices
+
+Verify field reads and search semantics before scaling to batches. Continuous 
mirrors need separately designed updates, deletes, ordering, and replay by 
document ID; a catalog is not a CDC task. See [Migration 
Overview](./overview.md) for cutover guidance.
diff --git a/docs/migration/mysql-to-doris.md b/docs/migration/mysql-to-doris.md
new file mode 100644
index 00000000000..e4fbbb8614d
--- /dev/null
+++ b/docs/migration/mysql-to-doris.md
@@ -0,0 +1,118 @@
+---
+{
+    "title": "MySQL to Doris",
+    "language": "en",
+    "description": "Migrate MySQL in batches with JDBC and choose CDC, type 
mappings, and validation."
+}
+---
+
+This guide uses the MySQL JDBC Catalog to copy a stable snapshot into a Doris 
internal table. It suits one-time or scheduled batch migration and does not 
automatically propagate later updates, deletes, or DDL. See the CDC options 
below for continuous synchronization.
+
+## Prerequisites
+
+- A MySQL database named `migration_source` and a source account with SELECT 
access to the sample table.
+- Connectivity from every Doris FE/BE to the source. Install 
`mysql-connector-j-8.3.0.jar` following the [MySQL 
Catalog](../lakehouse/catalogs/jdbc-mysql-catalog.md) and [driver 
deployment](../lakehouse/catalogs/jdbc-catalog-overview.md) references. The 
example uses a driver filename, so the Jar must exist in `jdbc_drivers_dir` on 
all FE/BE nodes.
+- A Doris account with permissions to create catalogs/databases/tables, read 
the external table, and load the target. See 
[authorization](../admin-manual/auth/authorization/internal.md).
+- Run the source setup inside `migration_source`; use an empty target table. 
Replace the sample hosts, username, and password.
+
+## Basic usage
+
+### 1. Prepare the source table
+
+Prepare this sample in the source database using an account with CREATE and 
INSERT privileges. The catalog connection uses the source read account 
described above.
+
+```sql
+CREATE TABLE migration_demo (
+    id BIGINT PRIMARY KEY,
+    amount DECIMAL(12,2),
+    note VARCHAR(100)
+);
+INSERT INTO migration_demo VALUES (1, 12.50, 'first'), (2, NULL, NULL);
+```
+
+Result: the table is created with 2 rows.
+
+### 2. Create and inspect the catalog in Doris
+
+```sql
+CREATE CATALOG migration_mysql PROPERTIES (
+    'type' = 'jdbc',
+    'user' = 'migration_reader',
+    'password' = '<source_password>',
+    'jdbc_url' = 'jdbc:mysql://mysql-host:3306/migration_source',
+    'driver_url' = 'mysql-connector-j-8.3.0.jar',
+    'driver_class' = 'com.mysql.cj.jdbc.Driver'
+);
+DESC migration_mysql.migration_source.migration_demo;
+```
+
+The external schema should contain `id`, `amount`, and `note`. Inspect their 
actual mapped types before creating the target.
+
+### 3. Create the target and copy the data
+
+```sql
+CREATE DATABASE IF NOT EXISTS migration_target;
+CREATE TABLE migration_target.mysql_demo (
+    id BIGINT NOT NULL,
+    amount DECIMAL(12,2),
+    note STRING
+)
+DUPLICATE KEY(id)
+DISTRIBUTED BY HASH(id) BUCKETS 1
+PROPERTIES ('replication_num' = '1');
+
+INSERT INTO migration_target.mysql_demo (id, amount, note)
+SELECT id, amount, note FROM migration_mysql.migration_source.migration_demo;
+
+SELECT id, amount, note FROM migration_target.mysql_demo ORDER BY id;
+```
+
+```text
++------+--------+-------+
+| id   | amount | note  |
++------+--------+-------+
+|    1 |  12.50 | first |
+|    2 |   NULL | NULL  |
++------+--------+-------+
+```
+
+One replica and one bucket keep the example suitable for local verification. 
Size production tables for available BEs and reliability requirements. 
Repeating the INSERT appends duplicate rows.
+## Connection options
+
+| Parameter | Type | Required / default | Description |
+| --- | --- | --- | --- |
+| `type` | STRING | Required, no default | Use `jdbc` |
+| `user` / `password` | STRING | Required, no default | Source database 
credentials |
+| `jdbc_url` | STRING | Required, no default | Source JDBC connection URL, 
including the database name |
+| `driver_url` | STRING | Required, no default | Jar accessible to every 
FE/BE; this example uses a preinstalled filename |
+| `driver_class` | STRING | Required, no default | Java class for the selected 
driver |
+
+See the [full JDBC reference](../lakehouse/catalogs/jdbc-catalog-overview.md) 
for connection pools, name mapping, and driver-location controls.
+
+## Types and version differences {#data-type-mapping}
+
+- Widen unsigned integers: for example, `INT UNSIGNED` maps to `BIGINT` and 
`BIGINT UNSIGNED` to `LARGEINT`. Do not copy their signed equivalents unchanged.
+- The MySQL JDBC Catalog maps JSON to `STRING`, not automatically to 
`VARIANT`. Follow catalog mappings for `TIME`, `ENUM`, and `SET`; JDBC and CDC 
do not necessarily use the same rules.
+- JDBC metadata for `TINYINT(1)` depends on driver settings. Inspect `DESC` 
rather than treating every TINYINT as Boolean.
+- In the 4.1 series since 4.1.5, `TIMESTAMP` uses `TIMESTAMPTZ` and binary 
types use `VARBINARY`; `DATETIME` remains a time-zone-free date-time. Earlier 
mappings and configuration differ. Dev uses the current mapping.
+- Batch INSERT does not copy primary-key behavior, AUTO_INCREMENT, indexes, or 
source constraints. See the [MySQL mapping 
reference](../lakehouse/catalogs/jdbc-mysql-catalog.md) for complete rules.
+
+## Continuous synchronization
+
+Use [Flink CDC 
synchronization](../connection-integration/data-integration/flink-doris-connector/cdc-sync.md)
 when the migration must hand off an initial snapshot and propagate later 
updates/deletes. Choose compatible Flink, CDC, and Doris Connector versions 
from the connector reference rather than combining independent minimum-version 
claims.
+
+<version since="dev">
+
+</version>
+
+Dev also provides [native MySQL 
CDC](../data-operate/import/import-way/streaming-job/continuous-load-mysql-database.md).
 This auto-table-creation route requires source primary keys and currently 
provides at-least-once semantics. Follow that reference for log permissions, 
replication resources, and monitoring; do not apply this page's JDBC type 
mappings to it.
+
+## Validation and errors
+
+For the same snapshot and bounded range, run `COUNT(*)`, `COUNT(amount)`, and 
`SUM(amount)` on source `migration_mysql.migration_source.migration_demo` and 
target `migration_target.mysql_demo`. This example should return `2`, `1`, and 
`12.50`, respectively. Also inspect exact sample values, NULLs, precision, and 
time zones. See [Migration Overview](./overview.md) for full validation and 
cutover.
+
+For connection failures, check connectivity from all FE/BE nodes, driver 
files, source permissions, and driver-location restrictions. Inspect `DESC` and 
convert explicitly for incompatible types. After a failed import, establish 
which ranges were written before retrying; do not blindly repeat the entire 
INSERT.
+
+## Best practices
+
+Validate the environment with this small table, then batch larger migrations 
by stable keys or time ranges. Continuous replication needs a target model that 
handles updates, deletes, and replay; design snapshot tables and ongoing 
mirrors separately.
diff --git a/docs/migration/other-olap-to-doris.md 
b/docs/migration/other-olap-to-doris.md
new file mode 100644
index 00000000000..40484b1e1fa
--- /dev/null
+++ b/docs/migration/other-olap-to-doris.md
@@ -0,0 +1,68 @@
+---
+{
+    "title": "Other OLAP Systems to Doris",
+    "language": "en",
+    "description": "Choose migration routes and validation for ClickHouse, 
Greenplum, and lakehouse tables."
+}
+---
+
+ClickHouse, Greenplum, and lakehouse tables can be copied to Doris through 
their corresponding catalogs. Define snapshot, update, and aggregation 
semantics before selecting a target model; source storage engines do not have 
automatic, complete Doris equivalents.
+
+## Routes and prerequisites
+
+| Source | Connection and options reference | Checks before migration |
+| --- | --- | --- |
+| ClickHouse | [ClickHouse JDBC 
Catalog](../lakehouse/catalogs/jdbc-clickhouse-catalog.md) | Drivers, unsigned 
integers, date-time and complex-type mappings |
+| Greenplum | [PostgreSQL JDBC 
Catalog](../lakehouse/catalogs/jdbc-pg-catalog.md) | Compatible driver, actual 
metadata, and consistency of distributed exports |
+| Hive | [Hive Catalog](../lakehouse/catalogs/hive-catalog.mdx) | Metastore, 
file storage, authentication, and partitions |
+| Iceberg | [Iceberg Catalog](../lakehouse/catalogs/iceberg-catalog.mdx) | 
Metadata service, storage permissions, and a consistent snapshot |
+| Hudi | [Hudi Catalog](../lakehouse/catalogs/hudi-catalog.md) | Table type, 
visible view, underlying files, and query limitations |
+
+Every FE/BE must reach the required services, drivers, and storage. Configure 
a catalog following its reference and use a Doris account allowed to read the 
external table and create/load the target.
+
+## ClickHouse {#clickhouse}
+
+Use the JDBC Catalog and explicit columns in `INSERT INTO ... SELECT`. Run 
`DESC` first; suggested target designs are not the actual JDBC mappings. For 
example, the catalog does not promise a direct CHAR mapping for ClickHouse 
`FixedString`; test Map/Tuple and other complex-type support for the actual 
driver and Doris version.
+
+For `ReplacingMergeTree`, `CollapsingMergeTree`, and aggregate-state tables, 
establish the final visible rows, version columns, deletion markers, and merge 
rules. A Doris Unique Key table does not automatically reproduce all 
source-engine semantics. Test SQL differences involving NULLs, tied extrema, 
array expansion, and JSON string extraction.
+
+## Greenplum {#greenplum}
+
+Follow the batch workflow in [PostgreSQL migration](./postgresql-to-doris.md), 
checking the actual Greenplum mappings. Parallel exports and SQL batches must 
share a consistent source view; concurrency alone does not establish a 
cross-table snapshot.
+
+## Data lake {#data-lake}
+
+Use the respective Hive, Iceberg, and Hudi catalogs. Pin the intended Iceberg 
snapshot during migration. For Hudi, establish which view is read and which 
table types the deployed version supports. Creating a catalog only makes 
external data accessible; it does not create a Doris copy.
+
+## Basic usage
+
+Assume `source_catalog` is configured as described above and 
`analytics.migration_demo` contains `id BIGINT` and `value DECIMAL(12,2)`, with 
a fixed source snapshot. Verify these types with `DESC`, then run in Doris:
+
+```sql
+CREATE DATABASE IF NOT EXISTS migration_target;
+CREATE TABLE migration_target.olap_demo (
+    id BIGINT,
+    `value` DECIMAL(12,2)
+)
+DUPLICATE KEY(id)
+DISTRIBUTED BY HASH(id) BUCKETS 1
+PROPERTIES ('replication_num' = '1');
+
+INSERT INTO migration_target.olap_demo (id, `value`)
+SELECT id, `value` FROM source_catalog.analytics.migration_demo;
+
+SELECT COUNT(*), SUM(`value`) FROM source_catalog.analytics.migration_demo;
+SELECT COUNT(*), SUM(`value`) FROM migration_target.olap_demo;
+```
+
+Expected result: the empty target receives both selected columns from the 
source snapshot, and the two validation queries return equal row counts and 
sums. One replica and one bucket are illustrative; size production tables for 
resources and reliability. See [MySQL](./mysql-to-doris.md) or 
[PostgreSQL](./postgresql-to-doris.md) for a complete fixed-input example.
+
+## Other loading methods
+
+If a direct connection is unavailable, export supported files and use [S3 
Load](../data-operate/import/data-source/amazon-s3.md) or [Broker 
Load](../data-operate/import/import-way/broker-load-manual.md). Establish file 
formats, encoding, NULL representation, precision, and time zones before 
scaling the import.
+
+You can also use the [Spark 
Connector](../connection-integration/data-integration/spark-doris-connector.md) 
or [Flink 
Connector](../connection-integration/data-integration/flink-doris-connector/overview.md).
 Follow each connector's reference for batch/streaming capabilities, compatible 
versions, and semantics.
+
+## Errors and best practices
+
+Validate bounded samples before increasing batch sizes or concurrency. Convert 
unsupported types explicitly and inspect precision loss rather than skipping 
columns. Repeating INSERT into a Duplicate Key target appends duplicate rows; 
establish completed ranges before resuming. Complete the cross-system checks in 
[Migration Overview](./overview.md) before cutover and retain source data and a 
rollback route.
diff --git a/docs/migration/overview.md b/docs/migration/overview.md
new file mode 100644
index 00000000000..00e1e4a4495
--- /dev/null
+++ b/docs/migration/overview.md
@@ -0,0 +1,56 @@
+---
+{
+    "title": "Migration Overview",
+    "language": "en",
+    "description": "Choose a migration method, design target tables, and 
validate the result."
+}
+---
+
+Apache Doris supports migration through external catalogs, CDC tools, and file 
loading. Copying table data does not migrate source transactions, indexes, 
constraints, procedures, permissions, or SQL semantics. First decide whether 
you need a one-time snapshot or continuous propagation of updates and deletes.
+
+## Migration paths
+
+| Source | One-time or batch migration | Continuous synchronization |
+| --- | --- | --- |
+| [PostgreSQL](./postgresql-to-doris.md) | PostgreSQL JDBC Catalog + `INSERT 
INTO ... SELECT` | Flink CDC; native Streaming Jobs are also available in dev |
+| [MySQL](./mysql-to-doris.md) | MySQL JDBC Catalog + `INSERT INTO ... SELECT` 
| Flink CDC; native Streaming Jobs are also available in dev |
+| [Elasticsearch](./elasticsearch-to-doris.md) | ES Catalog + `INSERT INTO ... 
SELECT` | Design change capture, updates, and deletion handling separately |
+| [ClickHouse / Greenplum](./other-olap-to-doris.md) | The corresponding JDBC 
Catalog or file loading | Depends on the source system |
+| [Hive / Iceberg / Hudi](./other-olap-to-doris.md#data-lake) | The 
corresponding lakehouse catalog + `INSERT INTO ... SELECT` | Scheduled batches 
or an appropriate connector |
+
+A catalog makes external data queryable; creating one does not copy data into 
Doris internal tables. A batch `INSERT INTO ... SELECT` does not continuously 
capture later updates or deletes.
+
+## Basic workflow
+
+1. Verify connectivity from every FE/BE, driver deployment, source read 
permissions, and Doris permissions to create catalogs/tables and load data.
+2. Establish a stable source snapshot or a write-free window. Catalog queries 
across tables or batches do not automatically form a globally consistent 
snapshot.
+3. Inspect actual mappings with `DESC catalog.database.table` and design the 
target using an appropriate [data model](../table-design/data-model/intro.mdx). 
Do not directly copy source keys, engines, or indexes.
+4. Complete a small pilot migration. The MySQL and PostgreSQL guides include 
reproducible table setup, imports, and query results.
+5. Import bounded key or time ranges, record completed ranges and CDC 
positions, validate the result, and then switch read traffic.
+
+## Configuration and types
+
+| Item | What to verify |
+| --- | --- |
+| Catalog | Drivers, connection addresses, authentication, and driver-location 
controls; see [JDBC Catalog](../lakehouse/catalogs/jdbc-catalog-overview.md) or 
[ES Catalog](../lakehouse/catalogs/es-catalog.md) |
+| Target table | Key model, partitions, buckets, replicas, and update ordering 
|
+| Type mapping | Mapping depends on the import method, driver, and Doris 
version; JDBC mappings are not CDC mappings |
+| Time and binary data | Check time zones, microsecond precision, and byte 
preservation. Some JDBC mappings changed in 4.1.5; use the reference for the 
deployed version |
+| Incremental synchronization | Snapshot/log-position handoff, primary keys, 
replay, updates, and deletes |
+
+## Validation and cutover
+
+For the same source snapshot and bounded range, compare row counts, distinct 
keys, NULL counts, numeric sums, and extrema. Sample exact values for 
timestamps, decimals, binary data, arrays, and semi-structured columns. 
Matching row counts alone do not prove correctness.
+
+For continuous synchronization, test inserts, updates, and deletes, as well as 
lag and restart behavior. Switch application reads only after verification, 
retaining source data and a rollback route.
+
+## Errors and caveats
+
+- Repeating a batch INSERT may duplicate rows, particularly in Duplicate Key 
tables. Define a replay strategy before resuming. A Unique Key table does not 
automatically remove rows deleted at the source.
+- Source changes during multiple batches can cause gaps or duplication. Use a 
consistent snapshot, a write-free window, or a reliable CDC handoff.
+- For unsupported types, case differences, or precision changes, inspect the 
external table with `DESC`, convert explicitly, and validate again. Do not 
silently omit incompatible columns.
+- Synchronous INSERT, asynchronous load jobs, Flink, and Streaming Jobs use 
different status interfaces. Follow the relevant loading reference rather than 
relying on `SHOW LOAD` for every method.
+
+## Best practices
+
+Start with representative small tables, then size batches and concurrency for 
measured data volume, query load, and available resources. Verify query results 
and update semantics before cutover, and retain completed ranges and validation 
records.
diff --git a/docs/migration/postgresql-to-doris.md 
b/docs/migration/postgresql-to-doris.md
new file mode 100644
index 00000000000..e15df6ddffe
--- /dev/null
+++ b/docs/migration/postgresql-to-doris.md
@@ -0,0 +1,118 @@
+---
+{
+    "title": "PostgreSQL to Doris",
+    "language": "en",
+    "description": "Migrate PostgreSQL in batches with JDBC and choose CDC, 
type mappings, and validation."
+}
+---
+
+This guide uses the PostgreSQL JDBC Catalog to copy a stable snapshot into a 
Doris internal table. It suits one-time or scheduled batch migration and does 
not automatically propagate later updates, deletes, or DDL. See the CDC options 
below for continuous synchronization.
+
+## Prerequisites
+
+- A PostgreSQL database named `migration_source` and a source account with 
SELECT access to the sample table.
+- Connectivity from every Doris FE/BE to the source. Install 
`postgresql-42.5.6.jar` following the [PostgreSQL 
Catalog](../lakehouse/catalogs/jdbc-pg-catalog.md) and [driver 
deployment](../lakehouse/catalogs/jdbc-catalog-overview.md) references. The 
example uses a driver filename, so the Jar must exist in `jdbc_drivers_dir` on 
all FE/BE nodes.
+- A Doris account with permissions to create catalogs/databases/tables, read 
the external table, and load the target. See 
[authorization](../admin-manual/auth/authorization/internal.md).
+- Run the source setup inside `migration_source`; use an empty target table. 
Replace the sample hosts, username, and password.
+
+## Basic usage
+
+### 1. Prepare the source table
+
+Prepare this sample in the source database using an account with CREATE and 
INSERT privileges. The catalog connection uses the source read account 
described above.
+
+```sql
+CREATE TABLE public.migration_demo (
+    id BIGINT PRIMARY KEY,
+    amount DECIMAL(12,2),
+    note VARCHAR(100)
+);
+INSERT INTO public.migration_demo VALUES (1, 12.50, 'first'), (2, NULL, NULL);
+```
+
+Result: the table is created with 2 rows.
+
+### 2. Create and inspect the catalog in Doris
+
+```sql
+CREATE CATALOG migration_pg PROPERTIES (
+    'type' = 'jdbc',
+    'user' = 'migration_reader',
+    'password' = '<source_password>',
+    'jdbc_url' = 'jdbc:postgresql://pg-host:5432/migration_source',
+    'driver_url' = 'postgresql-42.5.6.jar',
+    'driver_class' = 'org.postgresql.Driver'
+);
+DESC migration_pg.public.migration_demo;
+```
+
+The external schema should contain `id`, `amount`, and `note`. Inspect their 
actual mapped types before creating the target.
+
+### 3. Create the target and copy the data
+
+```sql
+CREATE DATABASE IF NOT EXISTS migration_target;
+CREATE TABLE migration_target.pg_demo (
+    id BIGINT NOT NULL,
+    amount DECIMAL(12,2),
+    note STRING
+)
+DUPLICATE KEY(id)
+DISTRIBUTED BY HASH(id) BUCKETS 1
+PROPERTIES ('replication_num' = '1');
+
+INSERT INTO migration_target.pg_demo (id, amount, note)
+SELECT id, amount, note FROM migration_pg.public.migration_demo;
+
+SELECT id, amount, note FROM migration_target.pg_demo ORDER BY id;
+```
+
+```text
++------+--------+-------+
+| id   | amount | note  |
++------+--------+-------+
+|    1 |  12.50 | first |
+|    2 |   NULL | NULL  |
++------+--------+-------+
+```
+
+One replica and one bucket keep the example suitable for local verification. 
Size production tables for available BEs and reliability requirements. 
Repeating the INSERT appends duplicate rows.
+## Connection options
+
+| Parameter | Type | Required / default | Description |
+| --- | --- | --- | --- |
+| `type` | STRING | Required, no default | Use `jdbc` |
+| `user` / `password` | STRING | Required, no default | Source database 
credentials |
+| `jdbc_url` | STRING | Required, no default | Source JDBC connection URL, 
including the database name |
+| `driver_url` | STRING | Required, no default | Jar accessible to every 
FE/BE; this example uses a preinstalled filename |
+| `driver_class` | STRING | Required, no default | Java class for the selected 
driver |
+
+See the [full JDBC reference](../lakehouse/catalogs/jdbc-catalog-overview.md) 
for connection pools, name mapping, and driver-location controls.
+
+## Types and version differences {#data-type-mapping}
+
+- JDBC maps PostgreSQL `json/jsonb` to `STRING`, not automatically to 
`VARIANT`. Convert explicitly and validate if the target uses another type.
+- The catalog uses string mappings for PostgreSQL `time`, `timetz`, and 
`interval`. This does not mean that Doris lacks a TIME type.
+- `numeric` without usable precision, or outside the supported decimal range, 
may map to `STRING`. Inspect the external type before numeric calculations.
+- In the 4.1 series since 4.1.5, `timestamptz` maps to `TIMESTAMPTZ` and 
`bytea` to `VARBINARY`; earlier mappings and configuration differ. Dev uses the 
current mapping. Verify time zones, precision, and byte-for-byte binary 
equality.
+- Array dimension inference needs source data and can report an unsupported 
type when no usable data exists. Validate each column against the [PostgreSQL 
mapping reference](../lakehouse/catalogs/jdbc-pg-catalog.md).
+
+## Continuous synchronization
+
+Use [Flink CDC 
synchronization](../connection-integration/data-integration/flink-doris-connector/cdc-sync.md)
 when the migration must hand off an initial snapshot and propagate later 
updates/deletes. Choose compatible Flink, CDC, and Doris Connector versions 
from the connector reference rather than combining independent minimum-version 
claims.
+
+<version since="dev">
+
+</version>
+
+Dev also provides [native PostgreSQL 
CDC](../data-operate/import/import-way/streaming-job/continuous-load-postgresql-database.md).
 This auto-table-creation route requires source primary keys and currently 
provides at-least-once semantics. Follow that reference for log permissions, 
replication resources, and monitoring; do not apply this page's JDBC type 
mappings to it.
+
+## Validation and errors
+
+For the same snapshot and bounded range, run `COUNT(*)`, `COUNT(amount)`, and 
`SUM(amount)` on source `migration_pg.public.migration_demo` and target 
`migration_target.pg_demo`. This example should return `2`, `1`, and `12.50`, 
respectively. Also inspect exact sample values, NULLs, precision, and time 
zones. See [Migration Overview](./overview.md) for full validation and cutover.
+
+For connection failures, check connectivity from all FE/BE nodes, driver 
files, source permissions, and driver-location restrictions. Inspect `DESC` and 
convert explicitly for incompatible types. After a failed import, establish 
which ranges were written before retrying; do not blindly repeat the entire 
INSERT.
+
+## Best practices
+
+Validate the environment with this small table, then batch larger migrations 
by stable keys or time ranges. Continuous replication needs a target model that 
handles updates, deletes, and replay; design snapshot tables and ongoing 
mirrors separately.
diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/current.json 
b/i18n/zh-CN/docusaurus-plugin-content-docs/current.json
index 0f383b44844..bcf2196b8e3 100644
--- a/i18n/zh-CN/docusaurus-plugin-content-docs/current.json
+++ b/i18n/zh-CN/docusaurus-plugin-content-docs/current.json
@@ -3,6 +3,10 @@
     "message": "dev",
     "description": "The label for version current"
   },
+  "sidebar.docs.category.Migration": {
+    "message": "数据迁移",
+    "description": "The label for category Migration in sidebar docs"
+  },
   "sidebar.docs.category.Get Started": {
     "message": "快速入门",
     "description": "The label for category Get Started in sidebar docs"
diff --git 
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/migration/elasticsearch-to-doris.md
 
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/migration/elasticsearch-to-doris.md
new file mode 100644
index 00000000000..5e90b3de4fe
--- /dev/null
+++ 
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/migration/elasticsearch-to-doris.md
@@ -0,0 +1,107 @@
+---
+{
+    "title": "Elasticsearch 迁移到 Doris",
+    "language": "zh-CN",
+    "description": "通过 ES Catalog 迁移索引并验证字段、文档 ID 与搜索语义。"
+}
+---
+
+通过 ES Catalog 可以查询 Elasticsearch 索引,再用 `INSERT INTO ... SELECT` 写入 Doris 
内部表。本页演示一次性小规模迁移;它不会自动同步后续更新或删除。迁移搜索工作负载时,还需要分别验证分词、评分、嵌套对象及查询语义。
+
+## 前提条件
+
+本示例使用 Elasticsearch 7.x 或 8.x 的无类型映射 API;其他版本请按源端 API 调整索引初始化方式,并核查 Catalog 
的支持范围。
+
+- 一个可访问的 Elasticsearch 集群及可创建示例索引、写入和读取数据的账户。生产迁移账户还需要 Catalog 元数据查询权限,详见 [ES 
Catalog](../lakehouse/catalogs/es-catalog.md)。
+- 所有 Doris FE/BE 均能访问 ES;Doris 账户具备建 Catalog、建库、建表、读外表及写目标表权限。
+- 使用空目标表,并将连接地址及认证信息替换为实际值。示例使用单副本和单分桶,仅供验证。
+
+## 基本用法
+
+### 1. 准备源索引
+
+在 Elasticsearch Dev Tools 或等效 HTTP 客户端中执行:
+
+```http
+PUT /migration_demo
+{
+  "mappings": {
+    "properties": {
+      "title": { "type": "keyword" }
+    }
+  }
+}
+
+PUT /migration_demo/_doc/one?refresh=true
+{ "title": "first" }
+
+PUT /migration_demo/_doc/two?refresh=true
+{ "title": "second" }
+```
+
+预期结果:索引中有两条可查询文档,`_id` 分别为 `one` 和 `two`。
+
+### 2. 创建 Catalog 并保留文档 ID
+
+```sql
+CREATE CATALOG migration_es PROPERTIES (
+    'type' = 'es',
+    'hosts' = 'http://es-host:9200',
+    'user' = '<es_user>',
+    'password' = '<es_password>',
+    'mapping_es_id' = 'true'
+);
+DESC migration_es.default_db.migration_demo;
+
+CREATE DATABASE IF NOT EXISTS migration_target;
+CREATE TABLE migration_target.es_demo (
+    doc_id VARCHAR(512),
+    title STRING
+)
+DUPLICATE KEY(doc_id)
+DISTRIBUTED BY HASH(doc_id) BUCKETS 1
+PROPERTIES ('replication_num' = '1');
+
+INSERT INTO migration_target.es_demo (doc_id, title)
+SELECT _id, title FROM migration_es.default_db.migration_demo;
+
+SELECT doc_id, title FROM migration_target.es_demo ORDER BY doc_id;
+```
+
+```text
++--------+--------+
+| doc_id | title  |
++--------+--------+
+| one    | first  |
+| two    | second |
++--------+--------+
+```
+
+## 参数参考
+
+| 参数 | 类型 | 是否必需 | 默认值 | 描述 |
+| --- | --- | --- | --- | --- |
+| `hosts` | STRING | 是 | 无 | ES HTTP 地址,所有 FE/BE 必须能够访问 |
+| `user` / `password` | STRING | 取决于 ES 认证 | 空 | 启用 Basic 认证时填写 |
+| `mapping_es_id` | boolean | 否 | `false` | 暴露文档 `_id`,本例设为 true |
+| `enable_docvalue_scan` | boolean | 否 | `true` | 尝试通过 doc values 读取支持的字段 |
+| `nodes_discovery` | boolean | 否 | `true` | 自动发现节点;隔离网络中可能需要关闭 |
+
+完整参数、认证及数组标注格式见 [ES Catalog](../lakehouse/catalogs/es-catalog.md)。
+
+## 类型和搜索语义
+
+- `object`、`nested` 通过 ES Catalog 映射为 JSON,不是自动映射为 VARIANT;导入其他目标类型前应显式转换并测试。
+- ES 字段可能同时包含标量和数组。按 Catalog 参考设置 `_meta.doris.array_fields`,检查 `DESC` 
和真实样本;不要仅由一条样本推断整列类型。
+- 日期格式、时区、数值范围及缺失字段需要逐项验证。`text` 字段的分词行为与用于精确匹配的 `keyword` 不同。
+- Doris [倒排索引](../table-design/index/inverted-index/overview.md) 支持全文检索,但 ES 
DSL、评分、nested 查询及分析器并非自动等价。应针对真实查询验证结果,不要逐条机械替换语法。
+
+## 校验与错误处理
+
+在源索引不变化的窗口内比较两端文档数和不同 `_id` 数;本例都应为 2。再抽样比较原始 `_source` 与目标字段,检查缺失值、JSON 数组和日期。
+
+元数据请求失败时检查索引读取、集群状态和节点 HTTP 
权限;分页读取失败时检查源节点可达性及节点发现设置。迁移过程中索引变化可能影响一致性;需要稳定快照或明确的停写窗口。重复 INSERT 
会追加重复行,恢复前先确认已经导入的范围。
+
+## 建议
+
+先验证字段读取与查询语义,再分批迁移。需要持续镜像时,单独设计按文档 ID 的更新、删除、顺序和重放机制;Catalog 不是 CDC 任务。更多切换步骤见 
[迁移概览](./overview.md)。
diff --git 
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/migration/mysql-to-doris.md 
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/migration/mysql-to-doris.md
new file mode 100644
index 00000000000..c09074ad058
--- /dev/null
+++ 
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/migration/mysql-to-doris.md
@@ -0,0 +1,118 @@
+---
+{
+    "title": "MySQL 迁移到 Doris",
+    "language": "zh-CN",
+    "description": "通过 JDBC 批量迁移 MySQL,并选择正确的 CDC、类型映射与校验方式。"
+}
+---
+
+本页使用 MySQL JDBC Catalog 把一个稳定快照导入 Doris 内部表。该方式适合一次性或周期性批量迁移,不会自动捕获后续更新、删除或 
DDL。持续同步请见后面的 CDC 路线。
+
+## 前提条件
+
+- 已有名为 `migration_source` 的 MySQL 数据库,以及对示例表具有 SELECT 权限的源端账户。
+- 每个 Doris FE/BE 都可以访问源服务。按 [MySQL 
Catalog](../lakehouse/catalogs/jdbc-mysql-catalog.md) 和 
[驱动部署](../lakehouse/catalogs/jdbc-catalog-overview.md) 准备 
`mysql-connector-j-8.3.0.jar`。示例使用驱动文件名,因此 Jar 必须位于所有 FE/BE 的 
`jdbc_drivers_dir` 中。
+- 使用具备建 Catalog、建库、建表、读外表及写目标表权限的 Doris 账户。权限配置见 
[授权](../admin-manual/auth/authorization/internal.md)。
+- 以下演示在源库 `migration_source` 中运行,目标表必须为空。请替换示例主机、用户名和密码。
+
+## 基本用法
+
+### 1. 准备源表
+
+使用具有建表和插入权限的源端账号,在源数据库中准备下面的样例;Catalog 连接使用前述源端只读账号。
+
+```sql
+CREATE TABLE migration_demo (
+    id BIGINT PRIMARY KEY,
+    amount DECIMAL(12,2),
+    note VARCHAR(100)
+);
+INSERT INTO migration_demo VALUES (1, 12.50, 'first'), (2, NULL, NULL);
+```
+
+结果:建表成功并插入 2 行。
+
+### 2. 在 Doris 中创建并检查 Catalog
+
+```sql
+CREATE CATALOG migration_mysql PROPERTIES (
+    'type' = 'jdbc',
+    'user' = 'migration_reader',
+    'password' = '<source_password>',
+    'jdbc_url' = 'jdbc:mysql://mysql-host:3306/migration_source',
+    'driver_url' = 'mysql-connector-j-8.3.0.jar',
+    'driver_class' = 'com.mysql.cj.jdbc.Driver'
+);
+DESC migration_mysql.migration_source.migration_demo;
+```
+
+结果应包含 `id`、`amount`、`note` 三列。检查实际外表类型,再创建目标表。
+
+### 3. 创建目标表并迁移
+
+```sql
+CREATE DATABASE IF NOT EXISTS migration_target;
+CREATE TABLE migration_target.mysql_demo (
+    id BIGINT NOT NULL,
+    amount DECIMAL(12,2),
+    note STRING
+)
+DUPLICATE KEY(id)
+DISTRIBUTED BY HASH(id) BUCKETS 1
+PROPERTIES ('replication_num' = '1');
+
+INSERT INTO migration_target.mysql_demo (id, amount, note)
+SELECT id, amount, note FROM migration_mysql.migration_source.migration_demo;
+
+SELECT id, amount, note FROM migration_target.mysql_demo ORDER BY id;
+```
+
+```text
++------+--------+-------+
+| id   | amount | note  |
++------+--------+-------+
+|    1 |  12.50 | first |
+|    2 |   NULL | NULL  |
++------+--------+-------+
+```
+
+示例使用单副本、单分桶,便于本地验证;生产环境请按可用 BE 数量和可靠性要求调整。重复执行 INSERT 会追加重复数据。
+## 连接参数
+
+| 参数 | 类型 | 是否必需 / 默认值 | 描述 |
+| --- | --- | --- | --- |
+| `type` | STRING | 必需,无默认值 | 使用 `jdbc` |
+| `user` / `password` | STRING | 必需,无默认值 | 源数据库凭据 |
+| `jdbc_url` | STRING | 必需,无默认值 | 包含源数据库名的 JDBC 连接地址 |
+| `driver_url` | STRING | 必需,无默认值 | 每个 FE/BE 可访问的 Jar;本例使用预部署文件名 |
+| `driver_class` | STRING | 必需,无默认值 | 对应驱动的 Java 类名 |
+
+连接池、名称映射及驱动路径安全规则见 [完整 JDBC 
参数参考](../lakehouse/catalogs/jdbc-catalog-overview.md)。
+
+## 类型与版本注意事项 {#data-type-mapping}
+
+- `UNSIGNED` 整数需要扩宽:例如 `INT UNSIGNED` 对应 `BIGINT`,`BIGINT UNSIGNED` 对应 
`LARGEINT`,不能直接照搬有符号类型。
+- JDBC 的 MySQL JSON 映射为 `STRING`,不是自动映射为 `VARIANT`。`TIME`、`ENUM`、`SET` 也按 
Catalog 映射处理;不要假设 JDBC 和 CDC 使用相同规则。
+- `TINYINT(1)` 的 JDBC 元数据受驱动设置影响;以实际 `DESC` 为准,不要把任意 TINYINT 都当作布尔值。
+- 4.1 系列自 4.1.5 起,`TIMESTAMP` 使用 `TIMESTAMPTZ`,二进制类型使用 `VARBINARY`;`DATETIME` 
仍是无时区的日期时间。更早版本的映射及配置不同。dev 使用当前映射。
+- 主键模型、AUTO_INCREMENT、索引和源库约束不会因批量 INSERT 自动复制。完整类型规则见 [MySQL 
映射参考](../lakehouse/catalogs/jdbc-mysql-catalog.md)。
+
+## 持续同步
+
+需要源端更新、删除和全量初始化衔接时,使用 [Flink CDC 
同步](../connection-integration/data-integration/flink-doris-connector/cdc-sync.md)。按
 Connector 兼容矩阵选择 Flink、CDC 和 Doris Connector 版本,不要把独立版本的最低要求简单组合。
+
+<version since="dev">
+
+</version>
+
+dev 还提供 [原生 MySQL 
CDC](../data-operate/import/import-way/streaming-job/continuous-load-mysql-database.md)。该自动建表路线要求源表主键,目前提供至少一次语义,前提条件、日志权限、复制资源及监控方式以该参考为准;不要直接套用本页
 JDBC 类型映射。
+
+## 校验与错误处理
+
+在同一快照和固定范围内,对源表 `migration_mysql.migration_source.migration_demo` 与目标表 
`migration_target.mysql_demo` 分别执行 
`COUNT(*)`、`COUNT(amount)`、`SUM(amount)`;本例结果应分别为 
`2`、`1`、`12.50`。还应逐值检查样本、NULL、精度和时区。完整迁移的校验与切换流程见 [迁移概览](./overview.md)。
+
+连接失败时先检查所有 FE/BE 的网络、驱动文件、源账户权限及驱动路径限制。类型不兼容时先检查 `DESC` 
并显式转换;导入失败后检查实际已写入范围,再决定重试,不要无条件重复整个 INSERT。
+
+## 建议
+
+先用本页的小表验证环境,再按稳定键或时间范围分批。持续同步选择能够处理更新、删除和重放的目标模型;批量快照表与持续镜像表应分别设计。
diff --git 
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/migration/other-olap-to-doris.md
 
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/migration/other-olap-to-doris.md
new file mode 100644
index 00000000000..4a5456e7098
--- /dev/null
+++ 
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/migration/other-olap-to-doris.md
@@ -0,0 +1,68 @@
+---
+{
+    "title": "其他 OLAP 系统迁移到 Doris",
+    "language": "zh-CN",
+    "description": "从 ClickHouse、Greenplum 及数据湖选择迁移路线与校验方法。"
+}
+---
+
+ClickHouse、Greenplum 和数据湖表可以通过相应 Catalog 批量读入 
Doris。先定义快照、更新和聚合语义,再选择目标表模型;源系统的存储引擎没有自动、完整的 Doris 等价物。
+
+## 路线与前提条件
+
+| 来源 | 连接与参数参考 | 迁移前检查 |
+| --- | --- | --- |
+| ClickHouse | [ClickHouse JDBC 
Catalog](../lakehouse/catalogs/jdbc-clickhouse-catalog.md) | 
驱动、无符号整数、日期时间及复杂类型映射 |
+| Greenplum | [PostgreSQL JDBC 
Catalog](../lakehouse/catalogs/jdbc-pg-catalog.md) | PostgreSQL 
兼容驱动、实际元数据及分布式导出一致性 |
+| Hive | [Hive Catalog](../lakehouse/catalogs/hive-catalog.mdx) | 
Metastore、文件存储、认证及分区 |
+| Iceberg | [Iceberg Catalog](../lakehouse/catalogs/iceberg-catalog.mdx) | 
元数据服务、存储权限及一致快照 |
+| Hudi | [Hudi Catalog](../lakehouse/catalogs/hudi-catalog.md) | 
表类型、可见视图、底层文件及查询限制 |
+
+所有 FE/BE 都必须能访问相应服务、驱动和存储。按对应参考配置 Catalog,用具备读外表及建库建表、写目标表权限的 Doris 账户执行迁移。
+
+## ClickHouse {#clickhouse}
+
+使用对应 JDBC Catalog 和显式列列表执行 `INSERT INTO ... SELECT`。先运行 `DESC`,不要把目标设计建议当作 
JDBC 的实际类型映射。例如,ClickHouse `FixedString` 的 Catalog 映射不是直接承诺为 CHAR,Map/Tuple 
等复杂类型能否读取要按具体驱动和版本测试。
+
+`ReplacingMergeTree`、`CollapsingMergeTree` 
和聚合状态表需要确定最终可见数据、版本列、删除标记及合并规则。Doris Unique Key 不能自动复现这些引擎的全部语义。迁移 SQL 时还要测试 
NULL、并列最大/最小值、数组展开和 JSON 字符串提取的差异。
+
+## Greenplum {#greenplum}
+
+按 [PostgreSQL 迁移](./postgresql-to-doris.md) 的批量流程准备 Catalog、目标表和校验,确认实际 
Greenplum 类型映射。大表使用并行导出或分批 SQL 时,应确保所有分片来自同一个一致性视图;工具并行度本身不提供跨表快照保证。
+
+## 数据湖 {#data-lake}
+
+使用各自的 Hive、Iceberg、Hudi Catalog 查询源表。对于 Iceberg,应在迁移期间固定需要读取的快照;对于 
Hudi,应先确认读取的是哪种视图及该版本支持的表类型。创建 Catalog 只提供外部访问,不会创建 Doris 数据副本。
+
+## 基本用法
+
+假设已按上述参考建立 `source_catalog`,源表 `analytics.migration_demo` 含有 `id BIGINT` 和 
`value DECIMAL(12,2)` 两列,且源快照在迁移期间固定。先用外表 `DESC` 确认这两个类型,然后在 Doris 执行:
+
+```sql
+CREATE DATABASE IF NOT EXISTS migration_target;
+CREATE TABLE migration_target.olap_demo (
+    id BIGINT,
+    `value` DECIMAL(12,2)
+)
+DUPLICATE KEY(id)
+DISTRIBUTED BY HASH(id) BUCKETS 1
+PROPERTIES ('replication_num' = '1');
+
+INSERT INTO migration_target.olap_demo (id, `value`)
+SELECT id, `value` FROM source_catalog.analytics.migration_demo;
+
+SELECT COUNT(*), SUM(`value`) FROM source_catalog.analytics.migration_demo;
+SELECT COUNT(*), SUM(`value`) FROM migration_target.olap_demo;
+```
+
+预期结果:空目标表收到源快照中的全部两列数据,两条校验查询的行数和数值总和相等。单副本、单分桶仅供演示;实际环境按资源与可靠性要求调整。完整、固定输入的示例见
 [MySQL](./mysql-to-doris.md) 或 [PostgreSQL](./postgresql-to-doris.md) 页面。
+
+## 其他导入方式
+
+无法直连源系统时,可以导出受支持的文件并通过 [S3 
Load](../data-operate/import/data-source/amazon-s3.md) 或 [Broker 
Load](../data-operate/import/import-way/broker-load-manual.md) 
导入。确认导出格式、编码、NULL 表示、精度和时区后再批量执行。
+
+也可使用 [Spark 
Connector](../connection-integration/data-integration/spark-doris-connector.md) 
或 [Flink 
Connector](../connection-integration/data-integration/flink-doris-connector/overview.md);具体批处理或流处理能力、依赖版本及语义以各
 Connector 参考为准。
+
+## 错误处理与建议
+
+先验证小范围数据,再扩大批量和并发。对于不支持的类型,显式转换并检查是否丢失精度,不要直接跳过。重复执行 Duplicate Key 目标的 INSERT 
会追加重复行;分批恢复前应核对已完成范围。切换前完成 [迁移概览](./overview.md) 中的跨库校验,并保留源数据与回退路径。
diff --git 
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/migration/overview.md 
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/migration/overview.md
new file mode 100644
index 00000000000..986ee59c9a4
--- /dev/null
+++ b/i18n/zh-CN/docusaurus-plugin-content-docs/current/migration/overview.md
@@ -0,0 +1,56 @@
+---
+{
+    "title": "迁移概览",
+    "language": "zh-CN",
+    "description": "选择迁移方式,设计目标表并验证迁移结果。"
+}
+---
+
+Apache Doris 支持通过外部 Catalog、CDC 工具和文件导入迁移数据。迁移通常只转移表数据;源库的事务、索引、约束、存储过程、权限和 
SQL 语义需要单独评估。先明确是一次性快照迁移,还是持续同步更新和删除,再选择路线。
+
+## 迁移路线
+
+| 来源 | 一次性或批量迁移 | 持续同步 |
+| --- | --- | --- |
+| [PostgreSQL](./postgresql-to-doris.md) | PostgreSQL JDBC Catalog + `INSERT 
INTO ... SELECT` | Flink CDC;dev 也提供原生 Streaming Job |
+| [MySQL](./mysql-to-doris.md) | MySQL JDBC Catalog + `INSERT INTO ... SELECT` 
| Flink CDC;dev 也提供原生 Streaming Job |
+| [Elasticsearch](./elasticsearch-to-doris.md) | ES Catalog + `INSERT INTO ... 
SELECT` | 单独设计增量捕获、更新和删除流程 |
+| [ClickHouse / Greenplum](./other-olap-to-doris.md) | 对应 JDBC Catalog 或文件导入 | 
按源系统另行设计 |
+| [Hive / Iceberg / Hudi](./other-olap-to-doris.md#data-lake) | 对应数据湖 Catalog 
+ `INSERT INTO ... SELECT` | 周期性批量任务或相应 Connector |
+
+Catalog 使数据可以被查询,但创建 Catalog 本身不会把数据复制到 Doris 内部表。批量 `INSERT INTO ... SELECT` 
不会自动持续捕获后续更新和删除。
+
+## 基本流程
+
+1. 确认每个 FE/BE 到源系统的网络连通性、驱动部署、源端读取权限及 Doris 建 Catalog、建表和写入权限。
+2. 选定源表的稳定快照或停写窗口。跨表、分批 Catalog 查询不自动构成全局一致快照。
+3. 使用 `DESC catalog.database.table` 检查实际映射,按 
[数据模型](../table-design/data-model/intro.mdx) 设计目标表;不要直接照搬源库主键、引擎或索引。
+4. 运行一张小表的完整迁移。MySQL 和 PostgreSQL 页面提供可复现的建表、导入和查询结果。
+5. 按固定的键或时间边界分批导入,记录已完成的范围及 CDC 起始位点,验证后再切换读流量。
+
+## 配置与类型
+
+| 事项 | 必须确认的内容 |
+| --- | --- |
+| Catalog | 驱动、连接地址、身份认证及目录安全配置,详见 [JDBC 
Catalog](../lakehouse/catalogs/jdbc-catalog-overview.md) 或 [ES 
Catalog](../lakehouse/catalogs/es-catalog.md) |
+| 目标表 | Key 模型、分区、分桶、副本数及更新顺序 |
+| 类型映射 | 映射取决于导入方法、驱动和 Doris 版本;JDBC 映射不等同于 CDC 映射 |
+| 时间与二进制 | 特别核查时区、微秒精度和字节保真;4.1.5 起部分 JDBC 映射发生变化,按所用版本的 Catalog 参考执行 |
+| 增量同步 | 初始快照与日志位点的衔接、主键、重复写入、更新及删除 |
+
+## 校验与切换
+
+使用相同源快照和固定范围,比较源端与目标端的行数、主键去重数、NULL 
数量、数值总和及极值。对时区时间、精确小数、二进制、数组和半结构化字段做逐值抽样;只比较行数不足以证明迁移正确。
+
+持续同步还要插入、更新和删除测试记录,确认目标结果、延迟及任务重启后的行为。确认无遗漏后再切换应用读取,并保留源数据和回退路径。
+
+## 错误处理与注意事项
+
+- 重复执行批量 INSERT 可能重复写入,尤其是 Duplicate Key 表。恢复前先确定重放策略;Unique Key 
也不会自动删除源端已经删除的行。
+- 分批执行时源数据继续变化,会导致遗漏或重复。使用一致性快照、停写窗口或可靠的 CDC 衔接。
+- 遇到不支持类型、字段大小写或精度差异,先检查外表 `DESC`,显式转换并重新校验;不要静默丢弃不兼容列。
+- 同步 INSERT、异步 Load、Flink 和 Streaming Job 的状态入口不同,使用对应导入方式的监控文档,不能统一依赖 `SHOW 
LOAD`。
+
+## 建议
+
+先迁移有代表性的小表,再根据实际数据量、查询负载和存储资源决定分批大小与并发。切换前验证查询结果和更新语义,保留可重复执行的导入范围与校验记录。
diff --git 
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/migration/postgresql-to-doris.md
 
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/migration/postgresql-to-doris.md
new file mode 100644
index 00000000000..e3f094fd7e3
--- /dev/null
+++ 
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/migration/postgresql-to-doris.md
@@ -0,0 +1,118 @@
+---
+{
+    "title": "PostgreSQL 迁移到 Doris",
+    "language": "zh-CN",
+    "description": "通过 JDBC 批量迁移 PostgreSQL,并选择正确的 CDC、类型映射与校验方式。"
+}
+---
+
+本页使用 PostgreSQL JDBC Catalog 把一个稳定快照导入 Doris 
内部表。该方式适合一次性或周期性批量迁移,不会自动捕获后续更新、删除或 DDL。持续同步请见后面的 CDC 路线。
+
+## 前提条件
+
+- 已有名为 `migration_source` 的 PostgreSQL 数据库,以及对示例表具有 SELECT 权限的源端账户。
+- 每个 Doris FE/BE 都可以访问源服务。按 [PostgreSQL 
Catalog](../lakehouse/catalogs/jdbc-pg-catalog.md) 和 
[驱动部署](../lakehouse/catalogs/jdbc-catalog-overview.md) 准备 
`postgresql-42.5.6.jar`。示例使用驱动文件名,因此 Jar 必须位于所有 FE/BE 的 `jdbc_drivers_dir` 中。
+- 使用具备建 Catalog、建库、建表、读外表及写目标表权限的 Doris 账户。权限配置见 
[授权](../admin-manual/auth/authorization/internal.md)。
+- 以下演示在源库 `migration_source` 中运行,目标表必须为空。请替换示例主机、用户名和密码。
+
+## 基本用法
+
+### 1. 准备源表
+
+使用具有建表和插入权限的源端账号,在源数据库中准备下面的样例;Catalog 连接使用前述源端只读账号。
+
+```sql
+CREATE TABLE public.migration_demo (
+    id BIGINT PRIMARY KEY,
+    amount DECIMAL(12,2),
+    note VARCHAR(100)
+);
+INSERT INTO public.migration_demo VALUES (1, 12.50, 'first'), (2, NULL, NULL);
+```
+
+结果:建表成功并插入 2 行。
+
+### 2. 在 Doris 中创建并检查 Catalog
+
+```sql
+CREATE CATALOG migration_pg PROPERTIES (
+    'type' = 'jdbc',
+    'user' = 'migration_reader',
+    'password' = '<source_password>',
+    'jdbc_url' = 'jdbc:postgresql://pg-host:5432/migration_source',
+    'driver_url' = 'postgresql-42.5.6.jar',
+    'driver_class' = 'org.postgresql.Driver'
+);
+DESC migration_pg.public.migration_demo;
+```
+
+结果应包含 `id`、`amount`、`note` 三列。检查实际外表类型,再创建目标表。
+
+### 3. 创建目标表并迁移
+
+```sql
+CREATE DATABASE IF NOT EXISTS migration_target;
+CREATE TABLE migration_target.pg_demo (
+    id BIGINT NOT NULL,
+    amount DECIMAL(12,2),
+    note STRING
+)
+DUPLICATE KEY(id)
+DISTRIBUTED BY HASH(id) BUCKETS 1
+PROPERTIES ('replication_num' = '1');
+
+INSERT INTO migration_target.pg_demo (id, amount, note)
+SELECT id, amount, note FROM migration_pg.public.migration_demo;
+
+SELECT id, amount, note FROM migration_target.pg_demo ORDER BY id;
+```
+
+```text
++------+--------+-------+
+| id   | amount | note  |
++------+--------+-------+
+|    1 |  12.50 | first |
+|    2 |   NULL | NULL  |
++------+--------+-------+
+```
+
+示例使用单副本、单分桶,便于本地验证;生产环境请按可用 BE 数量和可靠性要求调整。重复执行 INSERT 会追加重复数据。
+## 连接参数
+
+| 参数 | 类型 | 是否必需 / 默认值 | 描述 |
+| --- | --- | --- | --- |
+| `type` | STRING | 必需,无默认值 | 使用 `jdbc` |
+| `user` / `password` | STRING | 必需,无默认值 | 源数据库凭据 |
+| `jdbc_url` | STRING | 必需,无默认值 | 包含源数据库名的 JDBC 连接地址 |
+| `driver_url` | STRING | 必需,无默认值 | 每个 FE/BE 可访问的 Jar;本例使用预部署文件名 |
+| `driver_class` | STRING | 必需,无默认值 | 对应驱动的 Java 类名 |
+
+连接池、名称映射及驱动路径安全规则见 [完整 JDBC 
参数参考](../lakehouse/catalogs/jdbc-catalog-overview.md)。
+
+## 类型与版本注意事项 {#data-type-mapping}
+
+- JDBC 读取的 `json/jsonb` 映射为 `STRING`,不会自动变为 `VARIANT`。要使用其他目标类型,请显式转换并校验。
+- PostgreSQL `time`、`timetz`、`interval` 采用该 Catalog 定义的字符串映射;这不表示 Doris 没有 
TIME 类型。
+- 无明确精度或超出支持范围的 `numeric` 可能映射为 `STRING`。先检查外表类型,再做数值计算。
+- 4.1 系列自 4.1.5 起,`timestamptz` 映射为 `TIMESTAMPTZ`,`bytea` 映射为 
`VARBINARY`;更早版本的映射及配置不同。dev 使用当前映射。核查时区、精度及二进制逐字节一致性。
+- 数组维度需要源数据辅助识别;没有可用数据时可能显示为不支持的类型。请按 [PostgreSQL 
映射参考](../lakehouse/catalogs/jdbc-pg-catalog.md) 验证具体列。
+
+## 持续同步
+
+需要源端更新、删除和全量初始化衔接时,使用 [Flink CDC 
同步](../connection-integration/data-integration/flink-doris-connector/cdc-sync.md)。按
 Connector 兼容矩阵选择 Flink、CDC 和 Doris Connector 版本,不要把独立版本的最低要求简单组合。
+
+<version since="dev">
+
+</version>
+
+dev 还提供 [原生 PostgreSQL 
CDC](../data-operate/import/import-way/streaming-job/continuous-load-postgresql-database.md)。该自动建表路线要求源表主键,目前提供至少一次语义,前提条件、日志权限、复制资源及监控方式以该参考为准;不要直接套用本页
 JDBC 类型映射。
+
+## 校验与错误处理
+
+在同一快照和固定范围内,对源表 `migration_pg.public.migration_demo` 与目标表 
`migration_target.pg_demo` 分别执行 
`COUNT(*)`、`COUNT(amount)`、`SUM(amount)`;本例结果应分别为 
`2`、`1`、`12.50`。还应逐值检查样本、NULL、精度和时区。完整迁移的校验与切换流程见 [迁移概览](./overview.md)。
+
+连接失败时先检查所有 FE/BE 的网络、驱动文件、源账户权限及驱动路径限制。类型不兼容时先检查 `DESC` 
并显式转换;导入失败后检查实际已写入范围,再决定重试,不要无条件重复整个 INSERT。
+
+## 建议
+
+先用本页的小表验证环境,再按稳定键或时间范围分批。持续同步选择能够处理更新、删除和重放的目标模型;批量快照表与持续镜像表应分别设计。
diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-4.x.json 
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-4.x.json
index 5b60d221132..efd040ad9d0 100644
--- a/i18n/zh-CN/docusaurus-plugin-content-docs/version-4.x.json
+++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-4.x.json
@@ -3,6 +3,10 @@
     "message": "dev",
     "description": "The label for version current"
   },
+  "sidebar.docs.category.Migration": {
+    "message": "数据迁移",
+    "description": "The label for category Migration in sidebar docs"
+  },
   "sidebar.docs.category.Get Started": {
     "message": "快速入门",
     "description": "The label for category Get Started in sidebar docs"
diff --git 
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-4.x/migration/elasticsearch-to-doris.md
 
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-4.x/migration/elasticsearch-to-doris.md
new file mode 100644
index 00000000000..5e90b3de4fe
--- /dev/null
+++ 
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-4.x/migration/elasticsearch-to-doris.md
@@ -0,0 +1,107 @@
+---
+{
+    "title": "Elasticsearch 迁移到 Doris",
+    "language": "zh-CN",
+    "description": "通过 ES Catalog 迁移索引并验证字段、文档 ID 与搜索语义。"
+}
+---
+
+通过 ES Catalog 可以查询 Elasticsearch 索引,再用 `INSERT INTO ... SELECT` 写入 Doris 
内部表。本页演示一次性小规模迁移;它不会自动同步后续更新或删除。迁移搜索工作负载时,还需要分别验证分词、评分、嵌套对象及查询语义。
+
+## 前提条件
+
+本示例使用 Elasticsearch 7.x 或 8.x 的无类型映射 API;其他版本请按源端 API 调整索引初始化方式,并核查 Catalog 
的支持范围。
+
+- 一个可访问的 Elasticsearch 集群及可创建示例索引、写入和读取数据的账户。生产迁移账户还需要 Catalog 元数据查询权限,详见 [ES 
Catalog](../lakehouse/catalogs/es-catalog.md)。
+- 所有 Doris FE/BE 均能访问 ES;Doris 账户具备建 Catalog、建库、建表、读外表及写目标表权限。
+- 使用空目标表,并将连接地址及认证信息替换为实际值。示例使用单副本和单分桶,仅供验证。
+
+## 基本用法
+
+### 1. 准备源索引
+
+在 Elasticsearch Dev Tools 或等效 HTTP 客户端中执行:
+
+```http
+PUT /migration_demo
+{
+  "mappings": {
+    "properties": {
+      "title": { "type": "keyword" }
+    }
+  }
+}
+
+PUT /migration_demo/_doc/one?refresh=true
+{ "title": "first" }
+
+PUT /migration_demo/_doc/two?refresh=true
+{ "title": "second" }
+```
+
+预期结果:索引中有两条可查询文档,`_id` 分别为 `one` 和 `two`。
+
+### 2. 创建 Catalog 并保留文档 ID
+
+```sql
+CREATE CATALOG migration_es PROPERTIES (
+    'type' = 'es',
+    'hosts' = 'http://es-host:9200',
+    'user' = '<es_user>',
+    'password' = '<es_password>',
+    'mapping_es_id' = 'true'
+);
+DESC migration_es.default_db.migration_demo;
+
+CREATE DATABASE IF NOT EXISTS migration_target;
+CREATE TABLE migration_target.es_demo (
+    doc_id VARCHAR(512),
+    title STRING
+)
+DUPLICATE KEY(doc_id)
+DISTRIBUTED BY HASH(doc_id) BUCKETS 1
+PROPERTIES ('replication_num' = '1');
+
+INSERT INTO migration_target.es_demo (doc_id, title)
+SELECT _id, title FROM migration_es.default_db.migration_demo;
+
+SELECT doc_id, title FROM migration_target.es_demo ORDER BY doc_id;
+```
+
+```text
++--------+--------+
+| doc_id | title  |
++--------+--------+
+| one    | first  |
+| two    | second |
++--------+--------+
+```
+
+## 参数参考
+
+| 参数 | 类型 | 是否必需 | 默认值 | 描述 |
+| --- | --- | --- | --- | --- |
+| `hosts` | STRING | 是 | 无 | ES HTTP 地址,所有 FE/BE 必须能够访问 |
+| `user` / `password` | STRING | 取决于 ES 认证 | 空 | 启用 Basic 认证时填写 |
+| `mapping_es_id` | boolean | 否 | `false` | 暴露文档 `_id`,本例设为 true |
+| `enable_docvalue_scan` | boolean | 否 | `true` | 尝试通过 doc values 读取支持的字段 |
+| `nodes_discovery` | boolean | 否 | `true` | 自动发现节点;隔离网络中可能需要关闭 |
+
+完整参数、认证及数组标注格式见 [ES Catalog](../lakehouse/catalogs/es-catalog.md)。
+
+## 类型和搜索语义
+
+- `object`、`nested` 通过 ES Catalog 映射为 JSON,不是自动映射为 VARIANT;导入其他目标类型前应显式转换并测试。
+- ES 字段可能同时包含标量和数组。按 Catalog 参考设置 `_meta.doris.array_fields`,检查 `DESC` 
和真实样本;不要仅由一条样本推断整列类型。
+- 日期格式、时区、数值范围及缺失字段需要逐项验证。`text` 字段的分词行为与用于精确匹配的 `keyword` 不同。
+- Doris [倒排索引](../table-design/index/inverted-index/overview.md) 支持全文检索,但 ES 
DSL、评分、nested 查询及分析器并非自动等价。应针对真实查询验证结果,不要逐条机械替换语法。
+
+## 校验与错误处理
+
+在源索引不变化的窗口内比较两端文档数和不同 `_id` 数;本例都应为 2。再抽样比较原始 `_source` 与目标字段,检查缺失值、JSON 数组和日期。
+
+元数据请求失败时检查索引读取、集群状态和节点 HTTP 
权限;分页读取失败时检查源节点可达性及节点发现设置。迁移过程中索引变化可能影响一致性;需要稳定快照或明确的停写窗口。重复 INSERT 
会追加重复行,恢复前先确认已经导入的范围。
+
+## 建议
+
+先验证字段读取与查询语义,再分批迁移。需要持续镜像时,单独设计按文档 ID 的更新、删除、顺序和重放机制;Catalog 不是 CDC 任务。更多切换步骤见 
[迁移概览](./overview.md)。
diff --git 
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-4.x/migration/mysql-to-doris.md
 
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-4.x/migration/mysql-to-doris.md
new file mode 100644
index 00000000000..b10225fc4c5
--- /dev/null
+++ 
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-4.x/migration/mysql-to-doris.md
@@ -0,0 +1,112 @@
+---
+{
+    "title": "MySQL 迁移到 Doris",
+    "language": "zh-CN",
+    "description": "通过 JDBC 批量迁移 MySQL,并选择正确的 CDC、类型映射与校验方式。"
+}
+---
+
+本页使用 MySQL JDBC Catalog 把一个稳定快照导入 Doris 内部表。该方式适合一次性或周期性批量迁移,不会自动捕获后续更新、删除或 
DDL。持续同步请见后面的 CDC 路线。
+
+## 前提条件
+
+- 已有名为 `migration_source` 的 MySQL 数据库,以及对示例表具有 SELECT 权限的源端账户。
+- 每个 Doris FE/BE 都可以访问源服务。按 [MySQL 
Catalog](../lakehouse/catalogs/jdbc-mysql-catalog.md) 和 
[驱动部署](../lakehouse/catalogs/jdbc-catalog-overview.md) 准备 
`mysql-connector-j-8.3.0.jar`。示例使用驱动文件名,因此 Jar 必须位于所有 FE/BE 的 
`jdbc_drivers_dir` 中。
+- 使用具备建 Catalog、建库、建表、读外表及写目标表权限的 Doris 账户。权限配置见 
[授权](../admin-manual/auth/authorization/internal.md)。
+- 以下演示在源库 `migration_source` 中运行,目标表必须为空。请替换示例主机、用户名和密码。
+
+## 基本用法
+
+### 1. 准备源表
+
+使用具有建表和插入权限的源端账号,在源数据库中准备下面的样例;Catalog 连接使用前述源端只读账号。
+
+```sql
+CREATE TABLE migration_demo (
+    id BIGINT PRIMARY KEY,
+    amount DECIMAL(12,2),
+    note VARCHAR(100)
+);
+INSERT INTO migration_demo VALUES (1, 12.50, 'first'), (2, NULL, NULL);
+```
+
+结果:建表成功并插入 2 行。
+
+### 2. 在 Doris 中创建并检查 Catalog
+
+```sql
+CREATE CATALOG migration_mysql PROPERTIES (
+    'type' = 'jdbc',
+    'user' = 'migration_reader',
+    'password' = '<source_password>',
+    'jdbc_url' = 'jdbc:mysql://mysql-host:3306/migration_source',
+    'driver_url' = 'mysql-connector-j-8.3.0.jar',
+    'driver_class' = 'com.mysql.cj.jdbc.Driver'
+);
+DESC migration_mysql.migration_source.migration_demo;
+```
+
+结果应包含 `id`、`amount`、`note` 三列。检查实际外表类型,再创建目标表。
+
+### 3. 创建目标表并迁移
+
+```sql
+CREATE DATABASE IF NOT EXISTS migration_target;
+CREATE TABLE migration_target.mysql_demo (
+    id BIGINT NOT NULL,
+    amount DECIMAL(12,2),
+    note STRING
+)
+DUPLICATE KEY(id)
+DISTRIBUTED BY HASH(id) BUCKETS 1
+PROPERTIES ('replication_num' = '1');
+
+INSERT INTO migration_target.mysql_demo (id, amount, note)
+SELECT id, amount, note FROM migration_mysql.migration_source.migration_demo;
+
+SELECT id, amount, note FROM migration_target.mysql_demo ORDER BY id;
+```
+
+```text
++------+--------+-------+
+| id   | amount | note  |
++------+--------+-------+
+|    1 |  12.50 | first |
+|    2 |   NULL | NULL  |
++------+--------+-------+
+```
+
+示例使用单副本、单分桶,便于本地验证;生产环境请按可用 BE 数量和可靠性要求调整。重复执行 INSERT 会追加重复数据。
+## 连接参数
+
+| 参数 | 类型 | 是否必需 / 默认值 | 描述 |
+| --- | --- | --- | --- |
+| `type` | STRING | 必需,无默认值 | 使用 `jdbc` |
+| `user` / `password` | STRING | 必需,无默认值 | 源数据库凭据 |
+| `jdbc_url` | STRING | 必需,无默认值 | 包含源数据库名的 JDBC 连接地址 |
+| `driver_url` | STRING | 必需,无默认值 | 每个 FE/BE 可访问的 Jar;本例使用预部署文件名 |
+| `driver_class` | STRING | 必需,无默认值 | 对应驱动的 Java 类名 |
+
+连接池、名称映射及驱动路径安全规则见 [完整 JDBC 
参数参考](../lakehouse/catalogs/jdbc-catalog-overview.md)。
+
+## 类型与版本注意事项 {#data-type-mapping}
+
+- `UNSIGNED` 整数需要扩宽:例如 `INT UNSIGNED` 对应 `BIGINT`,`BIGINT UNSIGNED` 对应 
`LARGEINT`,不能直接照搬有符号类型。
+- JDBC 的 MySQL JSON 映射为 `STRING`,不是自动映射为 `VARIANT`。`TIME`、`ENUM`、`SET` 也按 
Catalog 映射处理;不要假设 JDBC 和 CDC 使用相同规则。
+- `TINYINT(1)` 的 JDBC 元数据受驱动设置影响;以实际 `DESC` 为准,不要把任意 TINYINT 都当作布尔值。
+- 4.1 系列自 4.1.5 起,`TIMESTAMP` 使用 `TIMESTAMPTZ`,二进制类型使用 `VARBINARY`;`DATETIME` 
仍是无时区的日期时间。更早版本的映射及配置不同。dev 使用当前映射。
+- 主键模型、AUTO_INCREMENT、索引和源库约束不会因批量 INSERT 自动复制。完整类型规则见 [MySQL 
映射参考](../lakehouse/catalogs/jdbc-mysql-catalog.md)。
+
+## 持续同步
+
+需要源端更新、删除和全量初始化衔接时,使用 [Flink CDC 
同步](../connection-integration/data-integration/flink-doris-connector.md)。按 
Connector 兼容矩阵选择 Flink、CDC 和 Doris Connector 版本,不要把独立版本的最低要求简单组合。
+
+## 校验与错误处理
+
+在同一快照和固定范围内,对源表 `migration_mysql.migration_source.migration_demo` 与目标表 
`migration_target.mysql_demo` 分别执行 
`COUNT(*)`、`COUNT(amount)`、`SUM(amount)`;本例结果应分别为 
`2`、`1`、`12.50`。还应逐值检查样本、NULL、精度和时区。完整迁移的校验与切换流程见 [迁移概览](./overview.md)。
+
+连接失败时先检查所有 FE/BE 的网络、驱动文件、源账户权限及驱动路径限制。类型不兼容时先检查 `DESC` 
并显式转换;导入失败后检查实际已写入范围,再决定重试,不要无条件重复整个 INSERT。
+
+## 建议
+
+先用本页的小表验证环境,再按稳定键或时间范围分批。持续同步选择能够处理更新、删除和重放的目标模型;批量快照表与持续镜像表应分别设计。
diff --git 
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-4.x/migration/other-olap-to-doris.md
 
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-4.x/migration/other-olap-to-doris.md
new file mode 100644
index 00000000000..61914e33446
--- /dev/null
+++ 
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-4.x/migration/other-olap-to-doris.md
@@ -0,0 +1,68 @@
+---
+{
+    "title": "其他 OLAP 系统迁移到 Doris",
+    "language": "zh-CN",
+    "description": "从 ClickHouse、Greenplum 及数据湖选择迁移路线与校验方法。"
+}
+---
+
+ClickHouse、Greenplum 和数据湖表可以通过相应 Catalog 批量读入 
Doris。先定义快照、更新和聚合语义,再选择目标表模型;源系统的存储引擎没有自动、完整的 Doris 等价物。
+
+## 路线与前提条件
+
+| 来源 | 连接与参数参考 | 迁移前检查 |
+| --- | --- | --- |
+| ClickHouse | [ClickHouse JDBC 
Catalog](../lakehouse/catalogs/jdbc-clickhouse-catalog.md) | 
驱动、无符号整数、日期时间及复杂类型映射 |
+| Greenplum | [PostgreSQL JDBC 
Catalog](../lakehouse/catalogs/jdbc-pg-catalog.md) | PostgreSQL 
兼容驱动、实际元数据及分布式导出一致性 |
+| Hive | [Hive Catalog](../lakehouse/catalogs/hive-catalog.mdx) | 
Metastore、文件存储、认证及分区 |
+| Iceberg | [Iceberg Catalog](../lakehouse/catalogs/iceberg-catalog.mdx) | 
元数据服务、存储权限及一致快照 |
+| Hudi | [Hudi Catalog](../lakehouse/catalogs/hudi-catalog.md) | 
表类型、可见视图、底层文件及查询限制 |
+
+所有 FE/BE 都必须能访问相应服务、驱动和存储。按对应参考配置 Catalog,用具备读外表及建库建表、写目标表权限的 Doris 账户执行迁移。
+
+## ClickHouse {#clickhouse}
+
+使用对应 JDBC Catalog 和显式列列表执行 `INSERT INTO ... SELECT`。先运行 `DESC`,不要把目标设计建议当作 
JDBC 的实际类型映射。例如,ClickHouse `FixedString` 的 Catalog 映射不是直接承诺为 CHAR,Map/Tuple 
等复杂类型能否读取要按具体驱动和版本测试。
+
+`ReplacingMergeTree`、`CollapsingMergeTree` 
和聚合状态表需要确定最终可见数据、版本列、删除标记及合并规则。Doris Unique Key 不能自动复现这些引擎的全部语义。迁移 SQL 时还要测试 
NULL、并列最大/最小值、数组展开和 JSON 字符串提取的差异。
+
+## Greenplum {#greenplum}
+
+按 [PostgreSQL 迁移](./postgresql-to-doris.md) 的批量流程准备 Catalog、目标表和校验,确认实际 
Greenplum 类型映射。大表使用并行导出或分批 SQL 时,应确保所有分片来自同一个一致性视图;工具并行度本身不提供跨表快照保证。
+
+## 数据湖 {#data-lake}
+
+使用各自的 Hive、Iceberg、Hudi Catalog 查询源表。对于 Iceberg,应在迁移期间固定需要读取的快照;对于 
Hudi,应先确认读取的是哪种视图及该版本支持的表类型。创建 Catalog 只提供外部访问,不会创建 Doris 数据副本。
+
+## 基本用法
+
+假设已按上述参考建立 `source_catalog`,源表 `analytics.migration_demo` 含有 `id BIGINT` 和 
`value DECIMAL(12,2)` 两列,且源快照在迁移期间固定。先用外表 `DESC` 确认这两个类型,然后在 Doris 执行:
+
+```sql
+CREATE DATABASE IF NOT EXISTS migration_target;
+CREATE TABLE migration_target.olap_demo (
+    id BIGINT,
+    `value` DECIMAL(12,2)
+)
+DUPLICATE KEY(id)
+DISTRIBUTED BY HASH(id) BUCKETS 1
+PROPERTIES ('replication_num' = '1');
+
+INSERT INTO migration_target.olap_demo (id, `value`)
+SELECT id, `value` FROM source_catalog.analytics.migration_demo;
+
+SELECT COUNT(*), SUM(`value`) FROM source_catalog.analytics.migration_demo;
+SELECT COUNT(*), SUM(`value`) FROM migration_target.olap_demo;
+```
+
+预期结果:空目标表收到源快照中的全部两列数据,两条校验查询的行数和数值总和相等。单副本、单分桶仅供演示;实际环境按资源与可靠性要求调整。完整、固定输入的示例见
 [MySQL](./mysql-to-doris.md) 或 [PostgreSQL](./postgresql-to-doris.md) 页面。
+
+## 其他导入方式
+
+无法直连源系统时,可以导出受支持的文件并通过 [S3 
Load](../data-operate/import/data-source/amazon-s3.md) 或 [Broker 
Load](../data-operate/import/import-way/broker-load-manual.md) 
导入。确认导出格式、编码、NULL 表示、精度和时区后再批量执行。
+
+也可使用 [Spark 
Connector](../connection-integration/data-integration/spark-doris-connector.md) 
或 [Flink 
Connector](../connection-integration/data-integration/flink-doris-connector.md);具体批处理或流处理能力、依赖版本及语义以各
 Connector 参考为准。
+
+## 错误处理与建议
+
+先验证小范围数据,再扩大批量和并发。对于不支持的类型,显式转换并检查是否丢失精度,不要直接跳过。重复执行 Duplicate Key 目标的 INSERT 
会追加重复行;分批恢复前应核对已完成范围。切换前完成 [迁移概览](./overview.md) 中的跨库校验,并保留源数据与回退路径。
diff --git 
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-4.x/migration/overview.md 
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-4.x/migration/overview.md
new file mode 100644
index 00000000000..516ab45e21d
--- /dev/null
+++ 
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-4.x/migration/overview.md
@@ -0,0 +1,56 @@
+---
+{
+    "title": "迁移概览",
+    "language": "zh-CN",
+    "description": "选择迁移方式,设计目标表并验证迁移结果。"
+}
+---
+
+Apache Doris 支持通过外部 Catalog、CDC 工具和文件导入迁移数据。迁移通常只转移表数据;源库的事务、索引、约束、存储过程、权限和 
SQL 语义需要单独评估。先明确是一次性快照迁移,还是持续同步更新和删除,再选择路线。
+
+## 迁移路线
+
+| 来源 | 一次性或批量迁移 | 持续同步 |
+| --- | --- | --- |
+| [PostgreSQL](./postgresql-to-doris.md) | PostgreSQL JDBC Catalog + `INSERT 
INTO ... SELECT` | Flink CDC |
+| [MySQL](./mysql-to-doris.md) | MySQL JDBC Catalog + `INSERT INTO ... SELECT` 
| Flink CDC |
+| [Elasticsearch](./elasticsearch-to-doris.md) | ES Catalog + `INSERT INTO ... 
SELECT` | 单独设计增量捕获、更新和删除流程 |
+| [ClickHouse / Greenplum](./other-olap-to-doris.md) | 对应 JDBC Catalog 或文件导入 | 
按源系统另行设计 |
+| [Hive / Iceberg / Hudi](./other-olap-to-doris.md#data-lake) | 对应数据湖 Catalog 
+ `INSERT INTO ... SELECT` | 周期性批量任务或相应 Connector |
+
+Catalog 使数据可以被查询,但创建 Catalog 本身不会把数据复制到 Doris 内部表。批量 `INSERT INTO ... SELECT` 
不会自动持续捕获后续更新和删除。
+
+## 基本流程
+
+1. 确认每个 FE/BE 到源系统的网络连通性、驱动部署、源端读取权限及 Doris 建 Catalog、建表和写入权限。
+2. 选定源表的稳定快照或停写窗口。跨表、分批 Catalog 查询不自动构成全局一致快照。
+3. 使用 `DESC catalog.database.table` 检查实际映射,按 
[数据模型](../table-design/data-model/intro.mdx) 设计目标表;不要直接照搬源库主键、引擎或索引。
+4. 运行一张小表的完整迁移。MySQL 和 PostgreSQL 页面提供可复现的建表、导入和查询结果。
+5. 按固定的键或时间边界分批导入,记录已完成的范围及 CDC 起始位点,验证后再切换读流量。
+
+## 配置与类型
+
+| 事项 | 必须确认的内容 |
+| --- | --- |
+| Catalog | 驱动、连接地址、身份认证及目录安全配置,详见 [JDBC 
Catalog](../lakehouse/catalogs/jdbc-catalog-overview.md) 或 [ES 
Catalog](../lakehouse/catalogs/es-catalog.md) |
+| 目标表 | Key 模型、分区、分桶、副本数及更新顺序 |
+| 类型映射 | 映射取决于导入方法、驱动和 Doris 版本;JDBC 映射不等同于 CDC 映射 |
+| 时间与二进制 | 特别核查时区、微秒精度和字节保真;4.1.5 起部分 JDBC 映射发生变化,按所用版本的 Catalog 参考执行 |
+| 增量同步 | 初始快照与日志位点的衔接、主键、重复写入、更新及删除 |
+
+## 校验与切换
+
+使用相同源快照和固定范围,比较源端与目标端的行数、主键去重数、NULL 
数量、数值总和及极值。对时区时间、精确小数、二进制、数组和半结构化字段做逐值抽样;只比较行数不足以证明迁移正确。
+
+持续同步还要插入、更新和删除测试记录,确认目标结果、延迟及任务重启后的行为。确认无遗漏后再切换应用读取,并保留源数据和回退路径。
+
+## 错误处理与注意事项
+
+- 重复执行批量 INSERT 可能重复写入,尤其是 Duplicate Key 表。恢复前先确定重放策略;Unique Key 
也不会自动删除源端已经删除的行。
+- 分批执行时源数据继续变化,会导致遗漏或重复。使用一致性快照、停写窗口或可靠的 CDC 衔接。
+- 遇到不支持类型、字段大小写或精度差异,先检查外表 `DESC`,显式转换并重新校验;不要静默丢弃不兼容列。
+- 同步 INSERT、异步 Load、Flink 和 Streaming Job 的状态入口不同,使用对应导入方式的监控文档,不能统一依赖 `SHOW 
LOAD`。
+
+## 建议
+
+先迁移有代表性的小表,再根据实际数据量、查询负载和存储资源决定分批大小与并发。切换前验证查询结果和更新语义,保留可重复执行的导入范围与校验记录。
diff --git 
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-4.x/migration/postgresql-to-doris.md
 
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-4.x/migration/postgresql-to-doris.md
new file mode 100644
index 00000000000..aa3da2387f8
--- /dev/null
+++ 
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-4.x/migration/postgresql-to-doris.md
@@ -0,0 +1,112 @@
+---
+{
+    "title": "PostgreSQL 迁移到 Doris",
+    "language": "zh-CN",
+    "description": "通过 JDBC 批量迁移 PostgreSQL,并选择正确的 CDC、类型映射与校验方式。"
+}
+---
+
+本页使用 PostgreSQL JDBC Catalog 把一个稳定快照导入 Doris 
内部表。该方式适合一次性或周期性批量迁移,不会自动捕获后续更新、删除或 DDL。持续同步请见后面的 CDC 路线。
+
+## 前提条件
+
+- 已有名为 `migration_source` 的 PostgreSQL 数据库,以及对示例表具有 SELECT 权限的源端账户。
+- 每个 Doris FE/BE 都可以访问源服务。按 [PostgreSQL 
Catalog](../lakehouse/catalogs/jdbc-pg-catalog.md) 和 
[驱动部署](../lakehouse/catalogs/jdbc-catalog-overview.md) 准备 
`postgresql-42.5.6.jar`。示例使用驱动文件名,因此 Jar 必须位于所有 FE/BE 的 `jdbc_drivers_dir` 中。
+- 使用具备建 Catalog、建库、建表、读外表及写目标表权限的 Doris 账户。权限配置见 
[授权](../admin-manual/auth/authorization/internal.md)。
+- 以下演示在源库 `migration_source` 中运行,目标表必须为空。请替换示例主机、用户名和密码。
+
+## 基本用法
+
+### 1. 准备源表
+
+使用具有建表和插入权限的源端账号,在源数据库中准备下面的样例;Catalog 连接使用前述源端只读账号。
+
+```sql
+CREATE TABLE public.migration_demo (
+    id BIGINT PRIMARY KEY,
+    amount DECIMAL(12,2),
+    note VARCHAR(100)
+);
+INSERT INTO public.migration_demo VALUES (1, 12.50, 'first'), (2, NULL, NULL);
+```
+
+结果:建表成功并插入 2 行。
+
+### 2. 在 Doris 中创建并检查 Catalog
+
+```sql
+CREATE CATALOG migration_pg PROPERTIES (
+    'type' = 'jdbc',
+    'user' = 'migration_reader',
+    'password' = '<source_password>',
+    'jdbc_url' = 'jdbc:postgresql://pg-host:5432/migration_source',
+    'driver_url' = 'postgresql-42.5.6.jar',
+    'driver_class' = 'org.postgresql.Driver'
+);
+DESC migration_pg.public.migration_demo;
+```
+
+结果应包含 `id`、`amount`、`note` 三列。检查实际外表类型,再创建目标表。
+
+### 3. 创建目标表并迁移
+
+```sql
+CREATE DATABASE IF NOT EXISTS migration_target;
+CREATE TABLE migration_target.pg_demo (
+    id BIGINT NOT NULL,
+    amount DECIMAL(12,2),
+    note STRING
+)
+DUPLICATE KEY(id)
+DISTRIBUTED BY HASH(id) BUCKETS 1
+PROPERTIES ('replication_num' = '1');
+
+INSERT INTO migration_target.pg_demo (id, amount, note)
+SELECT id, amount, note FROM migration_pg.public.migration_demo;
+
+SELECT id, amount, note FROM migration_target.pg_demo ORDER BY id;
+```
+
+```text
++------+--------+-------+
+| id   | amount | note  |
++------+--------+-------+
+|    1 |  12.50 | first |
+|    2 |   NULL | NULL  |
++------+--------+-------+
+```
+
+示例使用单副本、单分桶,便于本地验证;生产环境请按可用 BE 数量和可靠性要求调整。重复执行 INSERT 会追加重复数据。
+## 连接参数
+
+| 参数 | 类型 | 是否必需 / 默认值 | 描述 |
+| --- | --- | --- | --- |
+| `type` | STRING | 必需,无默认值 | 使用 `jdbc` |
+| `user` / `password` | STRING | 必需,无默认值 | 源数据库凭据 |
+| `jdbc_url` | STRING | 必需,无默认值 | 包含源数据库名的 JDBC 连接地址 |
+| `driver_url` | STRING | 必需,无默认值 | 每个 FE/BE 可访问的 Jar;本例使用预部署文件名 |
+| `driver_class` | STRING | 必需,无默认值 | 对应驱动的 Java 类名 |
+
+连接池、名称映射及驱动路径安全规则见 [完整 JDBC 
参数参考](../lakehouse/catalogs/jdbc-catalog-overview.md)。
+
+## 类型与版本注意事项 {#data-type-mapping}
+
+- JDBC 读取的 `json/jsonb` 映射为 `STRING`,不会自动变为 `VARIANT`。要使用其他目标类型,请显式转换并校验。
+- PostgreSQL `time`、`timetz`、`interval` 采用该 Catalog 定义的字符串映射;这不表示 Doris 没有 
TIME 类型。
+- 无明确精度或超出支持范围的 `numeric` 可能映射为 `STRING`。先检查外表类型,再做数值计算。
+- 4.1 系列自 4.1.5 起,`timestamptz` 映射为 `TIMESTAMPTZ`,`bytea` 映射为 
`VARBINARY`;更早版本的映射及配置不同。dev 使用当前映射。核查时区、精度及二进制逐字节一致性。
+- 数组维度需要源数据辅助识别;没有可用数据时可能显示为不支持的类型。请按 [PostgreSQL 
映射参考](../lakehouse/catalogs/jdbc-pg-catalog.md) 验证具体列。
+
+## 持续同步
+
+需要源端更新、删除和全量初始化衔接时,使用 [Flink CDC 
同步](../connection-integration/data-integration/flink-doris-connector.md)。按 
Connector 兼容矩阵选择 Flink、CDC 和 Doris Connector 版本,不要把独立版本的最低要求简单组合。
+
+## 校验与错误处理
+
+在同一快照和固定范围内,对源表 `migration_pg.public.migration_demo` 与目标表 
`migration_target.pg_demo` 分别执行 
`COUNT(*)`、`COUNT(amount)`、`SUM(amount)`;本例结果应分别为 
`2`、`1`、`12.50`。还应逐值检查样本、NULL、精度和时区。完整迁移的校验与切换流程见 [迁移概览](./overview.md)。
+
+连接失败时先检查所有 FE/BE 的网络、驱动文件、源账户权限及驱动路径限制。类型不兼容时先检查 `DESC` 
并显式转换;导入失败后检查实际已写入范围,再决定重试,不要无条件重复整个 INSERT。
+
+## 建议
+
+先用本页的小表验证环境,再按稳定键或时间范围分批。持续同步选择能够处理更新、删除和重放的目标模型;批量快照表与持续镜像表应分别设计。
diff --git a/sidebars.ts b/sidebars.ts
index a6a8670d0cd..7a4679125fe 100644
--- a/sidebars.ts
+++ b/sidebars.ts
@@ -19,6 +19,18 @@ const sidebars: SidebarsConfig = {
                 'getting-started/before-you-start-the-poc',
             ],
         },
+        {
+            type: 'category',
+            label: 'Migration',
+            link: {type: 'doc', id: 'migration/overview'},
+            collapsed: true,
+            items: [
+                'migration/postgresql-to-doris',
+                'migration/mysql-to-doris',
+                'migration/elasticsearch-to-doris',
+                'migration/other-olap-to-doris',
+            ],
+        },
         {
             type: 'category',
             label: 'Features & Architecture',
diff --git a/versioned_docs/version-4.x/migration/elasticsearch-to-doris.md 
b/versioned_docs/version-4.x/migration/elasticsearch-to-doris.md
new file mode 100644
index 00000000000..574093fce9f
--- /dev/null
+++ b/versioned_docs/version-4.x/migration/elasticsearch-to-doris.md
@@ -0,0 +1,107 @@
+---
+{
+    "title": "Elasticsearch to Doris",
+    "language": "en",
+    "description": "Copy indexes through an ES Catalog and validate fields, 
document IDs, and search semantics."
+}
+---
+
+Use an ES Catalog to query Elasticsearch indexes, then copy selected columns 
into Doris internal tables with `INSERT INTO ... SELECT`. This example is a 
small one-time migration and does not continuously propagate later updates or 
deletes. Search workloads also require separate validation of analyzers, 
scoring, nested objects, and query semantics.
+
+## Prerequisites
+
+This example uses the typeless mapping API in Elasticsearch 7.x or 8.x. Adapt 
index setup for other source versions and check the catalog support range.
+
+- An accessible Elasticsearch cluster and an account that can create, write, 
and read the sample index. A production migration account also needs catalog 
metadata permissions; see [ES Catalog](../lakehouse/catalogs/es-catalog.md).
+- Connectivity from every Doris FE/BE to ES, and a Doris account allowed to 
create catalogs/databases/tables, read external tables, and load the target.
+- An empty target table. Replace connection addresses and credentials. One 
replica and one bucket are used only to keep the example small.
+
+## Basic usage
+
+### 1. Prepare the source index
+
+Run in Elasticsearch Dev Tools or an equivalent HTTP client:
+
+```http
+PUT /migration_demo
+{
+  "mappings": {
+    "properties": {
+      "title": { "type": "keyword" }
+    }
+  }
+}
+
+PUT /migration_demo/_doc/one?refresh=true
+{ "title": "first" }
+
+PUT /migration_demo/_doc/two?refresh=true
+{ "title": "second" }
+```
+
+Expected result: the index contains two searchable documents with IDs `one` 
and `two`.
+
+### 2. Create the catalog and preserve document IDs
+
+```sql
+CREATE CATALOG migration_es PROPERTIES (
+    'type' = 'es',
+    'hosts' = 'http://es-host:9200',
+    'user' = '<es_user>',
+    'password' = '<es_password>',
+    'mapping_es_id' = 'true'
+);
+DESC migration_es.default_db.migration_demo;
+
+CREATE DATABASE IF NOT EXISTS migration_target;
+CREATE TABLE migration_target.es_demo (
+    doc_id VARCHAR(512),
+    title STRING
+)
+DUPLICATE KEY(doc_id)
+DISTRIBUTED BY HASH(doc_id) BUCKETS 1
+PROPERTIES ('replication_num' = '1');
+
+INSERT INTO migration_target.es_demo (doc_id, title)
+SELECT _id, title FROM migration_es.default_db.migration_demo;
+
+SELECT doc_id, title FROM migration_target.es_demo ORDER BY doc_id;
+```
+
+```text
++--------+--------+
+| doc_id | title  |
++--------+--------+
+| one    | first  |
+| two    | second |
++--------+--------+
+```
+
+## Options reference
+
+| Parameter | Type | Required | Default | Description |
+| --- | --- | --- | --- | --- |
+| `hosts` | STRING | Yes | None | ES HTTP addresses reachable from every FE/BE 
|
+| `user` / `password` | STRING | Depends on ES authentication | Empty | 
Credentials when Basic authentication is enabled |
+| `mapping_es_id` | boolean | No | `false` | Exposes document `_id`; enabled 
in this example |
+| `enable_docvalue_scan` | boolean | No | `true` | Attempts doc-values reads 
for supported fields |
+| `nodes_discovery` | boolean | No | `true` | Discovers nodes; may need 
disabling in isolated networks |
+
+See [ES Catalog](../lakehouse/catalogs/es-catalog.md) for all parameters, 
authentication, and array annotations.
+
+## Types and search semantics
+
+- The ES Catalog maps `object` and `nested` to JSON, not automatically to 
VARIANT. Convert explicitly and test before using a different target type.
+- ES fields may contain both scalars and arrays. Configure 
`_meta.doris.array_fields` as documented, inspect `DESC`, and examine real 
samples rather than inferring the entire column from one document.
+- Validate date formats, time zones, numeric ranges, and missing fields. An 
analyzed `text` field differs from a `keyword` field used for exact matching.
+- Doris [inverted indexes](../table-design/index/inverted-index/overview.md) 
support full-text search, but ES DSL, scoring, nested queries, and analyzers 
are not automatically equivalent. Test real query results rather than 
mechanically replacing syntax.
+
+## Validation and errors
+
+During a write-free source window, compare document counts and distinct `_id` 
counts; both should be 2 in this example. Compare original `_source` samples 
with target columns, including missing values, JSON arrays, and dates.
+
+For metadata errors, check index-read, cluster-state, and node HTTP 
permissions. For paging failures, check source-node connectivity and 
node-discovery settings. Index changes during migration can affect consistency; 
establish a stable snapshot or a defined write-free window. Repeating INSERT 
appends rows, so establish the imported ranges before resuming.
+
+## Best practices
+
+Verify field reads and search semantics before scaling to batches. Continuous 
mirrors need separately designed updates, deletes, ordering, and replay by 
document ID; a catalog is not a CDC task. See [Migration 
Overview](./overview.md) for cutover guidance.
diff --git a/versioned_docs/version-4.x/migration/mysql-to-doris.md 
b/versioned_docs/version-4.x/migration/mysql-to-doris.md
new file mode 100644
index 00000000000..241b578c6c8
--- /dev/null
+++ b/versioned_docs/version-4.x/migration/mysql-to-doris.md
@@ -0,0 +1,112 @@
+---
+{
+    "title": "MySQL to Doris",
+    "language": "en",
+    "description": "Migrate MySQL in batches with JDBC and choose CDC, type 
mappings, and validation."
+}
+---
+
+This guide uses the MySQL JDBC Catalog to copy a stable snapshot into a Doris 
internal table. It suits one-time or scheduled batch migration and does not 
automatically propagate later updates, deletes, or DDL. See the CDC options 
below for continuous synchronization.
+
+## Prerequisites
+
+- A MySQL database named `migration_source` and a source account with SELECT 
access to the sample table.
+- Connectivity from every Doris FE/BE to the source. Install 
`mysql-connector-j-8.3.0.jar` following the [MySQL 
Catalog](../lakehouse/catalogs/jdbc-mysql-catalog.md) and [driver 
deployment](../lakehouse/catalogs/jdbc-catalog-overview.md) references. The 
example uses a driver filename, so the Jar must exist in `jdbc_drivers_dir` on 
all FE/BE nodes.
+- A Doris account with permissions to create catalogs/databases/tables, read 
the external table, and load the target. See 
[authorization](../admin-manual/auth/authorization/internal.md).
+- Run the source setup inside `migration_source`; use an empty target table. 
Replace the sample hosts, username, and password.
+
+## Basic usage
+
+### 1. Prepare the source table
+
+Prepare this sample in the source database using an account with CREATE and 
INSERT privileges. The catalog connection uses the source read account 
described above.
+
+```sql
+CREATE TABLE migration_demo (
+    id BIGINT PRIMARY KEY,
+    amount DECIMAL(12,2),
+    note VARCHAR(100)
+);
+INSERT INTO migration_demo VALUES (1, 12.50, 'first'), (2, NULL, NULL);
+```
+
+Result: the table is created with 2 rows.
+
+### 2. Create and inspect the catalog in Doris
+
+```sql
+CREATE CATALOG migration_mysql PROPERTIES (
+    'type' = 'jdbc',
+    'user' = 'migration_reader',
+    'password' = '<source_password>',
+    'jdbc_url' = 'jdbc:mysql://mysql-host:3306/migration_source',
+    'driver_url' = 'mysql-connector-j-8.3.0.jar',
+    'driver_class' = 'com.mysql.cj.jdbc.Driver'
+);
+DESC migration_mysql.migration_source.migration_demo;
+```
+
+The external schema should contain `id`, `amount`, and `note`. Inspect their 
actual mapped types before creating the target.
+
+### 3. Create the target and copy the data
+
+```sql
+CREATE DATABASE IF NOT EXISTS migration_target;
+CREATE TABLE migration_target.mysql_demo (
+    id BIGINT NOT NULL,
+    amount DECIMAL(12,2),
+    note STRING
+)
+DUPLICATE KEY(id)
+DISTRIBUTED BY HASH(id) BUCKETS 1
+PROPERTIES ('replication_num' = '1');
+
+INSERT INTO migration_target.mysql_demo (id, amount, note)
+SELECT id, amount, note FROM migration_mysql.migration_source.migration_demo;
+
+SELECT id, amount, note FROM migration_target.mysql_demo ORDER BY id;
+```
+
+```text
++------+--------+-------+
+| id   | amount | note  |
++------+--------+-------+
+|    1 |  12.50 | first |
+|    2 |   NULL | NULL  |
++------+--------+-------+
+```
+
+One replica and one bucket keep the example suitable for local verification. 
Size production tables for available BEs and reliability requirements. 
Repeating the INSERT appends duplicate rows.
+## Connection options
+
+| Parameter | Type | Required / default | Description |
+| --- | --- | --- | --- |
+| `type` | STRING | Required, no default | Use `jdbc` |
+| `user` / `password` | STRING | Required, no default | Source database 
credentials |
+| `jdbc_url` | STRING | Required, no default | Source JDBC connection URL, 
including the database name |
+| `driver_url` | STRING | Required, no default | Jar accessible to every 
FE/BE; this example uses a preinstalled filename |
+| `driver_class` | STRING | Required, no default | Java class for the selected 
driver |
+
+See the [full JDBC reference](../lakehouse/catalogs/jdbc-catalog-overview.md) 
for connection pools, name mapping, and driver-location controls.
+
+## Types and version differences {#data-type-mapping}
+
+- Widen unsigned integers: for example, `INT UNSIGNED` maps to `BIGINT` and 
`BIGINT UNSIGNED` to `LARGEINT`. Do not copy their signed equivalents unchanged.
+- The MySQL JDBC Catalog maps JSON to `STRING`, not automatically to 
`VARIANT`. Follow catalog mappings for `TIME`, `ENUM`, and `SET`; JDBC and CDC 
do not necessarily use the same rules.
+- JDBC metadata for `TINYINT(1)` depends on driver settings. Inspect `DESC` 
rather than treating every TINYINT as Boolean.
+- In the 4.1 series since 4.1.5, `TIMESTAMP` uses `TIMESTAMPTZ` and binary 
types use `VARBINARY`; `DATETIME` remains a time-zone-free date-time. Earlier 
mappings and configuration differ. Dev uses the current mapping.
+- Batch INSERT does not copy primary-key behavior, AUTO_INCREMENT, indexes, or 
source constraints. See the [MySQL mapping 
reference](../lakehouse/catalogs/jdbc-mysql-catalog.md) for complete rules.
+
+## Continuous synchronization
+
+Use [Flink CDC 
synchronization](../connection-integration/data-integration/flink-doris-connector.md)
 when the migration must hand off an initial snapshot and propagate later 
updates/deletes. Choose compatible Flink, CDC, and Doris Connector versions 
from the connector reference rather than combining independent minimum-version 
claims.
+
+## Validation and errors
+
+For the same snapshot and bounded range, run `COUNT(*)`, `COUNT(amount)`, and 
`SUM(amount)` on source `migration_mysql.migration_source.migration_demo` and 
target `migration_target.mysql_demo`. This example should return `2`, `1`, and 
`12.50`, respectively. Also inspect exact sample values, NULLs, precision, and 
time zones. See [Migration Overview](./overview.md) for full validation and 
cutover.
+
+For connection failures, check connectivity from all FE/BE nodes, driver 
files, source permissions, and driver-location restrictions. Inspect `DESC` and 
convert explicitly for incompatible types. After a failed import, establish 
which ranges were written before retrying; do not blindly repeat the entire 
INSERT.
+
+## Best practices
+
+Validate the environment with this small table, then batch larger migrations 
by stable keys or time ranges. Continuous replication needs a target model that 
handles updates, deletes, and replay; design snapshot tables and ongoing 
mirrors separately.
diff --git a/versioned_docs/version-4.x/migration/other-olap-to-doris.md 
b/versioned_docs/version-4.x/migration/other-olap-to-doris.md
new file mode 100644
index 00000000000..3484615d883
--- /dev/null
+++ b/versioned_docs/version-4.x/migration/other-olap-to-doris.md
@@ -0,0 +1,68 @@
+---
+{
+    "title": "Other OLAP Systems to Doris",
+    "language": "en",
+    "description": "Choose migration routes and validation for ClickHouse, 
Greenplum, and lakehouse tables."
+}
+---
+
+ClickHouse, Greenplum, and lakehouse tables can be copied to Doris through 
their corresponding catalogs. Define snapshot, update, and aggregation 
semantics before selecting a target model; source storage engines do not have 
automatic, complete Doris equivalents.
+
+## Routes and prerequisites
+
+| Source | Connection and options reference | Checks before migration |
+| --- | --- | --- |
+| ClickHouse | [ClickHouse JDBC 
Catalog](../lakehouse/catalogs/jdbc-clickhouse-catalog.md) | Drivers, unsigned 
integers, date-time and complex-type mappings |
+| Greenplum | [PostgreSQL JDBC 
Catalog](../lakehouse/catalogs/jdbc-pg-catalog.md) | Compatible driver, actual 
metadata, and consistency of distributed exports |
+| Hive | [Hive Catalog](../lakehouse/catalogs/hive-catalog.mdx) | Metastore, 
file storage, authentication, and partitions |
+| Iceberg | [Iceberg Catalog](../lakehouse/catalogs/iceberg-catalog.mdx) | 
Metadata service, storage permissions, and a consistent snapshot |
+| Hudi | [Hudi Catalog](../lakehouse/catalogs/hudi-catalog.md) | Table type, 
visible view, underlying files, and query limitations |
+
+Every FE/BE must reach the required services, drivers, and storage. Configure 
a catalog following its reference and use a Doris account allowed to read the 
external table and create/load the target.
+
+## ClickHouse {#clickhouse}
+
+Use the JDBC Catalog and explicit columns in `INSERT INTO ... SELECT`. Run 
`DESC` first; suggested target designs are not the actual JDBC mappings. For 
example, the catalog does not promise a direct CHAR mapping for ClickHouse 
`FixedString`; test Map/Tuple and other complex-type support for the actual 
driver and Doris version.
+
+For `ReplacingMergeTree`, `CollapsingMergeTree`, and aggregate-state tables, 
establish the final visible rows, version columns, deletion markers, and merge 
rules. A Doris Unique Key table does not automatically reproduce all 
source-engine semantics. Test SQL differences involving NULLs, tied extrema, 
array expansion, and JSON string extraction.
+
+## Greenplum {#greenplum}
+
+Follow the batch workflow in [PostgreSQL migration](./postgresql-to-doris.md), 
checking the actual Greenplum mappings. Parallel exports and SQL batches must 
share a consistent source view; concurrency alone does not establish a 
cross-table snapshot.
+
+## Data lake {#data-lake}
+
+Use the respective Hive, Iceberg, and Hudi catalogs. Pin the intended Iceberg 
snapshot during migration. For Hudi, establish which view is read and which 
table types the deployed version supports. Creating a catalog only makes 
external data accessible; it does not create a Doris copy.
+
+## Basic usage
+
+Assume `source_catalog` is configured as described above and 
`analytics.migration_demo` contains `id BIGINT` and `value DECIMAL(12,2)`, with 
a fixed source snapshot. Verify these types with `DESC`, then run in Doris:
+
+```sql
+CREATE DATABASE IF NOT EXISTS migration_target;
+CREATE TABLE migration_target.olap_demo (
+    id BIGINT,
+    `value` DECIMAL(12,2)
+)
+DUPLICATE KEY(id)
+DISTRIBUTED BY HASH(id) BUCKETS 1
+PROPERTIES ('replication_num' = '1');
+
+INSERT INTO migration_target.olap_demo (id, `value`)
+SELECT id, `value` FROM source_catalog.analytics.migration_demo;
+
+SELECT COUNT(*), SUM(`value`) FROM source_catalog.analytics.migration_demo;
+SELECT COUNT(*), SUM(`value`) FROM migration_target.olap_demo;
+```
+
+Expected result: the empty target receives both selected columns from the 
source snapshot, and the two validation queries return equal row counts and 
sums. One replica and one bucket are illustrative; size production tables for 
resources and reliability. See [MySQL](./mysql-to-doris.md) or 
[PostgreSQL](./postgresql-to-doris.md) for a complete fixed-input example.
+
+## Other loading methods
+
+If a direct connection is unavailable, export supported files and use [S3 
Load](../data-operate/import/data-source/amazon-s3.md) or [Broker 
Load](../data-operate/import/import-way/broker-load-manual.md). Establish file 
formats, encoding, NULL representation, precision, and time zones before 
scaling the import.
+
+You can also use the [Spark 
Connector](../connection-integration/data-integration/spark-doris-connector.md) 
or [Flink 
Connector](../connection-integration/data-integration/flink-doris-connector.md).
 Follow each connector's reference for batch/streaming capabilities, compatible 
versions, and semantics.
+
+## Errors and best practices
+
+Validate bounded samples before increasing batch sizes or concurrency. Convert 
unsupported types explicitly and inspect precision loss rather than skipping 
columns. Repeating INSERT into a Duplicate Key target appends duplicate rows; 
establish completed ranges before resuming. Complete the cross-system checks in 
[Migration Overview](./overview.md) before cutover and retain source data and a 
rollback route.
diff --git a/versioned_docs/version-4.x/migration/overview.md 
b/versioned_docs/version-4.x/migration/overview.md
new file mode 100644
index 00000000000..f287c8cdcbb
--- /dev/null
+++ b/versioned_docs/version-4.x/migration/overview.md
@@ -0,0 +1,56 @@
+---
+{
+    "title": "Migration Overview",
+    "language": "en",
+    "description": "Choose a migration method, design target tables, and 
validate the result."
+}
+---
+
+Apache Doris supports migration through external catalogs, CDC tools, and file 
loading. Copying table data does not migrate source transactions, indexes, 
constraints, procedures, permissions, or SQL semantics. First decide whether 
you need a one-time snapshot or continuous propagation of updates and deletes.
+
+## Migration paths
+
+| Source | One-time or batch migration | Continuous synchronization |
+| --- | --- | --- |
+| [PostgreSQL](./postgresql-to-doris.md) | PostgreSQL JDBC Catalog + `INSERT 
INTO ... SELECT` | Flink CDC |
+| [MySQL](./mysql-to-doris.md) | MySQL JDBC Catalog + `INSERT INTO ... SELECT` 
| Flink CDC |
+| [Elasticsearch](./elasticsearch-to-doris.md) | ES Catalog + `INSERT INTO ... 
SELECT` | Design change capture, updates, and deletion handling separately |
+| [ClickHouse / Greenplum](./other-olap-to-doris.md) | The corresponding JDBC 
Catalog or file loading | Depends on the source system |
+| [Hive / Iceberg / Hudi](./other-olap-to-doris.md#data-lake) | The 
corresponding lakehouse catalog + `INSERT INTO ... SELECT` | Scheduled batches 
or an appropriate connector |
+
+A catalog makes external data queryable; creating one does not copy data into 
Doris internal tables. A batch `INSERT INTO ... SELECT` does not continuously 
capture later updates or deletes.
+
+## Basic workflow
+
+1. Verify connectivity from every FE/BE, driver deployment, source read 
permissions, and Doris permissions to create catalogs/tables and load data.
+2. Establish a stable source snapshot or a write-free window. Catalog queries 
across tables or batches do not automatically form a globally consistent 
snapshot.
+3. Inspect actual mappings with `DESC catalog.database.table` and design the 
target using an appropriate [data model](../table-design/data-model/intro.mdx). 
Do not directly copy source keys, engines, or indexes.
+4. Complete a small pilot migration. The MySQL and PostgreSQL guides include 
reproducible table setup, imports, and query results.
+5. Import bounded key or time ranges, record completed ranges and CDC 
positions, validate the result, and then switch read traffic.
+
+## Configuration and types
+
+| Item | What to verify |
+| --- | --- |
+| Catalog | Drivers, connection addresses, authentication, and driver-location 
controls; see [JDBC Catalog](../lakehouse/catalogs/jdbc-catalog-overview.md) or 
[ES Catalog](../lakehouse/catalogs/es-catalog.md) |
+| Target table | Key model, partitions, buckets, replicas, and update ordering 
|
+| Type mapping | Mapping depends on the import method, driver, and Doris 
version; JDBC mappings are not CDC mappings |
+| Time and binary data | Check time zones, microsecond precision, and byte 
preservation. Some JDBC mappings changed in 4.1.5; use the reference for the 
deployed version |
+| Incremental synchronization | Snapshot/log-position handoff, primary keys, 
replay, updates, and deletes |
+
+## Validation and cutover
+
+For the same source snapshot and bounded range, compare row counts, distinct 
keys, NULL counts, numeric sums, and extrema. Sample exact values for 
timestamps, decimals, binary data, arrays, and semi-structured columns. 
Matching row counts alone do not prove correctness.
+
+For continuous synchronization, test inserts, updates, and deletes, as well as 
lag and restart behavior. Switch application reads only after verification, 
retaining source data and a rollback route.
+
+## Errors and caveats
+
+- Repeating a batch INSERT may duplicate rows, particularly in Duplicate Key 
tables. Define a replay strategy before resuming. A Unique Key table does not 
automatically remove rows deleted at the source.
+- Source changes during multiple batches can cause gaps or duplication. Use a 
consistent snapshot, a write-free window, or a reliable CDC handoff.
+- For unsupported types, case differences, or precision changes, inspect the 
external table with `DESC`, convert explicitly, and validate again. Do not 
silently omit incompatible columns.
+- Synchronous INSERT, asynchronous load jobs, Flink, and Streaming Jobs use 
different status interfaces. Follow the relevant loading reference rather than 
relying on `SHOW LOAD` for every method.
+
+## Best practices
+
+Start with representative small tables, then size batches and concurrency for 
measured data volume, query load, and available resources. Verify query results 
and update semantics before cutover, and retain completed ranges and validation 
records.
diff --git a/versioned_docs/version-4.x/migration/postgresql-to-doris.md 
b/versioned_docs/version-4.x/migration/postgresql-to-doris.md
new file mode 100644
index 00000000000..1d5de70c03b
--- /dev/null
+++ b/versioned_docs/version-4.x/migration/postgresql-to-doris.md
@@ -0,0 +1,112 @@
+---
+{
+    "title": "PostgreSQL to Doris",
+    "language": "en",
+    "description": "Migrate PostgreSQL in batches with JDBC and choose CDC, 
type mappings, and validation."
+}
+---
+
+This guide uses the PostgreSQL JDBC Catalog to copy a stable snapshot into a 
Doris internal table. It suits one-time or scheduled batch migration and does 
not automatically propagate later updates, deletes, or DDL. See the CDC options 
below for continuous synchronization.
+
+## Prerequisites
+
+- A PostgreSQL database named `migration_source` and a source account with 
SELECT access to the sample table.
+- Connectivity from every Doris FE/BE to the source. Install 
`postgresql-42.5.6.jar` following the [PostgreSQL 
Catalog](../lakehouse/catalogs/jdbc-pg-catalog.md) and [driver 
deployment](../lakehouse/catalogs/jdbc-catalog-overview.md) references. The 
example uses a driver filename, so the Jar must exist in `jdbc_drivers_dir` on 
all FE/BE nodes.
+- A Doris account with permissions to create catalogs/databases/tables, read 
the external table, and load the target. See 
[authorization](../admin-manual/auth/authorization/internal.md).
+- Run the source setup inside `migration_source`; use an empty target table. 
Replace the sample hosts, username, and password.
+
+## Basic usage
+
+### 1. Prepare the source table
+
+Prepare this sample in the source database using an account with CREATE and 
INSERT privileges. The catalog connection uses the source read account 
described above.
+
+```sql
+CREATE TABLE public.migration_demo (
+    id BIGINT PRIMARY KEY,
+    amount DECIMAL(12,2),
+    note VARCHAR(100)
+);
+INSERT INTO public.migration_demo VALUES (1, 12.50, 'first'), (2, NULL, NULL);
+```
+
+Result: the table is created with 2 rows.
+
+### 2. Create and inspect the catalog in Doris
+
+```sql
+CREATE CATALOG migration_pg PROPERTIES (
+    'type' = 'jdbc',
+    'user' = 'migration_reader',
+    'password' = '<source_password>',
+    'jdbc_url' = 'jdbc:postgresql://pg-host:5432/migration_source',
+    'driver_url' = 'postgresql-42.5.6.jar',
+    'driver_class' = 'org.postgresql.Driver'
+);
+DESC migration_pg.public.migration_demo;
+```
+
+The external schema should contain `id`, `amount`, and `note`. Inspect their 
actual mapped types before creating the target.
+
+### 3. Create the target and copy the data
+
+```sql
+CREATE DATABASE IF NOT EXISTS migration_target;
+CREATE TABLE migration_target.pg_demo (
+    id BIGINT NOT NULL,
+    amount DECIMAL(12,2),
+    note STRING
+)
+DUPLICATE KEY(id)
+DISTRIBUTED BY HASH(id) BUCKETS 1
+PROPERTIES ('replication_num' = '1');
+
+INSERT INTO migration_target.pg_demo (id, amount, note)
+SELECT id, amount, note FROM migration_pg.public.migration_demo;
+
+SELECT id, amount, note FROM migration_target.pg_demo ORDER BY id;
+```
+
+```text
++------+--------+-------+
+| id   | amount | note  |
++------+--------+-------+
+|    1 |  12.50 | first |
+|    2 |   NULL | NULL  |
++------+--------+-------+
+```
+
+One replica and one bucket keep the example suitable for local verification. 
Size production tables for available BEs and reliability requirements. 
Repeating the INSERT appends duplicate rows.
+## Connection options
+
+| Parameter | Type | Required / default | Description |
+| --- | --- | --- | --- |
+| `type` | STRING | Required, no default | Use `jdbc` |
+| `user` / `password` | STRING | Required, no default | Source database 
credentials |
+| `jdbc_url` | STRING | Required, no default | Source JDBC connection URL, 
including the database name |
+| `driver_url` | STRING | Required, no default | Jar accessible to every 
FE/BE; this example uses a preinstalled filename |
+| `driver_class` | STRING | Required, no default | Java class for the selected 
driver |
+
+See the [full JDBC reference](../lakehouse/catalogs/jdbc-catalog-overview.md) 
for connection pools, name mapping, and driver-location controls.
+
+## Types and version differences {#data-type-mapping}
+
+- JDBC maps PostgreSQL `json/jsonb` to `STRING`, not automatically to 
`VARIANT`. Convert explicitly and validate if the target uses another type.
+- The catalog uses string mappings for PostgreSQL `time`, `timetz`, and 
`interval`. This does not mean that Doris lacks a TIME type.
+- `numeric` without usable precision, or outside the supported decimal range, 
may map to `STRING`. Inspect the external type before numeric calculations.
+- In the 4.1 series since 4.1.5, `timestamptz` maps to `TIMESTAMPTZ` and 
`bytea` to `VARBINARY`; earlier mappings and configuration differ. Dev uses the 
current mapping. Verify time zones, precision, and byte-for-byte binary 
equality.
+- Array dimension inference needs source data and can report an unsupported 
type when no usable data exists. Validate each column against the [PostgreSQL 
mapping reference](../lakehouse/catalogs/jdbc-pg-catalog.md).
+
+## Continuous synchronization
+
+Use [Flink CDC 
synchronization](../connection-integration/data-integration/flink-doris-connector.md)
 when the migration must hand off an initial snapshot and propagate later 
updates/deletes. Choose compatible Flink, CDC, and Doris Connector versions 
from the connector reference rather than combining independent minimum-version 
claims.
+
+## Validation and errors
+
+For the same snapshot and bounded range, run `COUNT(*)`, `COUNT(amount)`, and 
`SUM(amount)` on source `migration_pg.public.migration_demo` and target 
`migration_target.pg_demo`. This example should return `2`, `1`, and `12.50`, 
respectively. Also inspect exact sample values, NULLs, precision, and time 
zones. See [Migration Overview](./overview.md) for full validation and cutover.
+
+For connection failures, check connectivity from all FE/BE nodes, driver 
files, source permissions, and driver-location restrictions. Inspect `DESC` and 
convert explicitly for incompatible types. After a failed import, establish 
which ranges were written before retrying; do not blindly repeat the entire 
INSERT.
+
+## Best practices
+
+Validate the environment with this small table, then batch larger migrations 
by stable keys or time ranges. Continuous replication needs a target model that 
handles updates, deletes, and replay; design snapshot tables and ongoing 
mirrors separately.
diff --git a/versioned_sidebars/version-4.x-sidebars.json 
b/versioned_sidebars/version-4.x-sidebars.json
index 8458650e2d8..d8bc243771d 100644
--- a/versioned_sidebars/version-4.x-sidebars.json
+++ b/versioned_sidebars/version-4.x-sidebars.json
@@ -20,6 +20,21 @@
             "getting-started/before-you-start-the-poc"
           ]
         },
+        {
+          "type": "category",
+          "label": "Migration",
+          "link": {
+            "type": "doc",
+            "id": "migration/overview"
+          },
+          "collapsed": true,
+          "items": [
+            "migration/postgresql-to-doris",
+            "migration/mysql-to-doris",
+            "migration/elasticsearch-to-doris",
+            "migration/other-olap-to-doris"
+          ]
+        },
         {
           "type": "category",
           "label": "Features & Architecture",


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to