全部产品
Search
文档中心

Hologres:Migrasi dari MySQL ke Hologres

更新时间:Feb 15, 2026

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.

Catatan

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.

Sinkronisasi 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.

Sinkronisasi satu tabel MySQL 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.

Solusi sinkronisasi ke Hologres

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

BINARY(n)

BYTEA

BIT

BOOLEAN

CHAR(n), CHARACTER(n)

CHAR(n), CHARACTER(n)

DATE

DATE

DATETIME

TIMESTAMPTZ (TIMESTAMP WITH TIME ZONE)

DECIMAL(p,s), DEC(p,s)

DECIMAL(p,s), DEC(p,s)

DOUBLE

DOUBLE PRECISION

FLOAT

REAL

INT, INTEGER

INT, INTEGER

MEDIUMINT

INTEGER

NUMERIC(p,s)

NUMERIC(p,s)

SMALLINT

SMALLINT

TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB

BYTEA

TINYINT

SMALLINT

TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT

TEXT

TIME

TIME [WITHOUT TIME ZONE]

TIMESTAMP

TIMESTAMP [WITH TIME ZONE]

VARBINARY(n), VARBINARY(max)

BYTEA

VARCHAR(n)

VARCHAR(n)

VARCHAR(max)

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 b dengan select "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 standar offset 0 limit 10.

  • Pengurutan

    MySQL menggunakan desc nulls first asc nulls first untuk pengurutan. Perilaku pengurutan default di Hologres adalah desc 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.

    Catatan

    Fitur 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-wide
  • Union

    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 0 menyebabkan 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)