Cách di chuyển database MySQL sang PostgreSQL bằng pgLoader
PostgreSQL , còn gọi là “Postgres,” là một hệ quản trị database quan hệ open-souce (RDBMS). Nó đã chứng kiến sự tăng trưởng mạnh mẽ về mức độ phổ biến trong những năm gần đây, với nhiều nhà phát triển và công ty chuyển dữ liệu của họ sang Postgres từ các giải pháp database khác.Triển vọng di chuyển database có thể đáng sợ, đặc biệt là khi di chuyển từ hệ thống quản lý database này sang hệ thống quản lý database khác. pgLoader là một công cụ di chuyển database open-souce nhằm mục đích đơn giản hóa quá trình di chuyển sang PostgreSQL. Nó hỗ trợ di chuyển từ một số loại file và RBDMS - bao gồm MySQL và SQLite - sang PostgreSQL.
Hướng dẫn này cung cấp hướng dẫn về cách cài đặt pgLoader và sử dụng nó để di chuyển database MySQL từ xa sang PostgreSQL qua kết nối SSL. Ở gần cuối hướng dẫn, ta cũng sẽ đề cập ngắn gọn đến một số trường hợp di chuyển khác nhau mà pgLoader có thể hữu ích.
Yêu cầu
Để hoàn thành hướng dẫn này, bạn cần những thứ sau:
- Truy cập vào hai server , mỗi server chạy Ubuntu 18.04. Cả hai server phải có firewall và user không phải root có quyền sudo được cấu hình . Để cài đặt những điều này, bạn có thể làm theo hướng dẫn Cài đặt Server Ban đầu của ta cho Ubuntu 18.04 .
- MySQL được cài đặt trên một trong các server . Để cài đặt điều này, hãy làm theo các Bước 1, 2 và 3 trong hướng dẫn của ta về Cách cài đặt MySQL trên Ubuntu 18.04 . Xin lưu ý để hoàn thành tất cả các hướng dẫn yêu cầu được liên kết ở đây, bạn cần phải cấu hình user MySQL gốc của bạn để xác thực bằng password , như được mô tả trong Bước 3 của hướng dẫn cài đặt MySQL.
- PostgreSQL được cài đặt trên server khác . Để cài đặt điều này, hãy hoàn thành Bước 1 của hướng dẫn Cách cài đặt và sử dụng PostgreSQL trên Ubuntu 18.04 .
- Server MySQL của bạn cũng phải được cấu hình để chấp nhận các kết nối được mã hóa. Để cài đặt điều này, hãy hoàn thành mọi bước trong hướng dẫn của ta về Cách cấu hình SSL / TLS cho MySQL trên Ubuntu 18.04 , bao gồm cả Bước 6 tùy chọn. Khi bạn làm theo hướng dẫn này, hãy đảm bảo sử dụng server PostgreSQL của bạn làm client MySQL, vì bạn cần có thể kết nối với server MySQL từ máy Postgres của bạn để di chuyển dữ liệu bằng pgLoader.
Xin lưu ý trong suốt hướng dẫn này, server mà bạn đã cài đặt MySQL sẽ được gọi là “ server MySQL ” và bất kỳ lệnh nào sẽ được chạy trên máy này sẽ được hiển thị với nền màu xanh lam, như sau:
Tương tự, hướng dẫn này sẽ tham chiếu đến server khác là server “ PostgreSQL ” hoặc “ Postgres” và bất kỳ lệnh nào phải chạy trên máy đó sẽ được hiển thị với nền màu đỏ:
Hãy ghi nhớ những điều này khi bạn làm theo hướng dẫn này để tránh bất kỳ sự nhầm lẫn nào.
Bước 1 - (Tùy chọn) Tạo database mẫu và bảng trong MySQL
Bước này mô tả quá trình tạo database thử nghiệm và đưa nó vào dữ liệu giả. Ta khuyến khích bạn thực hành sử dụng pgLoader với trường hợp thử nghiệm này, nhưng nếu bạn đã có database muốn di chuyển, bạn có thể chuyển sang bước tiếp theo .
Bắt đầu bằng cách mở dấu nhắc MySQL trên server MySQL của bạn:
- mysql -u root -p
Sau khi nhập password user MySQL gốc của bạn, bạn sẽ thấy dấu nhắc MySQL.
Từ đó, tạo một database  mới bằng cách chạy lệnh sau. Bạn có thể đặt tên database   của bạn   bạn muốn , nhưng trong hướng dẫn này,  ta  sẽ đặt tên nó là source_db :
- CREATE DATABASE source_db;
Sau đó chuyển sang database  này bằng lệnh USE :
- USE source_db;
Database changed
Trong database  này, sử dụng lệnh sau để tạo bảng mẫu. Ở đây,  ta  sẽ đặt tên cho bảng này là sample_table nhưng hãy đặt tên khác cho nó:
- CREATE TABLE sample_table (
- employee_id INT PRIMARY KEY,
- first_name VARCHAR(50),
- last_name VARCHAR(50),
- start_date DATE,
- salary VARCHAR(50)
- );
Sau đó điền vào bảng này một số dữ liệu mẫu về nhân viên bằng lệnh sau:
- INSERT INTO sample_table (employee_id, first_name, last_name, start_date, salary)
- VALUES (1, 'Elizabeth', 'Cotten', '2007-11-11', '$105433.18'),
- (2, 'Yanka', 'Dyagileva', '2017-10-30', '$107540.67'),
- (3, 'Lee', 'Dorsey', '2013-06-04', '$118024.04'),
- (4, 'Kasey', 'Chambers', '2010-08-18', '$116456.98'),
- (5, 'Bram', 'Tchaikovsky', '2018-09-16', '$61989.50');
Sau đây, bạn có thể đóng dấu nhắc MySQL:
- exit
Đến đây bạn đã có một database mẫu được tải với dữ liệu giả, bạn có thể chuyển sang bước tiếp theo, trong đó bạn sẽ cài đặt pgLoader trên server PostgreSQL của bạn .
Bước 2 - Cài đặt pgLoader
pgLoader là một chương trình có thể tải dữ liệu vào database  PostgreSQL từ nhiều nguồn khác nhau. Nó sử dụng lệnh COPY của PostgreSQL để sao chép dữ liệu từ database  nguồn hoặc file  - chẳng hạn như tệp giá trị được phân tách bằng dấu phẩy (CSV) - vào database  PostgreSQL đích.
pgLoader có sẵn từ các repository  Ubuntu APT mặc định và bạn có thể cài đặt nó bằng apt . Tuy nhiên, trong hướng dẫn này,  ta  sẽ tận dụng tùy chọn useSSL của useSSL , một tính năng cho phép di chuyển từ MySQL qua kết nối SSL. Tính năng này chỉ có sẵn trong version  pgLoader mới nhất. Tính năng này chỉ có thể được cài đặt bằng cách sử dụng mã nguồn từ repository  GitHub của nó.
Trước khi cài đặt pgLoader, bạn cần cài đặt các phụ thuộc của nó. Nếu gần đây bạn chưa làm như vậy, hãy cập nhật index gói của server Postgres của bạn :
- sudo apt update
Sau đó cài đặt các gói sau:
- sbcl: Một trình biên dịch Lisp chung
- unzip: Một trình- unzipcho các- .zip
- libsqlite3-dev: Tập hợp các file phát triển cho SQLite 3
- gawk: Viết tắt của “GNU awk”, một ngôn ngữ xử lý và quét mẫu
- curl: Một công cụ dòng lệnh để truyền dữ liệu từ một URL
- make: Một tiện ích để quản lý việc biên dịch gói
- freetds-dev: Một thư viện client cho database MS SQL và Sybase
- libzip-dev: Một thư viện để đọc, tạo và sửa đổi các repository zip
Sử dụng lệnh sau để cài đặt các phần phụ thuộc này:
- sudo apt install sbcl unzip libsqlite3-dev gawk curl make freetds-dev libzip-dev
Khi  được yêu cầu , hãy  xác nhận  bạn muốn cài đặt các gói này bằng cách nhấn ENTER .
Tiếp theo,  chuyển  đến trang Bản phát hành của dự án pgLoader GitHub và tìm bản phát hành mới nhất. Đối với hướng dẫn này,  ta  sẽ sử dụng version  mới nhất tại thời điểm viết bài này: phiên bản 3.6.1 . Cuộn xuống menu Nội dung và sao chép liên kết cho file  tar.gz có nhãn Mã nguồn . Sau đó, dán liên kết vào lệnh wget sau. Thao tác này sẽ tải tarball xuống  server  của bạn:
- wget https://github.com/dimitri/pgloader/archive/v3.6.1.tar.gz
Extract tarball:
- tar xvf v3.6.1.tar.gz
Thao tác này sẽ tạo một số folder và file mới trên server của bạn. Điều hướng vào folder mẹ pgLoader mới:
- cd pgloader-3.6.1/
Sau đó,  sử dụng trình  make để biên dịch pgloader binary  pgloader :
- make pgloader
Lệnh này sẽ mất một khoảng thời gian để tạo pgloader binary  pgloader .
Di chuyển file  binary  vào folder  /usr/local/bin , vị trí mà Ubuntu tìm kiếm các file  thực thi:
- sudo mv ./build/bin/pgloader /usr/local/bin/
Bạn có thể kiểm tra xem pgLoader đã được cài đặt đúng cách hay chưa bằng cách kiểm tra version của nó, như sau:
- pgloader --version
pgloader version "3.6.1"
compiled with SBCL 1.4.5.debian
pgLoader hiện đã được cài đặt, nhưng trước khi có thể bắt đầu quá trình di chuyển, bạn cần thực hiện một số thay đổi cấu hình cho cả hai version PostgreSQL và MySQL của bạn . Trước tiên, ta sẽ tập trung vào server PostgreSQL.
Bước 3 - Tạo role và database PostgreSQL
Lệnh pgloader hoạt động bằng cách sao chép dữ liệu nguồn, từ file  hoặc trực tiếp từ database  và chèn nó vào database  PostgreSQL. Vì lý do này, bạn phải chạy pgLoader  với quyền  là  user  Linux có quyền truy cập vào database  Postgres của bạn hoặc bạn phải chỉ định một  role  PostgreSQL với các quyền thích hợp trong lệnh tải của bạn.
PostgreSQL quản lý quyền truy cập database  thông qua việc sử dụng các  role  . Tùy thuộc vào cách cấu hình  role , nó có thể được coi là một  user  database  hoặc một  group   user  database . Trong hầu hết các RDBMS, bạn tạo  user  bằng CREATE USER SQL. Tuy nhiên, Postgres được cài đặt với một script tiện dụng có tên là createuser . Tập lệnh này đóng  role  như một  shell  bọc cho CREATE USER SQL CREATE USER mà bạn có thể chạy trực tiếp từ dòng lệnh.
Lưu ý: Trong PostgreSQL, bạn xác thực như một người sử dụng database bằng cách sử dụng giao thức xác định , hoặc ident, phương pháp thẩm định theo mặc định, chứ không phải với một password . Điều này liên quan đến việc PostgreSQL lấy tên user Ubuntu của khách hàng và sử dụng nó làm tên user database Postgres được phép. Điều này cho phép bảo mật cao hơn trong nhiều trường hợp, nhưng nó cũng có thể gây ra sự cố trong trường hợp bạn muốn một chương trình bên ngoài kết nối với một trong các database của bạn.
pgLoader có thể tải dữ liệu vào database  Postgres thông qua một  role  xác thực với phương thức nhận dạng miễn là  role  đó có cùng tên với profile   user  Linux ban hành lệnh pgloader . Tuy nhiên, để giữ cho quá trình này rõ ràng nhất có thể, hướng dẫn này mô tả việc  cài đặt  một  role  PostgreSQL khác xác thực bằng password  chứ không phải bằng phương thức nhận dạng.
Chạy lệnh sau trên  server  Postgres của bạn để tạo một  role  mới. Lưu ý -P cờ, mà nói createuser để nhắc bạn nhập password  cho  role  mới:
- sudo -u postgres createuser --interactive -P
Trước tiên, bạn có thể  được yêu cầu  nhập password  sudo  của bạn . Sau đó, tập lệnh sẽ nhắc bạn nhập tên cho  role  mới. Trong hướng dẫn này,  ta  sẽ gọi  role  này là pgloader_pg :
Enter name of role to add: pgloader_pg
Sau đó, createuser sẽ nhắc bạn nhập và xác nhận password  cho  role  này. Hãy nhớ ghi lại password  này, vì bạn  cần  password  để thực hiện di chuyển trong Bước 5:
Enter password for new role: 
Enter it again: 
Cuối cùng, kịch bản sẽ hỏi bạn xem liệu  role  mới có nên  được gọi là  siêu  user  hay không. Trong PostgreSQL, kết nối với database  với  role  siêu  user  cho phép bạn phá vỡ tất cả các kiểm tra quyền của database , ngoại trừ quyền đăng nhập. Do đó,  quyền  siêu  user  không nên được sử dụng nhẹ nhàng và tài liệu PostgreSQL khuyên bạn hầu hết database  của bạn hoạt động như một  role  không phải  user  cấp cao. Tuy nhiên, vì pgLoader cần các  quyền  rộng rãi để truy cập và tải dữ liệu vào các bảng, bạn có thể an toàn cấp  quyền   user  siêu  user   role  mới này. Làm như vậy  bằng lệnh  y rồi nhấn ENTER :
. . .
Shall the new role be a superuser? (y/n) y
PostgreSQL đi kèm với một tập lệnh hữu ích khác cho phép bạn tạo database  từ dòng lệnh. Vì pgLoader cũng cần một database  đích mà nó có thể tải dữ liệu nguồn vào đó, hãy chạy lệnh sau để tạo một database .  Ta  sẽ đặt tên cho database  này là new_db nhưng hãy sửa đổi nếu bạn muốn:
- sudo -u postgres createdb new_db
Nếu không có bất kỳ lỗi nào, lệnh này sẽ hoàn thành mà không có bất kỳ kết quả nào.
Đến đây bạn có một user PostgreSQL chuyên dụng và một database trống để bạn có thể tải dữ liệu MySQL của bạn vào đó, bạn chỉ cần thực hiện một số thay đổi nữa trước khi thực hiện di chuyển. Bạn cần tạo một user MySQL chuyên dụng có quyền truy cập vào database nguồn của bạn và thêm các certificate phía client của bạn vào kho certificate tin cậy của Ubuntu.
Bước 4 - Tạo user chuyên dụng trong MySQL và quản lý certificate
Bảo vệ dữ liệu khỏi những kẻ rình mò là một trong những phần quan trọng nhất trong công việc của bất kỳ administrator database nào. Việc di chuyển dữ liệu từ máy này sang máy khác mở ra cơ hội cho những kẻ độc hại đánh hơi các gói truyền qua kết nối mạng nếu nó không được mã hóa. Trong bước này, bạn sẽ tạo một user MySQL chuyên dụng mà pgLoader sẽ sử dụng để thực hiện việc di chuyển qua kết nối SSL.
Bắt đầu bằng cách mở dấu nhắc MySQL của bạn:
- mysql -u root -p
Từ  dấu nhắc  MySQL, sử dụng CREATE USER sau để tạo  user  MySQL mới.  Ta  sẽ đặt tên cho  user  này là pgloader_my . Vì  user  này sẽ chỉ truy cập MySQL từ  server  PostgreSQL của bạn, hãy đảm bảo thay thế your_postgres_server_ip bằng địa chỉ IP công cộng của  server  PostgreSQL của bạn. Ngoài ra, thay thế password bằng password  hoặc  passphrase (password bảo vệ)   an toàn:
- CREATE USER 'pgloader_my'@'your_postgres_server_ip' IDENTIFIED BY 'password' REQUIRE SSL;
Lưu ý điều khoản REQUIRE SSL ở cuối lệnh này. Điều này sẽ hạn chế  user  pgloader_my chỉ truy cập database  thông qua kết nối SSL an toàn.
Tiếp theo, cấp cho  user  pgloader_my quyền truy cập vào database  đích và tất cả các bảng của nó. Ở đây,  ta  sẽ chỉ định database  mà  ta  đã tạo trong Bước 1 tùy chọn, nhưng nếu bạn có database  của riêng mình mà bạn muốn di chuyển, hãy sử dụng tên của nó thay cho source_db :
- GRANT ALL ON source_db.* TO 'pgloader_my'@'your_postgresql_server_ip';
Sau đó, chạy lệnh FLUSH PRIVILEGES để  reload  các    bảng-cấp quyền , cho phép các thay đổi  quyền :
- FLUSH PRIVILEGES;
Sau đó, bạn có thể đóng dấu nhắc MySQL:
- exit
Bây giờ quay lại terminal   server  Postgres của bạn và cố gắng đăng nhập vào  server  MySQL  với quyền  là  user  pgloader_my mới. Nếu bạn đã làm theo hướng dẫn tiên quyết về cách  cấu hình  SSL / TLS cho MySQL thì bạn đã cài đặt mysql-client trên  server  PostgreSQL  của bạn  và bạn có thể kết nối bằng lệnh sau:
- mysql -u pgloader_my -p -h your_mysql_server_ip
Nếu lệnh thành công, bạn sẽ thấy dấu nhắc MySQL:
Sau khi xác nhận user pgloader_my của bạn có thể kết nối thành công, hãy tiếp tục và đóng dấu nhắc :
- exit
Đến đây, bạn có một user MySQL chuyên dụng có thể truy cập database nguồn từ máy Postgres của bạn. Tuy nhiên, nếu bạn cố gắng di chuyển database MySQL của bạn bằng SSL thì nỗ lực sẽ không thành công.
Lý do cho điều này là pgLoader không thể đọc các file  cấu hình của MySQL và do đó không biết tìm certificate  CA hoặc certificate   ứng dụng client  mà bạn đã sao chép vào  server  PostgreSQL  của bạn  ở đâu trong hướng dẫn cấu hình SSL / TLS  yêu cầu . Tuy nhiên, thay vì bỏ qua các yêu cầu SSL, pgLoader yêu cầu sử dụng các certificate   tin cậy  trong các trường hợp cần SSL để kết nối với MySQL. Theo đó, bạn có thể giải quyết vấn đề này bằng cách thêm ca.pem và client-cert.pem vào kho lưu trữ certificate   tin cậy  của Ubuntu .
Để thực hiện việc này, hãy sao chép các ca.pem và client-cert.pem vào folder  /usr/local/share/ca-certificates/ .  Lưu ý  bạn cũng phải đổi tên các file  này để chúng có phần mở rộng là file  .crt . Nếu bạn không đổi tên chúng, hệ thống của bạn sẽ không thể nhận ra rằng bạn đã thêm các certificate  mới này:
- sudo cp ~/client-ssl/ca.pem /usr/local/share/ca-certificates/ca.pem.crt
- sudo cp ~/client-ssl/client-cert.pem /usr/local/share/ca-certificates/client-cert.pem.crt
Sau đó, chạy lệnh update-ca-certificates . Chương trình này tìm kiếm các certificate  trong /usr/local/share/ca-certificates , thêm bất kỳ /usr/local/share/ca-certificates mới nào vào folder  /etc/ssl/certs/ và tạo danh sách các certificate  SSL  tin cậy  - ca-certificates.crt - dựa trên nội dung của folder  /etc/ssl/certs/ :
- sudo update-ca-certificates
Updating certificates in /etc/ssl/certs...
2 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
Như vậy, bạn đã sẵn sàng di chuyển database MySQL của bạn sang PostgreSQL.
Bước 5 - Di chuyển dữ liệu
Đến đây bạn đã cấu hình quyền truy cập từ xa từ server PostgreSQL đến server MySQL của bạn , bạn đã sẵn sàng để bắt đầu di chuyển.
Lưu ý: Điều quan trọng là phải backup database của bạn trước khi thực hiện bất kỳ hành động nào có thể ảnh hưởng đến tính toàn vẹn của dữ liệu. Tuy nhiên, điều này không cần thiết khi thực hiện di chuyển với pgLoader, vì nó không xóa hoặc biến đổi dữ liệu; nó chỉ sao chép nó.
Điều đó nói rằng, nếu bạn cảm thấy thận trọng và muốn  backup  dữ liệu  của bạn  trước khi di chuyển nó, bạn có thể làm như vậy với tiện ích mysqldump . Xem tài liệu MySQL chính thức để biết chi tiết.
pgLoader cho phép user di chuyển toàn bộ database bằng một lệnh duy nhất. Để di chuyển từ database MySQL sang database PostgreSQL trên một server riêng biệt, lệnh sẽ có cú pháp sau:
- pgloader mysql://mysql_username:password@mysql_server_ip_/source_database_name?option_1=value&option_n=value postgresql://postgresql_role_name:password@postgresql_server_ip/target_database_name?option_1=value&option_n=value
Điều này bao gồm lệnh pgloader và hai chuỗi kết nối , chuỗi đầu tiên dành cho database  nguồn và chuỗi thứ hai dành cho database  đích. Cả hai chuỗi kết nối này đều bắt đầu bằng cách khai báo loại DBMS mà chuỗi kết nối trỏ tới, tiếp theo là tên  user  và password  có quyền truy cập vào database  (phân tách bằng dấu hai chấm), địa chỉ  server  của  server  nơi database  được cài đặt, tên của database  mà pgLoader nên  nhắm đến  và các tùy chọn khác nhau ảnh hưởng đến hành vi của pgLoader.
Sử dụng các tham số được định nghĩa đó trong hướng dẫn này, bạn có thể di chuyển database MySQL của bạn bằng lệnh có cấu trúc sau. Đảm bảo thay thế mọi giá trị được đánh dấu để phù hợp với cài đặt của bạn :
- pgloader mysql://pgloader_my:mysql_password@mysql_server_ip/source_db?useSSL=true postgresql://pgloader_pg:postgresql_password@localhost/new_db
 Lưu ý  lệnh này bao gồm tùy chọn useSSL trong chuỗi kết nối MySQL. Bằng cách đặt tùy chọn này thành true , pgLoader sẽ kết nối với MySQL qua SSL. Điều này là cần thiết, vì bạn đã  cấu hình   server  MySQL  của bạn  để chỉ chấp nhận các kết nối an toàn.
