Cách sử dụng Alibaba DataX để di chuyển dữ liệu từ MySQL sang PostgreSQL - bắn cá máy xèng online

| Apr 12, 2025 min read

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, movieactor_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