Post

Dùng PostgreSQL để đọc dữ liệu MySQL

Dùng PostgreSQL để đọc dữ liệu MySQL

Mở đầu

Ở bài trước (Link) có giới thiệu cách để một database PostgreSQL có thể kết nối và lấy data của một database PostgreSQL khác. Trong bài này sẽ tiếp tục giới thiệu cách mà PostgreSQL kết nối và lấy dữ liệu của một database MySQL cũng bằng cách tạo ra các foreign table. Extension đó có tên là mysql_fdw

Lưu ý là extension này chưa được PostgreSQL Global Development Group (PGDG - là tổ chức đã tạo ra PostgreSQL) hỗ trợ chính thức, nên cần cẩn thận khi sử dụng

Bước 0: Setup môi các tool cần thiết

Bước 0.1: Setup database MySQL

1
podman run --name db_mysql -e MYSQL_ROOT_PASSWORD=password_value -p 3306:3306 -d mysql

Thông tin truy cập của MySQL:

  • Host: 127.0.0.1
  • Port: 3306
  • Username: root
  • Password: password_value
  • Database: mysql

Tạo trước một bảng trong database

1
2
3
4
5
create database sampledb;
CREATE TABLE sampledb.sample_table (
  text_column varchar(100) DEFAULT NULL,
  number_column int DEFAULT NULL
);

Insert dữ liệu mẫu

1
2
3
INSERT INTO sampledb.sample_table (text_column, number_column) VALUES('value1', 1);
INSERT INTO sampledb.sample_table (text_column, number_column) VALUES('value2', 2);
INSERT INTO sampledb.sample_table (text_column, number_column) VALUES('value3', 3);

Bước 0.2: Setup database PostgreSQL đã được cài đặt sẵn mysql_fdw

Ở bài viết này chỉ tập trung vào việc setup foreign table nên sẽ không đi vào chi tiết cách cài đặt mysql_fdw lên server PostgreSQL. Sẽ có một bài viết khác hướng dẫn cách cài đặt sau.

Đầu tiên clone repo github

1
2
git clone https://github.com/chumaky/docker-images.git
cd docker-images

Cách setup đã có hướng dẫn trong repo. Ở đây chỉ ghi lại

Build Image và Run

1
2
podman build -t postgres_mysql -f postgres_mysql.docker
podman run -d --name pg_fdw_test -p 5432:5432 -e POSTGRES_PASSWORD=postgres postgres_mysql

Thông tin truy cập của PostgreSQL:

  • Host: 127.0.0.1
  • Port: 5432
  • Username: postgres
  • Password: postgres
  • Database: postgres

Sau đó vào database bằng cách:

1
podman exec -it pg_fdw_test psql postgres postgres

Bước 1: Tạo extension

Các bước sau đây đều thực hiện trên database PostgreSQL

Lưu ý chỉ các user có role superuser mới thực hiện được

1
CREATE EXTENSION mysql_fdw;

Bước 2: Tạo server

1
2
3
CREATE SERVER mysql_server
	FOREIGN DATA WRAPPER mysql_fdw
	OPTIONS (host '127.0.0.1', port '3306');

Bước 3: Tạo user mapping

1
2
3
CREATE USER MAPPING FOR current_user
SERVER mysql_server
OPTIONS (username 'root', password 'password_value');

Chỉ user nào được tạo user mapping thì mới có thể lấy được data của foreign table. Nên cần thực hiện câu này với mỗi user cần lấy data

Bước 4: Tạo foreign table

1
2
3
4
5
6
7
CREATE FOREIGN TABLE foreign_sample_table -- có thể đặt lại thành tên bảng khác
( 
  text_column varchar(100) DEFAULT NULL,
  number_column int4 DEFAULT NULL
)
SERVER mysql_server
	OPTIONS (dbname 'sampledb', table_name 'sample_table');

Vậy là xong, chạy thử thôi

1
2
3
4
5
6
7
select * from foreign_sample_table

text_column|number_column|
-----------+-------------+
value1     |            1|
value2     |            2|
value3     |            3|

Kết luận

Tương tự với việc dùng postgres_fdw, các ưu điểm, khuyết điểm của việc dùng mysql_fdw này là:

Ưu điểm

  • Có thể được sử dụng như là một phương pháp stream data từ MySQL đến PostgreSQL theo thời gian thực
  • Không chiếm dung lượng ổ đĩa của PostgreSQL

Khuyết điểm

  • Không được hỗ trợ chính thức bởi PGDG, nên có khả năng xảy ra lỗi không mong muốn mà không được hỗ trợ nhanh chóng
  • Cách setup có phần phức tạp nếu không dùng Podman, Docker
  • Tốc độ truy vấn của foreign table sẽ chậm hơn physical table, thể hiện rất rõ khi cần JOIN nhiều bảng có hàng trăm nghìn dòng dữ liệu trở lên

Như vậy bài viết này đã trình bày việc dùng PostgreSQL để kết nối và đọc dữ liệu của MySQL. Hy vọng bài này có ích đến mọi người

This post is licensed under CC BY 4.0 by the author.