Ngày 06 tháng 5 năm iwin68.club phiên bản mới 2025 - Công nghệ thông tin
DataX là một công cụ mã nguồn mở do Alibaba phát triển, được viết bằng ngôn ngữ Java. Đây là một công cụ rất hữu ích dùng để di chuyển dữ liệu giữa các cơ sở dữ liệu quan hệ và cả giữa cơ sở dữ liệu quan hệ với không quan hệ. Việc sử dụng DataX rất đơn giản, chỉ cần cài đặt JDK, cấu hình file JSON là có thể bắt đầu mà không cần quan tâm quá nhiều đến chi tiết thực hiện. Hiệu suất của DataX cũng rất tốt, đáp ứng được yêu cầu di chuyển dữ liệu trong môi trường sản xuất.
Bài viết này sẽ hướng dẫn cách sử dụng DataX để di chuyển dữ liệu từ MySQL sang PostgreSQL qua ví dụ minh họa.
Trước khi bắt đầu, chúng ta sẽ liệt kê môi trường sử dụng trong bài viết:
Hệ điều hành: CentOS 7
Java: phiên bản 17
Python: phiên bản 3.6
1. Chuẩn bị dữ liệu
Trước cwin 667 khi bắt đầu di chuyển dữ liệu, chúng ta cần tạo bảng và chuẩn bị dữ liệu kiểm tra.
Câu lệnh tạo bảng và chèn dữ liệu trên MySQL như sau:
CREATE TABLE actor (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
nationality VARCHAR(100) NOT NULL,
year_of_birth INT NOT NULL
);
CREATE TABLE movie (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
released_at INT NOT NULL
);
CREATE TABLE actor_movie (
actor_id BIGINT NOT NULL,
movie_id BIGINT NOT NULL,
role VARCHAR(100) NOT NULL,
PRIMARY KEY (actor_id, movie_id)
);
INSERT INTO actor (name, nationality, year_of_birth)
VALUES ('Wu Jing', 'China', 1974), ('Lu Jingshan', 'China', 1985);
INSERT INTO movie (name, released_at)
VALUES ('Wolf Warrior II', 2017), ('Tai Chi Master', 1998),
('The Wandering Earth II', 2023), ('My People, My Hometown', 2020);
INSERT INTO actor_movie (actor_id, movie_id, role)
VALUES (1, 1, 'Leng Feng'), (1, 2, [Pk16vn Bet](/post/6578/) 'Yang Yudry'), (1, 3, 'Liu Peiqiang'),
(2, 1, 'Rachel'), (2, 4, 'Emma Meier');
Chúng ta đã tạo ba bảng trên MySQL: actor
, movie
và actor_movie
. Hai bảng đầu tiên đại diện cho các thực thể diễn viên và phim, còn bảng cuối cùng là bảng quan hệ giữa diễn viên và phim. Sau khi chèn dữ liệu vào ba bảng này, cơ sở dữ liệu nguồn đã sẵn sàng.
Đối với PostgreSQL, câu lệnh tạo bảng tương ứng như sau:
CREATE TABLE actor (
id BIGSERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
nationality VARCHAR(100) NOT NULL,
year_of_birth INTEGER NOT NULL
);
CREATE TABLE movie (
id BIGSERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
released_at INTEGER NOT NULL
);
CREATE TABLE actor_movie (
actor_id BIGINT NOT NULL,
movie_id BIGINT NOT NULL,
role VARCHAR(100) NOT NULL,
PRIMARY KEY (actor_id, movie_id)
);
Sau khi chạy các câu lệnh này trên cơ sở dữ liệu PostgreSQL, cơ sở dữ liệu đích cũng đã được chuẩn bị xong.
2. Cài đặt DataX
Khi dữ liệu kiểm tra đã sẵn sàng, chúng ta bắt đầu cài đặt DataX. Trên máy chủ CentOS, bạn cần tìm đường dẫn tải xuống DataX từ trang GitHub chính thức của DataX, sau đó sử dụng các lệnh Shell dưới đây để tải về và giải nén DataX vào vị trí mong muốn (ví dụ: /usr/local/datax
).
cd /usr/local
sudo wget [đường dẫn tải DataX]
sudo tar -zxvf datax.tar.gz
3. Sử dụng DataX
Sau khi cài đặt xong DataX, chúng ta có thể bắt đầu sử dụng. Dưới đây sẽ hướng dẫn thử nghiệm việc di chuyển một bảng duy nhất trước, sau đó mới xét đến tình huống di chuyển hàng loạt nhiều bảng.
3.1 Di chuyển dữ liệu của một bảng
DataX sử dụng file cấu hình dạng JSON. Bằng cách tham khảo tài liệu hướng dẫn của DataX, chúng ta tìm thấy cấu hình reader và writer tương ứng cho việc đọc từ MySQL và ghi vào PostgreSQL. Từ đó, chúng ta tạo một file cấu hình actor.json
để di chuyển chỉ bảng actor
.
{
"job": {
"setting": {
"speed": {
"channel": 3
},
"errorLimit": {
"record": 0,
"percentage": 0.02
}
},
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "root",
"password": "root",
"column": ["*"],
"connection": [
{
"table": ["actor"],
"jdbcUrl": ["jdbc:mysql://localhost:3306/test"]
}
]
}
},
"writer": {
"name": "postgresqlwriter",
"parameter": {
"username": "root",
"password": "root",
"column": ["*"],
"preSql": ["DELETE FROM actor"],
"connection": [
{
"jdbcUrl": "jdbc:postgresql://localhost:5432/test",
"table": ["actor"]
}
]
}
}
}
]
}
}
Trong file cấu hình actor.json
, chúng ta đã chỉ định số lượng channel, tỷ lệ lỗi cho phép (di chuyển sẽ dừng nếu số lỗi vượt quá tỷ lệ này), cũng như phần reader (đọc từ đâu) và writer (ghi vào đâu). Trong thực tế, để kiểm soát tốc độ di chuyển và tỷ lệ lỗi tốt hơn, bạn có thể tham khảo tài liệu của DataX để điều chỉnh các thông số.
Sau khi chuẩn bị xong file cấu hình, sử dụng lệnh Shell dưới đây để gọi DataX và tiến hành di chuyển bảng actor
:
sudo /usr/local/datax/bin/datax.py actor.json
Sau khi hoàn thành di chuyển, thống kê sẽ được in ra như sau:
2025-05-06 18:39:37.122 [job-0] INFO JobContainer -
Thời điểm bắt đầu nhiệm vụ : 2025-05-06 18:39:26
Thời điểm kết thúc nhiệm vụ : 2025-05-06 18:39:37
Tổng thời gian thực hiện nhiệm vụ : 11s
Tốc độ trung bình : 1B/s
Tốc độ ghi : 0rec/s
Tổng số bản ghi đã đọc : 2
Tổng số lỗi đọc/giết : 0
3.2 Di chuyển hàng loạt nhiều bảng
Việc di chuyển một bảng thường chỉ được dùng để kiểm tra. Trong môi trường sản xuất, chúng ta cần xem xét cách thực hiện di chuyển hàng loạt nhiều bảng.
Dưới đây là cách viết một script Shell để bọc DataX và hỗ trợ di chuyển hàng loạt nhiều bảng. Kết cấu thư mục như sau:
data-migration
├─ table_template.json
├─ tables.txt
└─ start.sh
Chúng ta trích xuất các biến từ file cấu hình actor.json
để thiết kế một template file chung cho việc di chuyển từng bảng, lưu trữ tên các bảng cần di chuyển trong file tables.txt
, và cuối cùng viết một file Shell start.sh
để đọc danh sách bảng, sao chép template file, thay thế giá trị bên trong và tiến hành di chuyển từng bảng theo thứ tự.
Nội dung file template table_template.json
như sau:
{
"job": {
"setting": {
"speed": {
"channel": 3
},
"errorLimit": {
"record": 0,
"percentage": 0.02
}
},
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "SOURCE_USERNAME",
"password": "SOURCE_PASSWORD",
"column": ["*"],
"connection": [
{
"table": ["TABLE_NAME"],
"jdbcUrl": ["SOURCE_URL"]
}
]
}
},
"writer": {
"name": "postgresqlwriter",
"parameter": {
"username": "TARGET_USERNAME",
"password": "TARGET_PASSWORD",
"column": ["*"],
"preSql": ["DELETE FROM TABLE_NAME"],
"connection": [
{
"jdbcUrl": "TARGET_URL",
"table": ["TABLE_NAME"]
}
]
}
}
}
]
}
}
File danh sách bảng tables.txt
chứa nội dung sau:
actor
movie
actor_movie
File khởi động start.sh
có nội dung như sau:
#!/bin/bash
export DATAX_HOME=/usr/local/datax
# Đọc các tham số
SOURCE_URL="$1"
SOURCE_USERNAME="$2"
SOURCE_PASSWORD="$3"
TARGET_URL="$4"
TARGET_USERNAME="$5"
TARGET_PASSWORD="$6"
# Tạo thư mục chứa file json
mkdir json
# Bắt đầu di chuyển
for table in `cat tables.txt`
do
echo "Di chuyển bảng: ${table}"
# File json
json_file=json/${table}.json
cp table_template.json ${json_file}
# Thay thế placeholder
sed -i "s#TABLE_NAME#${table}#g" ${json_file}
sed -i "s#SOURCE_URL#${SOURCE_URL}#g" ${json_file}
sed -i "s#SOURCE_USERNAME#${SOURCE_USERNAME}#g" ${json_file}
sed -i "s#SOURCE_PASSWORD#${SOURCE_PASSWORD}#g" ${json_file}
sed -i "s#TARGET_URL#${TARGET_URL}#g" ${json_file}
sed -i "s#TARGET_USERNAME#${TARGET_USERNAME}#g" ${json_file}
sed -i "s#TARGET_PASSWORD#${TARGET_PASSWORD}#g" ${json_file}
python ${DATAX_HOME}/bin/datax.py ${json_file}
done
Như vậy, bạn có thể gọi trực tiếp start.sh
với thông tin kết nối để di chuyển hàng loạt nhiều bảng như sau:
sudo sh start.sh \
"jdbc:mysql://localhost:3306/test" \
root \
root \
"jdbc:postgresql://localhost:5432/test" \
root \
root
4. Kết luận
Bài viết này đã giới thiệu cách sử dụng DataX để di chuyển dữ liệu từ MySQL sang PostgreSQL thông qua ví dụ thực tế. Mã nguồn đầy đủ của ví dụ này đã được đăng tải lên GitHub, mời các bạn theo dõi hoặc Fork.
[1] GitHub: Alibaba DataX