PolarDB-X memungkinkan Anda mengonversi database yang sudah ada dalam mode Distributed Relational Database Service (DRDS) menjadi database dalam mode AUTO menggunakan satu pernyataan SQL—yaitu CREATE DATABASE LIKE (hanya skema) atau CREATE DATABASE AS (skema dan data). Database DRDS sumber tetap dipertahankan selama proses; database AUTO tujuan baru dibuat di sampingnya sehingga Anda dapat memverifikasi hasil dan melakukan rollback jika diperlukan sebelum menghentikan penggunaan sumber.
Pilih pernyataan
CREATE DATABASE LIKE | CREATE DATABASE AS | |
|---|---|---|
| Mengonversi skema tabel | Ya | Ya |
| Menyalin data tabel | Tidak | Ya |
| Durasi khas | ~10 menit (hanya skema) | ~10 menit 37 detik (44 GB, 4 tabel x 50 juta baris) |
| Gunakan saat | Memvalidasi hasil konversi skema sebelum melakukan migrasi penuh | Melakukan migrasi lengkap skema dan data |
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Instans PolarDB-X yang menjalankan versi 5.4.16-16717637 atau lebih baru. Untuk memeriksa versi Anda, lihat Lihat versi instans.
Kapasitas penyimpanan tersisa yang mencukupi. Jika penyimpanan tidak mencukupi, konversi akan gagal.
Catatan penggunaan
Selama konversi, PolarDB-X menerapkan read lock pada database DRDS sumber. Database menjadi read-only—tidak ada pernyataan DML atau DDL yang dapat dijalankan terhadapnya hingga konversi selesai. Jadwalkan konversi selama jam sepi atau di lingkungan pengujian untuk menghindari gangguan bisnis.
Jangan menjalankan pernyataan DML atau DDL pada database DRDS sumber maupun database AUTO tujuan selama konversi. Melakukannya menyebabkan konversi gagal.
Database DRDS sumber tetap dipertahankan setelah konversi. Database AUTO tujuan baru dibuat di sampingnya, sehingga Anda dapat memverifikasi hasil dan melakukan rollback jika diperlukan sebelum menghentikan penggunaan sumber.
Sintaks
CREATE DATABASE [IF NOT EXISTS] auto_database_name
{ LIKE | AS } drds_database_name
[convert_option_list]
convert_option_list:
convert_option [convert_option...] [{ include_list | exclude_list }]
convert_option:
mode=auto
| dry_run={ true | false }
| lock={ true | false }
| create_tables={ true | false }
include_list:
include=table_name [,table_name...]
exclude_list:
exclude=table_name [,table_name...]Parameter
| Parameter | Deskripsi | Bawaan |
|---|---|---|
auto_database_name | Nama database AUTO tujuan yang akan dibuat. | — |
drds_database_name | Nama database DRDS sumber. | — |
mode | Mode database untuk database tujuan. Atur ke auto. | — |
dry_run | Atur ke true untuk melihat pratinjau hasil konversi skema tanpa membuat tabel atau menyalin data. Database sumber tidak dikunci dalam mode dry-run. Atur ke false untuk menjalankan konversi sesungguhnya. | false |
lock | Atur ke true untuk menerapkan read lock pada database DRDS sumber selama konversi, menjaga konsistensi data antara sumber dan tujuan. Atur ke false untuk melewati penguncian — gunakan ini hanya dalam dry run atau lingkungan pengujian, bukan dalam migrasi produksi, karena melewatkan penguncian menyebabkan inkonsistensi data antara sumber dan tujuan. | true |
create_tables | Atur ke true agar PolarDB-X secara otomatis mengonversi dan membuat skema tabel di database AUTO tujuan. Atur ke false jika Anda ingin full kontrol atas skema partisi: buat terlebih dahulu database AUTO tujuan beserta semua tabelnya sendiri (sesuai nama tabel dan definisi kolom dari sumber), lalu PolarDB-X hanya akan menyalin datanya. | true |
include | Hanya mengonversi tabel yang ditentukan. | — |
exclude | Melewati tabel yang ditentukan selama konversi. | — |
Mengonversi database
Contoh berikut mencakup skenario paling umum. Semua contoh menggunakan db_drds sebagai database DRDS sumber dan db_auto sebagai database AUTO tujuan.
Hanya mengonversi skema (tanpa data)
Gunakan CREATE DATABASE LIKE ketika Anda ingin memvalidasi tampilan skema tabel dalam mode AUTO sebelum menjalankan migrasi penuh.
CREATE DATABASE db_auto LIKE db_drds mode=auto;Output yang diharapkan:
+-------------+
| RESULT |
+-------------+
| ALL SUCCESS |
+-------------+
1 row in set (10 min 32.17 sec)Mengonversi skema dan menyalin data
Gunakan CREATE DATABASE AS untuk menjalankan migrasi penuh.
CREATE DATABASE db_auto AS db_drds mode=auto;Output yang diharapkan:
+-------------+
| RESULT |
+-------------+
| ALL SUCCESS |
+-------------+
1 row in set (10 min 37.30 sec)Memigrasikan tabel tertentu ke database tujuan yang sudah ada
Jika database tujuan db_auto_exist sudah ada, gunakan IF NOT EXISTS untuk menambahkan tabel tb1 tanpa membuat ulang database.
CREATE DATABASE IF NOT EXISTS db_auto_exist AS db_drds include=tb1;Output yang diharapkan:
+-------------+
| RESULT |
+-------------+
| ALL SUCCESS |
+-------------+
1 row in set (8 min 12.05 sec)Pratinjau konversi skema tanpa membuat perubahan
Atur dry_run=true untuk melihat pratinjau pemetaan skema DRDS ke skema AUTO. Tidak ada tabel yang dibuat dan tidak ada data yang disalin. Database sumber tidak dikunci.
CREATE DATABASE db_auto LIKE db_drds dry_run=true include=tb1,tb2;Output yang diharapkan:
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE | CREATE_TABLE_DRDS | CREATE_TABLE_AUTO |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tb1 | CREATE TABLE `tb1` (
`id` int(11) NOT NULL,
`k` int(11) NOT NULL DEFAULT '0',
`c` char(120) NOT NULL DEFAULT '',
`pad` char(60) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 dbpartition by hash(`id`) | CREATE TABLE `tb1` (
`id` int(11) NOT NULL,
`k` int(11) NOT NULL DEFAULT '0',
`c` char(120) NOT NULL DEFAULT '',
`pad` char(60) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY (`id`) PARTITIONS 32 |
| tb2 | CREATE TABLE `tb2` (
`id` int(11) NOT NULL,
`k` int(11) NOT NULL DEFAULT '0',
`c` char(120) NOT NULL DEFAULT '',
`pad` char(60) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 dbpartition by hash(`id`) | CREATE TABLE `tb2` (
`id` int(11) NOT NULL,
`k` int(11) NOT NULL DEFAULT '0',
`c` char(120) NOT NULL DEFAULT '',
`pad` char(60) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY (`id`) PARTITIONS 32 |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.04 sec)Menyalin data ke database tujuan yang telah dibuat sebelumnya
Atur create_tables=false ketika Anda ingin full kontrol atas skema partisi di tujuan. Buat terlebih dahulu db_auto dan semua tabelnya (nama tabel dan definisi kolom sama dengan sumber), lalu jalankan:
CREATE DATABASE db_auto AS db_drds create_tables=false;PolarDB-X menyalin data tetapi tidak membuat database atau tabel.
Output yang diharapkan:
+-------------+
| RESULT |
+-------------+
| ALL SUCCESS |
+-------------+
1 row in set (5 min 47.75 sec)Memantau progres konversi (untuk database besar)
Untuk database besar yang membutuhkan waktu signifikan untuk dikonversi, gunakan tampilan INFORMATION_SCHEMA.CREATE_DATABASE untuk melacak progres selama tugas berjalan.
SELECT * FROM INFORMATION_SCHEMA.CREATE_DATABASE WHERE TARGET_SCHEMA = 'db_auto'\GContoh output:
*************************** 1. row ***************************
DDL_JOB_ID: 1547426040408715264
SOURCE_SCHEMA: db_drds
TARGET_SCHEMA: db_auto
TABLE/SEQ: tb1
STAGE: BACKFILL
STATUS: RUNNING
DETAIL: NULL
SQL_SRC: CREATE TABLE `tb1` (
`id` int(11) NOT NULL,
`k` int(11) NOT NULL DEFAULT '0',
`c` char(120) NOT NULL DEFAULT '',
`pad` char(60) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 dbpartition by hash(`id`)
SQL_DST: CREATE TABLE IF NOT EXISTS `tb1` (
`id` int(11) NOT NULL,
`k` int(11) NOT NULL DEFAULT '0',
`c` char(120) NOT NULL DEFAULT '',
`pad` char(60) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY (`id`) PARTITIONS 32
BACKFILL_START_TIME: 2023-01-01 19:13:01
CURRENT_SPEED(ROWS/SEC): 37632
AVERAGE_SPEED(ROWS/SEC): 216064
FINISHED_ROWS: 216064
APPROXIMATE_TOTAL_ROWS: 1
BACKFILL_PROGRESS: 100%
*************************** 2. row ***************************
DDL_JOB_ID: 1547426040408715264
SOURCE_SCHEMA: db_drds
TARGET_SCHEMA: db_auto
TABLE/SEQ: tb2
STAGE: BACKFILL
STATUS: RUNNING
DETAIL: NULL
SQL_SRC: CREATE TABLE `tb2` (
`id` int(11) NOT NULL,
`k` int(11) NOT NULL DEFAULT '0',
`c` char(120) NOT NULL DEFAULT '',
`pad` char(60) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 dbpartition by hash(`id`)
SQL_DST: CREATE TABLE IF NOT EXISTS `tb2` (
`id` int(11) NOT NULL,
`k` int(11) NOT NULL DEFAULT '0',
`c` char(120) NOT NULL DEFAULT '',
`pad` char(60) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY (`id`) PARTITIONS 32
BACKFILL_START_TIME: 2023-01-01 19:13:01
CURRENT_SPEED(ROWS/SEC): 36608
AVERAGE_SPEED(ROWS/SEC): 211968
FINISHED_ROWS: 211968
APPROXIMATE_TOTAL_ROWS: 1
BACKFILL_PROGRESS: 100%
2 rows in set (0.01 sec)Untuk mendapatkan ringkasan cepat status pekerjaan DDL, jalankan:
SHOW FULL DDL;Jika koneksi terputus sebelum tugas selesai, konversi tetap berjalan. Jalankan SHOW DDL RESULT setelah terhubung kembali untuk melihat hasil akhirnya.
Referensi performa: Pada instans dengan 8 core, memori 64 GB, 4 node komputasi, dan 4 node penyimpanan, mengonversi database dengan 4 tabel masing-masing berisi 50 juta baris (~44 GB total) membutuhkan waktu sekitar 10 menit 37 detik. Durasi aktual bergantung pada tipe instans dan ukuran database. Untuk mendapatkan perkiraan realistis, jalankan konversi uji selama jam sepi dengan lock=false.
Aturan konversi skema (referensi)
Tinjau aturan ini untuk memverifikasi bahwa skema yang dikonversi secara otomatis memenuhi kebutuhan Anda sebelum menjalankan migrasi penuh.
Tabel tunggal dan tabel broadcast
Baik tabel tunggal maupun tabel broadcast dalam mode DRDS dikonversi menjadi broadcast tables dalam mode AUTO.
Tabel sharded
Pemetaan fungsi sharding
| Tipe fungsi sharding DRDS | Fungsi sharding dalam mode DRDS | Fungsi partisi dalam mode AUTO |
|---|---|---|
| Hash | hash(a) | key(a) |
str_hash(a, startIdx, endIdx) | key(a) | |
uni_hash(a) | key(a) | |
right_shift(a) | key(a) | |
range_hash(a, b, 10) | co_hash(right(a,n), right(b,n)) | |
| Tanggal dan waktu | YYYYMM(a) | hash(to_months(a)) |
YYYYWEEK(a) | hash(to_weeks(a)) | |
YYYYDD(a) | hash(to_days(a)) | |
MM(a) | range(month(a)) | |
DD(a) | range(dayofmonth(a)) | |
WEEK(a) | range(dayofweek(a)) | |
MMDD(a) | range(dayofyear(a)) |
Contoh skenario sharding
Contoh berikut menunjukkan cara PolarDB-X mengonversi setiap skenario sharding.
*Hanya sharding database (tanpa partisi tabel)*
Fungsi sharding database dipetakan ke fungsi partisi. Hasilnya memiliki satu level partisi.
-- DRDS mode
CREATE TABLE tb1 (
id INT,
name VARCHAR(20)
) dbpartition BY uni_hash(id);
-- AUTO mode (converted)
CREATE TABLE tb1 (
id INT,
name VARCHAR(20)
) PARTITION BY KEY(id);*Hanya partisi tabel (tanpa sharding database)*
Fungsi sharding tabel dipetakan ke fungsi partisi. Hasilnya memiliki satu level partisi.
-- DRDS mode
CREATE TABLE tb3 (
id INT,
dt DATE
) tbpartition BY week(dt) tbpartitions 4;
-- AUTO mode (converted)
CREATE TABLE tb3 (
id INT,
dt DATE
) PARTITION BY RANGE (dayofweek(`dt`)) (
PARTITION p2 VALUES LESS THAN (2),
PARTITION p3 VALUES LESS THAN (3),
PARTITION p4 VALUES LESS THAN (4),
PARTITION p5 VALUES LESS THAN (5),
PARTITION p6 VALUES LESS THAN (6),
PARTITION pd VALUES LESS THAN MAXVALUE
);*Sharding database dan partisi tabel menggunakan aturan yang sama*
Kedua fungsi sharding dipetakan ke satu fungsi partisi. Jumlah partisi sama dengan hasil kali shard database x shard tabel. Hasilnya memiliki satu level partisi.
-- DRDS mode
CREATE TABLE tb2 (
buyer_id VARCHAR(20),
order_id VARCHAR(20)
) dbpartition BY range_hash(buyer_id, order_id, 10)
tbpartition BY range_hash(buyer_id, order_id, 10) tbpartitions 4;
-- AUTO mode (converted)
CREATE TABLE tb2 (
buyer_id VARCHAR(20),
order_id VARCHAR(20)
) PARTITION BY co_hash(right(buyer_id, 10), right(order_id, 10)) PARTITIONS 64;*Sharding database dan partisi tabel menggunakan aturan berbeda*
Fungsi sharding database menjadi fungsi partisi level-1 (jumlah partisi level-1 = shard database). Fungsi sharding tabel menjadi fungsi partisi level-2 (jumlah partisi level-2 = shard tabel). Hasilnya memiliki dua level partisi.
-- DRDS mode
CREATE TABLE tb5 (
buyer_id VARCHAR(20),
order_id VARCHAR(20)
) dbpartition BY hash(buyer_id)
tbpartition BY hash(order_id) tbpartitions 4;
-- AUTO mode (converted)
CREATE TABLE tb5 (
buyer_id VARCHAR(20),
order_id VARCHAR(20)
) PARTITION BY KEY(buyer_id) PARTITIONS 16
SUBPARTITION BY KEY(order_id) SUBPARTITIONS 4;Aturan konversi sequence
Sequence grup, sequence berbasis waktu (TIME), dan sequence SIMPLE dalam mode DRDS semuanya dikonversi menjadi New Sequences dalam mode AUTO, yang menawarkan performa keseluruhan lebih baik. Untuk detailnya, lihat Sequence.
Batasan konversi
CHARSETdanCOLLATEdari database AUTO tujuan sesuai dengan database DRDS sumber. MenentukanCHARSETatauCOLLATEdalamCREATE DATABASE LIKEatauCREATE DATABASE AStidak didukung.Atribut
LOCALITYdari database DRDS sumber dan tabel-tabelnya tidak dibawa ke database AUTO tujuan. Untuk detailnya, lihat Use the LOCALITY attribute to specify data nodes (DRDS mode).