All Products
Search
Document Center

ApsaraDB RDS:Baca dan tulis data MySQL (mysql_fdw)

Last Updated:Jun 21, 2026

RDS PostgreSQL menyertakan plugin mysql_fdw yang memungkinkan Anda membaca dan menulis data di instans RDS MySQL atau database MySQL yang dikelola sendiri.

Prasyarat

  • Instans Anda harus menggunakan RDS PostgreSQL versi 10 atau lebih baru dan menggunakan cloud disk.

    Catatan
    • Untuk RDS PostgreSQL 14, versi mesin minor harus 20221030 atau lebih baru.

    • Untuk RDS PostgreSQL 17, versi mesin minor harus 20241030 atau lebih baru.

    Untuk melihat dan melakukan upgrade versi mesin minor, lihat Upgrade the minor engine version.

  • Tambahkan Blok CIDR VPC dari instans RDS PostgreSQL Anda (misalnya, 172.xx.xx.xx/16) ke daftar putih instans MySQL.

    Catatan

    Pada halaman Database Connection instans RDS PostgreSQL Anda, temukan Blok CIDR VPC (misalnya, 172.xx.xx.xx/16) di samping Network Type, lalu catat Internal Port (misalnya, 5432).

Informasi latar belakang

PostgreSQL telah mendukung komputasi paralel sejak versi 9.6, dan performanya meningkat secara signifikan pada versi 11 sehingga kueri join pada miliaran baris data dapat diselesaikan dalam hitungan detik. Akibatnya, banyak pengguna memanfaatkan PostgreSQL sebagai gudang data kecil yang juga mendukung akses konkurensi tinggi.

Anda dapat menggunakan plugin mysql_fdw untuk menghubungkan PostgreSQL ke MySQL dan menyinkronkan data dari MySQL guna dianalisis.

Prosedur

  1. Buat plugin mysql_fdw.

    postgres=> create extension mysql_fdw;  
    CREATE EXTENSION  
    Catatan

    Hanya akun istimewa yang dapat menjalankan perintah ini.

  2. Buat definisi server MySQL.

    postgres=> CREATE SERVER <server_name>  
    postgres->      FOREIGN DATA WRAPPER mysql_fdw
    postgres->      OPTIONS (host '<endpoint>', port '<port>');  
    CREATE SERVER  
    Catatan

    Dalam definisi server, atur parameter host ke titik akhir internal instans MySQL dan parameter port ke port internalnya.

    Contoh

    postgres=> CREATE SERVER mysql_server  
    postgres->      FOREIGN DATA WRAPPER mysql_fdw
    postgres->      OPTIONS (host 'rm-xxx.mysql.rds.aliyuncs.com', port '3306');  
    CREATE SERVER  
  3. Buat pemetaan pengguna untuk menghubungkan definisi server ke pengguna PostgreSQL yang akan mengakses database MySQL.

    postgres=> CREATE USER MAPPING FOR <postgresql_username>   
    SERVER <server_name>  
    OPTIONS (username '<mysql_username>', password '<password_of_mysql_user>');  
    CREATE USER MAPPING  

    Contoh

    postgres=> CREATE USER MAPPING FOR pgtest 
    SERVER mysql_server  
    OPTIONS (username 'mysqltest', password 'Test1234!');  
    CREATE USER MAPPING  
  4. Gunakan pengguna PostgreSQL dari langkah sebelumnya untuk membuat tabel eksternal untuk tabel MySQL.

    Catatan

    Nama kolom dalam tabel eksternal harus sesuai dengan nama kolom yang bersesuaian di tabel MySQL. Anda hanya perlu mendefinisikan kolom yang ingin dikueri. Misalnya, jika tabel MySQL berisi tiga kolom (ID, NAME, dan AGE), Anda dapat membuat tabel eksternal hanya dengan kolom ID dan NAME.

    postgres=> CREATE FOREIGN TABLE <table_name> (<column_name> <data_type>,<column_name> <data_type>...) server <server_name> options (dbname '<mysql_database_name>', table_name '<mysql_table_name>');  
    CREATE FOREIGN TABLE  

    Contoh

    postgres=> CREATE FOREIGN TABLE ft_test (id1 int, name1 text) server mysql_server options (dbname 'test123', table_name 'test');  
    CREATE FOREIGN TABLE  

Uji operasi baca dan tulis

Anda dapat membaca dan menulis data MySQL menggunakan tabel eksternal.

Catatan

Tabel MySQL harus memiliki primary key agar operasi tulis berhasil. Jika tidak, operasi akan gagal dengan error berikut:

ERROR:  first column of remote table must be unique for INSERT/UPDATE/DELETE operation.
postgres=> select * from ft_test ;  
postgres=> insert into ft_test values (2,'abc');  
INSERT 0 1  
postgres=> insert into ft_test select generate_series(3,100),'abc';  
INSERT 0 98  
postgres=> select count(*) from ft_test ;  
 count   
-------  
    99  
(1 row)  

Periksa rencana eksekusi untuk melihat bagaimana kueri pada tabel eksternal diteruskan ke MySQL untuk dieksekusi.

postgres=> explain verbose select count(*) from ft_test ;  
                                  QUERY PLAN                                     
-------------------------------------------------------------------------------  
 Aggregate  (cost=1027.50..1027.51 rows=1 width=8)  
   Output: count(*)  
   ->  Foreign Scan on public.ft_test  (cost=25.00..1025.00 rows=1000 width=0)  
         Output: id, info  
         Remote server startup cost: 25  
         Remote query: SELECT NULL FROM `test123`.`test`  
(6 rows)  
postgres=> explain verbose select id from ft_test where id=2;  
                               QUERY PLAN                                  
-------------------------------------------------------------------------  
 Foreign Scan on public.ft_test  (cost=25.00..1025.00 rows=1000 width=4)  
   Output: id  
   Remote server startup cost: 25  
   Remote query: SELECT `id` FROM `test123`.`test` WHERE ((`id` = 2))  
(4 rows)