Nếu lệnh này thành công, bạn sẽ thấy một bảng kết quả mô tả quá trình di chuyển diễn ra như thế nào:
             table name     errors       rows      bytes      total time
-----------------------  ---------  ---------  ---------  --------------
        fetch meta data          0          2                     0.111s
         Create Schemas          0          0                     0.001s
       Create SQL Types          0          0                     0.005s
          Create tables          0          2                     0.017s
         Set Table OIDs          0          1                     0.010s
-----------------------  ---------  ---------  ---------  --------------
 source_db.sample_table          0          5     0.2 kB          0.048s
-----------------------  ---------  ---------  ---------  --------------
COPY Threads Completion          0          4                     0.052s
 Index Build Completion          0          1                     0.011s
         Create Indexes          0          1                     0.006s
        Reset Sequences          0          0                     0.014s
           Primary Keys          0          1                     0.001s
    Create Foreign Keys          0          0                     0.000s
        Create Triggers          0          0                     0.000s
       Install Comments          0          0                     0.000s
-----------------------  ---------  ---------  ---------  --------------
      Total import time          ✓          5     0.2 kB          0.084s
Để kiểm tra xem dữ liệu đã được di chuyển đúng cách hay chưa, hãy mở dấu nhắc PostgreSQL:
- sudo -i -u postgres psql
Từ đó, kết nối với database mà bạn đã tải dữ liệu vào đó:
- \c new_db
Sau đó, chạy truy vấn sau để kiểm tra xem dữ liệu đã di chuyển có được lưu trữ trong database PostgreSQL của bạn hay không:
- SELECT * FROM source_db.sample_table;
Lưu ý: Lưu ý mệnh đề FROM trong truy vấn này chỉ định sample_table được giữ trong lược đồ source_db :
- . . . FROM source_db.sample_table;
Đây được gọi là tên đủ điều kiện . Bạn có thể đi xa hơn và chỉ định tên đủ điều kiện bằng cách bao gồm tên database cũng như tên của schemas và bảng:
- . . . FROM new_db.source_db.sample_table;
Khi bạn chạy các truy vấn trong database  PostgreSQL, bạn không cần phải xác định cụ thể này nếu bảng được giữ trong schemas  public mặc định. Lý do bạn phải làm như vậy ở đây là khi pgLoader tải dữ liệu vào Postgres, nó sẽ tạo và  nhắm đến  một schemas  mới được đặt tên theo database  root  - trong trường hợp này là source_db . Đây là hành vi mặc định của pgLoader đối với việc di chuyển MySQL sang PostgreSQL. Tuy nhiên, bạn có thể sử dụng file  tải để hướng dẫn pgLoader thay đổi schemas  của bảng thành public sau khi tải xong dữ liệu. Xem bước tiếp theo để biết ví dụ về cách thực hiện việc này.
Nếu dữ liệu thực sự được tải đúng cách, bạn sẽ thấy bảng sau trong kết quả của truy vấn:
 employee_id | first_name |  last_name  | start_date |   salary   
