Topik ini menjelaskan cara memigrasikan data dari database Teradata ke instance AnalyticDB for PostgreSQL.
Persyaratan migrasi
- Lakukan migrasi menyeluruh untuk platform data dasar gudang data.
- Lakukan migrasi yang mulus untuk aplikasi yang telah diterapkan pada sistem gudang data.
- Lakukan migrasi tanpa gangguan terhadap pengguna bisnis untuk memastikan operasi tetap konsisten di kedua sistem.
- Pastikan performa optimal dari gudang data setelah migrasi.
- Tentukan durasi dan rencana migrasi yang efisien dan menguntungkan.
- Manfaatkan sepenuhnya arsitektur sistem asli, proses Extract-Transform-Load (ETL), struktur data, serta alat manajemen.
- Untuk migrasi data historis, ekspor terlebih dahulu data ke file teks menggunakan pemisah yang ditentukan dan metode pengkodean karakter. Simpan file yang diekspor di disk lokal instance ECS atau bucket OSS, yang harus berada dalam jaringan yang sama dengan instance AnalyticDB for PostgreSQL. Hal ini memastikan bahwa instance AnalyticDB for PostgreSQL dapat membaca file dari tabel eksternal OSS melalui protokol gpfdist. Selanjutnya, ekspor skrip DDL dari database Teradata dan modifikasi skrip secara batch sesuai sintaksis AnalyticDB for PostgreSQL untuk membuat semua tabel pengguna di instance AnalyticDB for PostgreSQL.
- Untuk migrasi proses ETL rutin, konversikan pernyataan ETL berdasarkan sintaksis Data Manipulation Language (DML) AnalyticDB for PostgreSQL. AnalyticDB for PostgreSQL menyediakan alat berbasis skrip untuk pemetaan sintaksis secara otomatis. Ganti fungsi terkait berdasarkan pemetaan antara fungsi Teradata dan AnalyticDB for PostgreSQL untuk mentransformasi cara mengakses database melalui operasi ETL. Setelah migrasi data historis berhasil, konfigurasikan ulang dan jalankan operasi ETL rutin.
- Instance AnalyticDB for PostgreSQL mendukung protokol JDBC dan ODBC. Alat frontend Business Intelligence (BI) dapat mengakses gudang data melalui protokol tersebut. Untuk migrasi API, cukup modifikasi alamat IP instance.
- Untuk migrasi alat manajemen, terapkan alat cadangan dan pemulihan untuk instance AnalyticDB for PostgreSQL guna mencadangkan data dan melakukan latihan pemulihan secara berkala.
Tipe data inti dari AnalyticDB for PostgreSQL dan Teradata saling kompatibel satu sama lain. Hanya beberapa tipe data yang perlu dimodifikasi. Pernyataan DDL untuk pembuatan tabel dikonversi secara otomatis dalam batch menggunakan alat berbasis skrip di AnalyticDB for PostgreSQL. Tabel berikut mencantumkan tipe data di AnalyticDB for PostgreSQL dan Teradata.
| Teradata | ADB PG |
| CHAR | CHAR |
| VARCHAR | VARCHAR |
| LONG VARCHAR | VARCHAR(64000) |
| VARBYTE(size) | BYTEA |
| BYTEINT | BYTEA |
| SMALLINT | SMALLINT |
| INTEGER | INTEGER |
| DECIMAL(size,dec) | DECIMAL(size,dec) |
| NUMERIC(presisi,dec) | NUMERIC(presisi,dec) |
| FLOAT | FLOAT |
| REAL | REAL |
| DOUBLE PRECISION | DOUBLE PRECISION |
| DATE | DATE |
| TIME | TIME |
| TIMESTAMP | TIMESTAMP |
Pernyataan pembuatan tabel
Bagian ini menggunakan contoh untuk menjelaskan perbedaan antara AnalyticDB for PostgreSQL dan Teradata.
Untuk membuat tabel di Teradata, jalankan pernyataan berikut:
CREATE MULTISET TABLE test_table,NO FALLBACK ,
NO BEFORE JOURNAL,
NO AFTER JOURNAL,
CHECKSUM = DEFAULT,
DEFAULT MERGEBLOCKRATIO
(
first_column DATE FORMAT 'YYYYMMDD' TITLE 'COLUMN 1' NOT NULL,
second_column INTEGER TITLE 'COLUMN 2' NOT NULL ,
third_column CHAR(6) CHARACTER SET LATIN CASESPECIFIC TITLE 'COLUMN 3' NOT NULL ,
fourth_column CHAR(20) CHARACTER SET LATIN CASESPECIFIC TITLE 'COLUMN 4' NOT NULL,
fifth_column CHAR(1) CHARACTER SET LATIN CASESPECIFIC TITLE 'COLUMN 5' NOT NULL,
sixth_column CHAR(24) CHARACTER SET LATIN CASESPECIFIC TITLE 'COLUMN 6' NOT NULL,
seventh_column VARCHAR(18) CHARACTER SET LATIN CASESPECIFIC TITLE 'COLUMN 7' NOT NULL,
eighth_column DECIMAL(18,0) TITLE 'COLUMN 8' NOT NULL ,
nineth_column DECIMAL(18,6) TITLE 'COLUMN 9' NOT NULL )
PRIMARY INDEX ( first_column ,fourth_column )
PARTITION BY RANGE_N(first_column BETWEEN DATE '1999-01-01' AND DATE '2050-12-31' EACH INTERVAL '1' DAY );
CREATE INDEX test_index (first_column, fourth_column) ON test_table;Untuk membuat tabel di AnalyticDB for PostgreSQL, jalankan pernyataan berikut:
CREATE TABLE test_table
(
first_column DATE NOT NULL,
second_column INTEGER NOT NULL ,
third_column CHAR(6) NOT NULL ,
fourth_column CHAR(20) NOT NULL,
fifth_column CHAR(1) NOT NULL,
sixth_column CHAR(24) NOT NULL,
seventh_column VARCHAR(18) NOT NULL,
eighth_column DECIMAL(18,0) NOT NULL ,
nineth_column DECIMAL(18,6) NOT NULL )
DISTRIBUTED BY ( first_column ,fourth_column )
PARTITION BY RANGE(first_column)
(START (DATE '1999-01-01') INCLUSIVE
END (DATE '2050-12-31') INCLUSIVE
EVERY (INTERVAL '1 DAY' ) );
create index test_index on test_table(first_column, fourth_column);Berdasarkan contoh-contoh di atas, kesamaan dan perbedaan antara pernyataan pembuatan tabel di AnalyticDB for PostgreSQL dan Teradata adalah sebagai berikut:
- Tipe data inti kompatibel satu sama lain dan tidak memerlukan modifikasi.
- Kedua-duanya, AnalyticDB for PostgreSQL dan Teradata mendukung kolom distribusi, tetapi sintaksisnya berbeda. Klausul PRIMARY INDEX digunakan di Teradata, sedangkan DISTRIBUTED BY digunakan di AnalyticDB for PostgreSQL.
- Kedua-duanya, AnalyticDB for PostgreSQL dan Teradata mendukung klausa PARTITION BY. Klausul tersebut memiliki semantik yang sama tetapi sintaksis yang berbeda di AnalyticDB for PostgreSQL dan Teradata.
- Kedua-duanya, AnalyticDB for PostgreSQL dan Teradata memungkinkan Anda membuat indeks pada tabel, tetapi sintaksis yang digunakan berbeda.
- AnalyticDB for PostgreSQL tidak mendukung kata kunci TITLE, tetapi memungkinkan Anda menambahkan komentar pada kolom tertentu dengan menjalankan pernyataan berikut:
COMMENT ON COLUMN table_name.column_name IS 'XXX';. - AnalyticDB for PostgreSQL tidak dapat mendeklarasikan jenis pengkodean saat Anda mendefinisikan tipe data CHAR atau VARCHAR. Anda dapat menggunakan pernyataan
SET client_encoding = latin1;untuk mendeklarasikan jenis pengkodean.
Format data impor dan ekspor
- Teradata menggunakan pemisah dua karakter.
- AnalyticDB for PostgreSQL menggunakan pemisah satu karakter.
Pernyataan SQL
AnalyticDB for PostgreSQL kompatibel dengan sintaksis sebagian besar pernyataan SQL di Teradata. Anda hanya perlu memodifikasi sintaksis berikut:
- CAST
Di Teradata:
cast(XXX as int format '999999') cast(XXX as date format 'YYYYMMDD')Di AnalyticDB for PostgreSQL:
cast(XXX as int) cast(XXX as date)AnalyticDB for PostgreSQL tidak mendeklarasikan format dalam pernyataan CAST.
- Untuk pernyataan
cast(XXX as int format '999999'), Anda harus menulis fungsi untuk penggantian. - Anda tidak perlu memodifikasi pernyataan
cast(XXX as date format 'YYYYMMDD')karena AnalyticDB for PostgreSQL mendukung format'YYYY-MM-DD'untuk tanggal.
- Untuk pernyataan
- QUALIFY
Kata kunci QUALIFY di Teradata digunakan untuk menyaring lebih lanjut hasil fungsi pengurutan berdasarkan kondisi yang ditentukan pengguna.
Contoh:
SELECT itemid, sumprice, RANK() OVER (ORDER BY sumprice DESC) FROM (SELECT a1.item_id, SUM(a1.sale) FROM sales AS a1 GROUP BY a1.itemID) AS t1 (itemid, sumprice) QUALIFY RANK() OVER (ORDER BY sum_price DESC) <=100;AnalyticDB for PostgreSQL tidak mendukung kata kunci QUALIFY. Anda harus mengubah pernyataan SQL dengan kata kunci ini menjadi subquery bersarang.
SELECT itemid, sumprice, rank from (SELECT itemid, sumprice, RANK() OVER (ORDER BY sumprice DESC) as rank FROM (SELECT a1.item_id, SUM(a1.sale) FROM sales AS a1 GROUP BY a1.itemID) AS t1 (itemid,sumprice) ) AS a where rank <=100; - MACRO
Teradata menggunakan MACRO untuk menjalankan sekelompok pernyataan SQL. Contoh:
CREATE MACRO Get_Emp_Salary(EmployeeNo INTEGER) AS ( SELECT EmployeeNo, NetPay FROM Salary WHERE EmployeeNo = :EmployeeNo; );AnalyticDB for PostgreSQL tidak mendukung makro, tetapi Anda dapat menggunakan pernyataan FUNCTION untuk mengimplementasikan fungsi MACRO dari Teradata. Contoh:
CREATE OR REPLACE FUNCTION Get_Emp_Salary( EmployeeNo INTEGER, OUT EmployeeNo INTEGER, OUT NetPay FLOAT ) returns setof record AS $$ SELECT EmployeeNo,NetPay FROM Salary WHERE EmployeeNo = $1 $$ LANGUAGE SQL;
Pemetaan fungsi
| Fungsi Teradata | Fungsi AnalyticDB for PostgreSQL | Deskripsi |
| ZEROIFNULL | COALESCE | Menangani nilai null dengan mengubahnya menjadi nol untuk data kumulatif. |
| NULLIFZERO | COALESCE | Mengganti nilai 0 dengan NULL untuk data kumulatif. |
| INDEX | POSITION | Mengembalikan posisi (bilangan bulat) substring dalam string. |
| ADD_MONTHS | TO_DATE | Menambahkan atau mengurangi jumlah bulan tertentu ke atau dari tanggal input. |
| FORMAT | TO_CHAR/TO_DATE | Menentukan format data. |
| CSUM | Subquery | Mengembalikan jumlah kumulatif dari ekspresi nilai untuk setiap baris dalam partisi. |
| MAVG | Subquery | Menghitung rata-rata bergerak dari kolom tertentu berdasarkan sejumlah baris yang ditentukan, juga dikenal sebagai lebar kueri. |
| MSUM | Subquery | Menghitung jumlah bergerak dari kolom tertentu berdasarkan lebar kueri yang ditentukan. |
| MDIFF | Subquery | Menghitung selisih bergerak dari kolom tertentu berdasarkan lebar kueri yang ditentukan. |
| QUALIFY | Subquery | Menyaring hasil fungsi pengurutan berdasarkan kondisi yang ditentukan pengguna. |
| CHAR/CHARACTERS | LENGTH | Menentukan jumlah karakter. |