Topik ini menjelaskan cara melakukan migrasi data dari MySQL ke Hologres serta perbedaan dalam pernyataan kueri dan fungsi setelah migrasi, sehingga membantu Anda menyelesaikan proses migrasi lebih cepat.
Metode migrasi data
Tabel berikut mencantumkan metode migrasi data yang tersedia, skenario penerapannya, serta dokumentasi terkait.
Untuk pemrosesan Extract, Transform, Load (ETL), Anda dapat menggunakan Flink untuk membaca data MySQL dan menuliskannya ke Hologres.
Kategori Migrasi | Skenario | Dokumentasi |
Sync offline untuk satu tabel | Gunakan metode ini untuk menyinkronkan data dari satu tabel MySQL ke Hologres secara offline. | |
Sync real-time untuk satu tabel | Aktifkan binary logging (Binlog) MySQL untuk menyinkronkan data dari satu tabel ke Hologres secara real-time. | |
Sync real-time untuk seluruh database | Menyinkronkan seluruh database MySQL ke Hologres secara real-time. | Sinkronisasi seluruh database MySQL ke Hologres secara real-time |
Solusi sinkronisasi | Data Integration mendukung solusi sinkronisasi. Anda dapat mengonfigurasi aturan sinkronisasi untuk menyinkronkan data ke sumber data target secara real-time dalam satu operasi. Solusi sinkronisasi mendukung sinkronisasi batch multiple tabel dalam satu database serta sinkronisasi data full dan incremental terintegrasi. Proses ini pertama-tama menyinkronkan data lengkap (full), lalu menyinkronkan data inkremental secara real-time. |
Pemetaan tipe data
Lihat tabel berikut untuk pemetaan tipe data saat melakukan migrasi dari MySQL ke Hologres. Untuk informasi selengkapnya tentang tipe data, lihat Referensi tipe data.
Perhatikan hal-hal berikut saat memetakan tipe data dari MySQL ke Hologres:
Hologres memiliki tiga tipe integer: SMALLINT (2 byte), INTEGER (4 byte), dan BIGINT (8 byte). MySQL memiliki lima: TINYINT (1 byte), SMALLINT (2 byte), MEDIUMINT (3 byte), INT (4 byte), dan BIGINT (8 byte). Petakan tipe MySQL ke tipe Hologres dengan ukuran byte yang sama atau lebih besar.
Hologres tidak mendukung integer unsigned. Saat memetakan field unsigned, pertimbangkan kemungkinan overflow. Jika nilai pada field sumber melebihi rentang tipe target, petakan field tersebut ke tipe integer yang lebih besar di Hologres.
Gunakan tipe TEXT di Hologres untuk menggantikan TINYTEXT, TEXT, MEDIUMTEXT, dan LONGTEXT di MySQL.
Tipe floating-point seperti DECIMAL, NUMERIC, DOUBLE, dan FLOAT dapat dipetakan secara langsung.
DATETIME MySQL, yang tidak memiliki zona waktu dan menggunakan format YYYY-MM-DD HH:MM:SS, dipetakan ke
TIMESTAMPTZ(TIMESTAMP WITH TIME ZONE) secara default. Untuk menggunakan tipe TIMESTAMP tanpa zona waktu, tentukan secara eksplisit dalam konfigurasi sinkronisasi atau pernyataan pembuatan tabel.
Tipe data MySQL | Tipe data Hologres setelah migrasi |
BIGINT | BIGINT |
BIGINT(20) UNSIGNED | TEXT |
| BYTEA |
BIT | BOOLEAN |
|
|
DATE | DATE |
DATETIME |
|
|
|
DOUBLE | DOUBLE PRECISION |
FLOAT | REAL |
INT, INTEGER | INT, INTEGER |
MEDIUMINT | INTEGER |
|
|
SMALLINT | SMALLINT |
TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB | BYTEA |
TINYINT | SMALLINT |
TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT | TEXT |
TIME |
|
TIMESTAMP |
|
| BYTEA |
|
|
| TEXT |
Sintaks kueri
Sintaks kueri MySQL dan Hologres berbeda dalam aspek-aspek berikut.
Tanda kutip
Hologres bersifat case-insensitive. Untuk menerapkan case sensitivity, bungkus identifier dengan tanda kutip ganda ("").
Sebagai contoh, ganti
select `A` from bdenganselect "A" from b.Kondisi filter
Hologres memerlukan pencocokan tipe yang tepat dalam kondisi filter dan tidak melakukan konversi tipe implisit secara default. Sebagai contoh:
Kode contoh:
SELECT * FROM business_module WHERE ds = 20210329;Masalah:
Jika field ds bertipe TEXT di Hologres dan 20210329 adalah nilai INTEGER, kueri ini akan mengembalikan error ketidakcocokan tipe:
operator does not exist: text = integer;Solusi:
Anda dapat membuat konversi tipe kustom di Hologres, seperti pada contoh berikut:
CREATE CAST (TEXT AS INTEGER) WITH INOUT AS IMPLICIT; CREATE CAST (TEXT AS BIGINT) WITH INOUT AS IMPLICIT; CREATE CAST (TEXT AS DECIMAL) WITH INOUT AS IMPLICIT; CREATE CAST (TEXT AS TIMESTAMP) WITH INOUT AS IMPLICIT; CREATE CAST (NUMERIC AS TEXT) WITH INOUT AS IMPLICIT;
Paginasi
MySQL menggunakan sintaks
limit 0,10. Di Hologres, gunakan sintaks standaroffset 0 limit 10.Pengurutan
MySQL menggunakan
desc nulls first asc nulls firstuntuk pengurutan. Perilaku pengurutan default di Hologres adalahdesc nulls first asc nulls last.Untuk memastikan perilaku yang konsisten, sesuaikan kueri Hologres secara manual agar menggunakan
order by XXX desc nulls last.Pengelompokan
Hologres tidak mendukung GROUP BY pada tipe non-exact seperti FLOAT atau DOUBLE secara default. Untuk mengatasinya, konversi kolom tersebut ke tipe DECIMAL atau konfigurasi parameter berikut.
CatatanFitur ini memerlukan Hologres V0.10 atau versi yang lebih baru. Jika instans Anda menjalankan versi sebelumnya, bergabunglah dengan grup DingTalk Hologres untuk menghubungi dukungan teknis guna melakukan upgrade. Untuk informasi selengkapnya tentang cara mendapatkan dukungan, lihat Bagaimana cara mendapatkan dukungan online tambahan?.
set hg_experimental_enable_double_equivalent=on;--session level alter database XXX set hg_experimental_enable_double_equivalent=on;--database-wideUnion
Operator UNION mengharuskan kolom dalam kueri memiliki tipe data yang cocok. Sebagai contoh:
Kode contoh:
SELECT project_id FROM tableA union ALL select project_id from tableB;Masalah:
Jika kolom project_id di tableA bertipe BIGINT dan kolom project_id di tableB bertipe TEXT, MySQL melakukan konversi tipe implisit sebelum mengembalikan hasil kueri. Namun, mengeksekusi pernyataan SQL ini di Hologres menyebabkan error. Pesan error berikut dikembalikan:
UNION types bigint and text cannot be matched;Solusi:
Lakukan cast tipe data secara eksplisit dalam operasi UNION:
SELECT project_id FROM tableA union ALL select cast(project_id as bigint) from tableB;
Penggunaan fungsi
Hologres mendukung sebagian besar fungsi yang kompatibel dengan PostgreSQL. Untuk informasi selengkapnya, lihat Fungsi yang kompatibel dengan PostgreSQL. Perhatikan perbedaan berikut antara fungsi di MySQL dan Hologres.
Pembagian dengan nol
Masalah:
Di MySQL, operasi pembagian dengan 0 mengembalikan NULL. Di Hologres, operasi yang sama mengembalikan error:
ERROR: division by zero;Solusi:
select a / b from table; convert to select a / NULLIF(b,0) from table;Di Hologres V1.3.21 dan versi yang lebih baru, Anda dapat mengatur parameter Grand Unified Configuration (GUC) berikut untuk mencegah pembagian dengan
0menyebabkan error. Jika mengalami masalah, lihat Error Umum Persiapan Upgrade yang Gagal atau bergabunglah dengan grup DingTalk Hologres untuk memberikan masukan. Untuk informasi selengkapnya tentang cara mendapatkan dukungan, lihat Bagaimana cara mendapatkan dukungan online tambahan?.--Create the MySQL compatibility extension (requires Superuser; run once per database) create extension if not exists mysql_compatible; --Enable division-by-zero tolerance (allows DQL queries to proceed without error) set mysql_compatible.enable = on;Contoh:
--Create the MySQL compatibility extension (requires Superuser; run once per database) create extension if not exists mysql_compatible; --Scenario 1: Constant division of same type set mysql_compatible.enable = on; select 1/0; --Scenario 2: Constant division with type conversion set mysql_compatible.enable = on; select 1.0/0; --Scenario 3: Dividend is a column variable set mysql_compatible.enable = on; select sum(c) / 0 from (select generate_series(1,100) as c) as t; --Scenario 4: Divisor is a column variable set mysql_compatible.enable = on; select max(c)/sum(d) from (select generate_series(1,101) as c, generate_series(-50,50) as d) as t; --Scenario 5: Tolerate division by zero during INSERT create table if not exists test_insert_divide_by_zero(c1 int); set mysql_compatible.strict_mode = off; set mysql_compatible.enable = on; insert into test_insert_divide_by_zero select 100 / 0.0;
Pembagian integer
Masalah:
Saat Anda membagi dua integer yang menghasilkan sisa, MySQL mengembalikan nilai desimal, sedangkan Hologres mengembalikan integer dan memotong sisanya.
Sebagai contoh, 5 dibagi 2 menghasilkan 2.5 di MySQL tetapi 2 di Hologres.
Solusi:
Untuk mendapatkan hasil yang sama seperti di MySQL, lakukan cast eksplisit salah satu integer ke tipe floating-point:
select 1/2::FLOAT;
Fungsi IF
Hologres tidak mendukung fungsi IF. Gunakan ekspresi CASE WHEN sebagai gantinya.
Fungsi IFNULL
Anda dapat mengganti fungsi IFNULL MySQL dengan fungsi
COALESCE(x,y)di Hologres.Fungsi LENGTH
Anda dapat mengganti fungsi LENGTH MySQL dengan fungsi
CHAR_LENGTH(string)di Hologres.
FAQ
Hasil COUNT DISTINCT tidak konsisten untuk multiple kolom antara MySQL dan Hologres
Akar penyebab
Di MySQL, ekspresi
count(distinct column_1, column_2, ...)mengecualikan baris yang salah satu kolom yang ditentukan berisi nilai NULL.Di Hologres, ekspresi
count(distinct(column_1, column_2, ...))menyertakan baris meskipun beberapa kolom yang ditentukan berisi nilai NULL.Solusi
Untuk mereplikasi perilaku MySQL di Hologres, tulis ulang kueri menjadi
count(distinct column_1 || column_2 || ...).Contoh
CREATE TABLE count_distinct_test ( a text, b text ); INSERT INTO count_distinct_test VALUES ('a', 'b'), ('a', NULL), (NULL, 'b'), ('a', 'b'); -- Hologres multi-column COUNT DISTINCT SELECT count(distinct(a, b)::text) FROM count_distinct_test; -- Result count ------- 3 (1 row) -- Hologres query matching MySQL behavior SELECT count(distinct a||b) FROM count_distinct_test; -- Result count ------- 1 (1 row)