-------------+------------+-------------+------------+------------
           1 | Elizabeth  | Cotten      | 2007-11-11 | $105433.18
           2 | Yanka      | Dyagileva   | 2017-10-30 | $107540.67
           3 | Lee        | Dorsey      | 2013-06-04 | $118024.04
           4 | Kasey      | Chambers    | 2010-08-18 | $116456.98
           5 | Bram       | Tchaikovsky | 2018-09-16 | $61989.50
(5 rows)
Để đóng dấu nhắc Postgres, hãy chạy lệnh sau:
- \q
Bây giờ ta đã xem qua cách di chuyển database MySQL qua mạng và tải nó vào database PostgreSQL, ta sẽ xem xét một số tình huống di chuyển phổ biến khác mà pgLoader có thể hữu ích.
Bước 6 - Khám phá các tùy chọn di chuyển khác
pgLoader là một công cụ có tính linh hoạt cao, có thể hữu ích trong nhiều trường hợp. Ở đây, ta sẽ xem xét nhanh một số cách khác mà bạn có thể sử dụng pgLoader để di chuyển database MySQL sang PostgreSQL.
Di chuyển bằng file tải pgLoader
Trong ngữ cảnh của pgLoader, một tệp tải hoặc tệp lệnh , là một file cho pgLoader biết cách thực hiện di chuyển. Tệp này có thể bao gồm các lệnh và tùy chọn ảnh hưởng đến hành vi của pgLoader, cho phép bạn kiểm soát tốt hơn nhiều cách dữ liệu được tải vào PostgreSQL và cho phép bạn thực hiện các quá trình di chuyển phức tạp.
Tài liệu của pgLoader cung cấp hướng dẫn toàn diện về cách sử dụng và mở rộng các file  này để hỗ trợ một số kiểu di chuyển, vì vậy ở đây  ta  sẽ làm việc thông qua một ví dụ tương đối thô sơ.  Ta  sẽ thực hiện quá trình di chuyển tương tự như  ta  đã chạy ở Bước 5, nhưng cũng sẽ bao gồm ALTER SCHEMA để thay đổi giản đồ của database  new_db từ source_db thành public .
Để bắt đầu, hãy tạo một file tải mới trên server Postgres bằng editor bạn muốn :
- nano pgload_test.load
Sau đó, thêm nội dung sau, đảm bảo cập nhật các giá trị được đánh dấu để phù hợp với cấu hình của bạn :
LOAD DATABASE
     FROM      mysql://pgloader_my:mysql_password@mysql_server_ip/source_db?useSSL=true
     INTO pgsql://pgloader_pg:postgresql_password@localhost/new_db
 WITH include drop, create tables
