技術ブログ
本記事では、CData Sync を用いて、PostgreSQLからMySQLへのニアリアルタイム データ連携(論理レプリケーション)を構成する手順についてご説明します。
なお、弊社コーソルはCData パートナーであり、CData Syncの販売および導入、運用やトライアルの支援が可能です。
CData Syncは、非常に多くのデータベース製品、SaaS、アプリケーション、APIに対応したデータ連携ツールです。
以下の特徴を持ちます。
以下の記事でご紹介しているため、こちらをご覧ください。
CDCにロジカルデコーディング/レプリケーションスロットを使用するため、このための設定を行います。
[実行例]
$ sudo dnf install postgresql16-contrib
Last metadata expiration check: 1:27:16 ago on Thu 06 Mar 2025 07:02:57 PM JST.
Dependencies resolved.
====================================================================================================================================
Package Architecture Version Repository Size
====================================================================================================================================
Installing:
postgresql16-contrib x86_64 16.8-1PGDG.rhel8 pgdg16 768 k
Upgrading:
postgresql16 x86_64 16.8-1PGDG.rhel8 pgdg16 1.9 M
postgresql16-libs x86_64 16.8-1PGDG.rhel8 pgdg16 329 k
postgresql16-server x86_64 16.8-1PGDG.rhel8 pgdg16 6.7 M
Transaction Summary
====================================================================================================================================
Install 1 Package
Upgrade 3 Packages
Total download size: 9.7 M
Is this ok [y/N]: y
(略)
Upgraded:
postgresql16-16.8-1PGDG.rhel8.x86_64 postgresql16-libs-16.8-1PGDG.rhel8.x86_64 postgresql16-server-16.8-1PGDG.rhel8.x86_64
Installed:
postgresql16-contrib-16.8-1PGDG.rhel8.x86_64
Complete!
$
[実行例]
$ psql
psql (16.8)
Type "help" for help.
postgres=# SELECT name, setting FROM pg_settings WHERE name='wal_level';
name | setting
-----------+---------
wal_level | replica
(1 row)
postgres=# ALTER SYSTEM SET wal_level = 'logical';
ALTER SYSTEM
postgres=# SELECT name, setting FROM pg_settings WHERE name='wal_level';
name | setting
-----------+---------
wal_level | replica
(1 row)
[実行例]
postgres=# CREATE DATABASE db1;
CREATE DATABASE
[実行例]
$ /usr/pgsql-16/bin/pg_ctl stop
waiting for server to shut down.... done
server stopped
$ /usr/pgsql-16/bin/pg_ctl start
waiting for server to start....2025-03-06 22:20:34.030 JST [3520] LOG: redirecting log output to logging collector process
2025-03-06 22:20:34.030 JST [3520] HINT: Future log output will appear in directory "log".
done
server started
[実行例]
$ psql -U postgres -h localhost -d db1
Password for user postgres:
psql (16.8)
Type "help" for help.
db1=# SELECT slot_name, plugin, slot_type, database, active, restart_lsn, confirmed_flush_lsn FROM pg_replication_slots;
slot_name | plugin | slot_type | database | active | restart_lsn | confirmed_flush_lsn
-----------+--------+-----------+----------+--------+-------------+---------------------
(0 rows)
db1=# SELECT * FROM pg_create_logical_replication_slot('cdatasync_replication_slot', 'test_decoding');
slot_name | lsn
----------------------------+-----------
cdatasync_replication_slot | 0/8000148
(1 row)
db1=# SELECT slot_name, plugin, slot_type, database, active, restart_lsn, confirmed_flush_lsn FROM pg_replication_slots;
slot_name | plugin | slot_type | database | active | restart_lsn | confirmed_flush_lsn
----------------------------+---------------+-----------+----------+--------+-------------+---------------------
cdatasync_replication_slot | test_decoding | logical | db1 | f | 0/8000110 | 0/8000148
(1 row)
db1=# exit
ソースデータベース側で、連携対象のデータを準備します。 ここでは、ユーザーu2を作成し、ユーザーu2が所有するテーブルとしてデータベース db1にt2を作成し、テーブルt2にデータをINSERTしています。
$ psql -U postgres -h localhost -d db1
Password for user postgres:
psql (16.8)
Type "help" for help.
db1=# CREATE USER u2 PASSWORD 'Pass123-';
CREATE ROLE
db1=# GRANT ALL PRIVILEGES ON DATABASE db1 TO u2;
GRANT
db1=# CREATE SCHEMA u2 AUTHORIZATION u2;
CREATE SCHEMA
db1=# exit
$ psql -U u2 -d db1 -h localhost
Password for user u2:
psql (16.8)
Type "help" for help.
db1=> CREATE TABLE t2 (n integer primary key, s varchar(16));
CREATE TABLE
db1=> INSERT INTO t2 VALUES(1, 'AAA');
INSERT 0 1
db1=> INSERT INTO t2 VALUES(2, 'BBB');
INSERT 0 1
db1=> INSERT INTO t2 VALUES(3, 'CCC');
INSERT 0 1
db1=>
db1=> SELECT * FROM t2;
n | s
---+-----
1 | AAA
2 | BBB
3 | CCC
(3 rows)
ここでは、ユーザーpostgresで接続し、データベースに対する変更をキャプチャすることにしています。
ターゲットデータベース側で、データの連携先となるデータベースとユーザーを準備します。 ここでは、データベースdb1およびユーザーu1を作成しています。以下の手順に従います。
CData Syncの管理コンソールで、ターゲットMySQLへの接続「tgt_my」を構成します。以下の手順に従います。
CData Syncの管理コンソールで、でジョブ(レプリケーションジョブ)とタスクを作成します。
作成したジョブを実行します。
初回実行であるため、ターゲットMySQLに対してテーブルが作成され、ソースPostgreSQLのデータが連携されます(レプリケーションされます)。
# mysql -D db1 -u u1 -pPass123-
mysql: [Warning] Using a password on the command line interface can be insecure.
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 14
Server version: 8.0.37 MySQL Community Server - GPL
Copyright (c) 2000, 2024, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> select * from t2;
+---+------+----------------------------------------+
| n | s | _cdatasync_deleted |
+---+------+----------------------------------------+
| 1 | AAA | 0x00 |
| 2 | BBB | 0x00 |
| 3 | CCC | 0x00 |
+---+------+----------------------------------------+
3 rows in set (0.00 sec)
なお、_cdatasync_deleted列は、ソースデータベースにおけるデータの削除状況を示すフラグのような役割をする列です。
ソースPostgreSQLにデータを追加してから、ジョブを実行します。 ジョブの実行手順は初回実行と同じです。 2回目の実行であるため、前回のジョブ実行からの差分だけがデータ連携(レプリケーション)されます。
ソースPostgreSQLにデータを追加
db1=> INSERT INTO t2 VALUES(4, 'DDD');
INSERT 0 1
db1=> INSERT INTO t2 VALUES(5, 'EEE');
INSERT 0 1
db1=>
db1=> SELECT * FROM t2;
n | s
---+-----
1 | AAA
2 | BBB
3 | CCC
4 | DDD
5 | EEE
(5 rows)
ジョブ実行後、ターゲットMySQLでデータを確認
mysql> select * from t2;
+---+------+----------------------------------------+
| n | s | _cdatasync_deleted |
+---+------+----------------------------------------+
| 1 | AAA | 0x00 |
| 2 | BBB | 0x00 |
| 3 | CCC | 0x00 |
| 4 | DDD | 0x00 |
| 5 | EEE | 0x00 |
+---+------+----------------------------------------+
5 rows in set (0.00 sec)
スケジュールを設定して、ジョブ実行を自動化することも可能です。
弊社コーソルはCData パートナーであり、CData Syncの製品販売を行います。加えて、コーソルが得意とするデータベース技術領域を含めたCData Syncの導入、技術支援、サポートを行います。
CData Syncを用いたデータ連携をご検討されている場合は、ぜひコーソルへご相談いただければとと思います。
データベースのレプリケーションにおいては、データベース製品およびレプリケーション製品の両方の知識が必要です。このような知識を持つエンジニアの確保は一般に困難です。弊社のサービスがこの問題のお役に立てると考えております。
また、弊社からCData Syncを見積/購入いただくと、以下のサービスを無償でご提供いたします。
コーソルからデータベース関連製品をご購入いただくと、ORACLE MASTER Platinum 単年取得者数7年連続No.1、2016年6月以降 累計保持者数No.1という指標に裏付けされた高い技術力により、安心して製品を導入/利用いただけます。
ORACLE MASTER Platinumとは、2日間にわたる実技試験により認定されるOracle Database最高難度の資格です。 グローバルで有効な資格であり、海外では"Oracle Certified Master"と呼ばれます。
Oracle Databaseについても製品販売、製品サポート、製品の導入を行います。また、リモート回線経由でスポット的なDBA実務を行うリモートDBAサービス、コンサルティングやベンダコントロールを含めたOracle Databaseプロフェッショナルサービスを時間制で提供する時間制コンサルサービスも提供しています。
基幹系DB運用支援および製品サポートについては、3拠点体制による24時間365日対応が可能です。
コーソルは、Oracle Databaseをはじめとするデータベース製品に関する深い知識を活かし、多数のデータベース関連製品を取り扱っております。
これらの製品について、販売・導入・運用を様々な形でご支援します。お困りの際はぜひ弊社にお声がけくださいませ。