ALTER SCHEMA 'source_db' RENAME TO 'public'
;
Đây là những gì mỗi mệnh đề này làm:
- LOAD DATABASE: Dòng này hướng dẫn pgLoader tải dữ liệu từ một database riêng biệt, thay vì một file hoặc repository dữ liệu.
- FROM: Mệnh đề này chỉ định database nguồn. Trong trường hợp này, nó trỏ đến chuỗi kết nối cho database MySQL mà ta đã tạo ở Bước 1 .
- INTO: Tương tự như vậy, dòng này chỉ định database PostgreSQL mà pgLoader sẽ tải dữ liệu vào đó.
- WITH: Mệnh đề này cho phép bạn xác định các hành vi cụ thể cho pgLoader. Bạn có thể tìm thấy danh sách đầy đủ các tùy chọn- WITHtương thích với di chuyển MySQL tại đây . Trong ví dụ này, ta chỉ bao gồm hai tùy chọn:- include drop: Khi tùy chọn này được sử dụng, pgLoader sẽ thả bất kỳ bảng nào trong database PostgreSQL đích cũng xuất hiện trong database MySQL nguồn. Nếu bạn sử dụng tùy chọn này khi di chuyển dữ liệu sang database PostgreSQL hiện có, bạn nên backup toàn bộ database để tránh mất bất kỳ dữ liệu nào.
- create tables: Tùy chọn này yêu cầu pgLoader tạo các bảng mới trong database PostgreSQL đích dựa trên metadata có trong database MySQL. Nếu tùy chọn ngược lại,- create no tablesđược sử dụng, thì các bảng đích phải đã tồn tại trong database Postgres đích trước khi di chuyển.
 
- ALTER SCHEMA: Sau mệnh đề- WITH, bạn có thể thêm các lệnh SQL cụ thể như thế này để hướng dẫn pgLoader thực hiện các hành động bổ sung. Ở đây, ta hướng dẫn pgLoader thay đổi schemas của database Postgres mới từ- source_dbthành- public, nhưng chỉ sau khi nó đã tạo schemas . Lưu ý bạn cũng có thể lồng các lệnh như vậy trong các mệnh đề khác - chẳng hạn như- BEFORE LOAD DO- để hướng dẫn pgLoader thực hiện các lệnh đó tại các điểm cụ thể trong quá trình di chuyển.
Đây là một ví dụ minh họa về những gì bạn có thể đưa vào file tải để sửa đổi hành vi của pgLoader. Danh sách đầy đủ các mệnh đề mà người ta có thể thêm vào file tải và những gì chúng làm có thể tìm thấy trong tài liệu chính thức của pgLoader .
 Lưu file   tải sau khi bạn đã hoàn tất việc thêm nội dung này. Để sử dụng nó, hãy bao gồm tên của file  làm đối số cho lệnh pgloader :
- pgloader pgload_test.load
Để kiểm tra xem quá trình di chuyển có thành công hay không, hãy mở dấu nhắc Postgres:
- sudo -u postgres psql
Sau đó kết nối với database :
- \c new_db
Và chạy truy vấn sau:
- SELECT * FROM sample_table;
 employee_id | first_name |  last_name  | start_date |   salary   
-------------+------------+-------------+------------+------------
           1 | Elizabeth  | Cotten      | 2007-11-11 | $105433.18
           2 | Yanka      | Dyagileva   | 2017-10-30 | $107540.67
           3 | Lee        | Dorsey      | 2013-06-04 | $118024.04
           4 | Kasey      | Chambers    | 2010-08-18 | $116456.98
           5 | Bram       | Tchaikovsky | 2018-09-16 | $61989.50
(5 rows)
Đầu ra này  xác nhận  pgLoader đã di chuyển dữ liệu thành công và ALTER SCHEMA mà  ta  đã thêm vào file  tải hoạt động như mong đợi, vì  ta  không cần chỉ định giản đồ source_db trong truy vấn để xem dữ liệu.
Lưu ý nếu bạn định sử dụng file tải để di chuyển dữ liệu được lưu giữ trên database này sang database khác nằm trên một máy riêng biệt, bạn sẽ vẫn cần điều chỉnh mọi luật mạng và firewall có liên quan để quá trình di chuyển thành công.
Di chuyển database MySQL sang PostgreSQL local
Bạn có thể sử dụng pgLoader để di chuyển database MySQL sang database PostgreSQL được đặt trên cùng một máy. Tất cả những gì bạn cần là chạy lệnh di chuyển từ profile user Linux có quyền truy cập vào user MySQL gốc :
- pgloader mysql://root@localhost/source_db pgsql://sammy:postgresql_password@localhost/target_db
Thực hiện di chuyển local như vậy nghĩa là bạn không phải thực hiện bất kỳ thay đổi nào đối với cấu hình mạng mặc định của MySQL hoặc các luật firewall của hệ thống .
Di chuyển từ file CSV
Bạn cũng có thể tải database PostgreSQL với dữ liệu từ file CSV.
Giả sử bạn có file  CSV của dữ liệu có tên load.csv , lệnh tải file  đó vào database  Postgres có thể trông giống như sau:
- pgloader load.csv pgsql://sammy:password@localhost/target_db
Vì định dạng CSV không được chuẩn hóa hoàn toàn, nên có khả năng bạn sẽ gặp sự cố khi tải dữ liệu trực tiếp từ file CSV theo cách này. May mắn là bạn có thể sửa lỗi bất thường bằng cách bao gồm các tùy chọn khác nhau với các tùy chọn dòng lệnh của pgLoader hoặc bằng cách chỉ định chúng trong một file tải. Xem tài liệu pgLoader về chủ đề này để biết thêm chi tiết.
Di chuyển sang Database PostgreSQL được quản lý
Cũng có thể thực hiện di chuyển từ database tự quản lý sang database PostgreSQL được quản lý. Để minh họa kiểu di chuyển này có thể trông như thế nào, ta sẽ sử dụng server MySQL và Database PostgreSQL được quản lý DigitalOcean. Ta cũng sẽ sử dụng database mẫu mà ta đã tạo ở Bước 1 , nhưng nếu bạn đã bỏ qua bước đó và có database của riêng mình mà bạn muốn di chuyển, bạn có thể trỏ đến database đó để thay thế.
Lưu ý: Để biết hướng dẫn về cách  cài đặt  Dịch vụdatabase DigitalOcean, vui lòng tham khảo hướng dẫn Bắt đầu nhanh database  được quản lý của  ta .
Đối với việc di chuyển này,  ta  sẽ không cần tùy chọn useSSL của useSSL vì nó chỉ hoạt động với database  MySQL từ xa và  ta  sẽ chạy quá trình di chuyển này từ database  MySQL local . Tuy nhiên,  ta  sẽ sử dụng tùy chọn sslmode=require khi  ta  tải và kết nối với database  DigitalOcean Managed PostgreSQL, điều này sẽ đảm bảo  dữ liệu  luôn được bảo vệ.
Bởi vì  ta  không sử dụng useSSL lần này, bạn có thể sử dụng apt để cài đặt pgLoader cùng với gói postgresql-client , gói này sẽ cho phép bạn truy cập  Database  PostgreSQL được quản lý từ  server  MySQL của bạn:
- sudo apt install pgloader postgresql-client
Sau đó, bạn có thể chạy lệnh pgloader để di chuyển database . Để thực hiện việc này, bạn  cần  chuỗi kết nối cho Dịch vụdatabase.
Đối với Dịch vụdatabase DigitalOcean, bạn có thể sao chép chuỗi kết nối từ  Control panel   cloud . Đầu tiên, nhấp vào  Database  trong menu thanh bên bên trái và chọn database  mà bạn muốn di chuyển dữ liệu. Sau đó, cuộn xuống phần Chi tiết kết nối . Nhấp vào trình đơn thả xuống và chọn Chuỗi kết nối . Sau đó, nhấp vào nút Sao chép để sao chép chuỗi vào  clipboard  của bạn và paste vào  lệnh di chuyển sau, thay thế chuỗi kết nối PostgreSQL mẫu được hiển thị ở đây. Điều này sẽ di chuyển database  MySQL của bạn vào defaultdb database  PostgreSQL như doadmin PostgreSQL  role :
- pgloader mysql://root:password@localhost/source_db postgres://doadmin:password@db_host/defaultdb?sslmode=require
Sau đó, bạn có thể sử dụng cùng một chuỗi kết nối làm đối số cho psql để kết nối với database  PostgreSQL được quản lý và  xác nhận  quá trình di chuyển đã thành công:
- psql postgres://doadmin:password@db_host/defaultdb?sslmode=require
Sau đó, chạy truy vấn sau để kiểm tra xem pgLoader đã di chuyển dữ liệu một cách chính xác hay chưa:
- SELECT * FROM source_db.sample_table;
 employee_id | first_name |  last_name  | start_date |   salary   
-------------+------------+-------------+------------+------------
           1 | Elizabeth  | Cotten      | 2007-11-11 | $105433.18
           2 | Yanka      | Dyagileva   | 2017-10-30 | $107540.67
           3 | Lee        | Dorsey      | 2013-06-04 | $118024.04
           4 | Kasey      | Chambers    | 2010-08-18 | $116456.98
           5 | Bram       | Tchaikovsky | 2018-09-16 | $61989.50
(5 rows)
Điều này xác nhận pgLoader đã di chuyển thành công database MySQL của bạn sang version PostgreSQL được quản lý của bạn.
Kết luận
pgLoader là một công cụ linh hoạt có thể thực hiện di chuyển database trong một lệnh duy nhất. Với một vài chỉnh sửa cấu hình, nó có thể di chuyển toàn bộ database từ máy vật lý này sang máy vật lý khác bằng cách sử dụng kết nối SSL / TLS an toàn. Ta hy vọng rằng theo hướng dẫn này, bạn sẽ hiểu rõ hơn về các khả năng của pgLoader và các trường hợp sử dụng tiềm năng.
Sau khi di chuyển dữ liệu sang PostgreSQL, bạn có thể thấy các hướng dẫn sau đây đáng quan tâm:
- Giới thiệu về Truy vấn trong PostgreSQL
- Cách cài đặt và cấu hình pgAdmin 4 ở Chế độ server
- Cách kiểm tra database PostgreSQL với InSpec trên Ubuntu 18.04
Các tin liên quan
Cách cấu hình SSL / TLS cho MySQL trên Ubuntu 18.042019-05-17
Cách thiết lập WordPress với MySQL trên Kubernetes bằng Helm
2019-05-07
Cách cho phép truy cập từ xa vào MySQL
2019-03-07
Cách khắc phục sự cố lỗi socket trong MySQL
2019-03-07
Cách giải quyết sự cố trong MySQL
2019-03-07
Cách sửa chữa bảng bị hỏng trong MySQL
2019-03-07
Cách khắc phục sự cố truy vấn MySQL
2019-03-07
Giới thiệu về Truy vấn trong MySQL
2018-10-17
Cách cài đặt MySQL mới nhất trên Debian 9
2018-09-05
Cách đặt lại mật khẩu gốc MySQL hoặc MariaDB của bạn trên Ubuntu 18.04
2018-09-04
 

