如何使用pgLoader将MySQL数据库迁移到PostgreSQL

来自菜鸟教程
跳转至:导航、​搜索

介绍

PostgreSQL,也称为“Postgres”,是一个开源的关系数据库管理系统(RDBMS)。 近年来,它的受欢迎程度 急剧增长 ,许多开发人员和公司将他们的数据从其他数据库解决方案迁移到 Postgres。

迁移数据库的前景可能令人生畏,尤其是从一个数据库管理系统迁移到另一个数据库管理系统时。 pgLoader 是一个开源的数据库迁移工具,旨在简化迁移到 PostgreSQL 的过程。 它支持从多种文件类型和 RBDMS(包括 MySQLSQLite)迁移到 PostgreSQL。

本教程提供有关如何安装 pgLoader 并使用它通过 SSL 连接将远程 MySQL 数据库迁移到 PostgreSQL 的说明。 在本教程接近尾声时,我们还将简要介绍一些 pgLoader 可能有用的不同迁移场景。

先决条件

要完成本教程,您需要以下内容:

  • 访问 两个 服务器,每个服务器运行 Ubuntu 18.04。 两台服务器都应该有防火墙和配置了 sudo 权限的非 root 用户。 要设置这些,您可以按照我们的 Ubuntu 18.04 的初始服务器设置指南进行操作。
  • MySQL 安装在 之一的服务器 上。 要进行此设置,请按照我们关于 如何在 Ubuntu 18.04 上安装 MySQL 的指南的 步骤 1、2 和 3。 请注意,为了完成此处链接的所有必备教程,您需要配置您的 root MySQL 用户以使用密码进行身份验证,如 MySQL 安装的 Step 3 中所述指导。
  • PostgreSQL 安装在 另一台服务器 上。 要进行此设置,请完成我们的指南 如何在 Ubuntu 18.04 上安装和使用 PostgreSQL 的 步骤 1
  • 您的 MySQL 服务器 也应该配置为接受加密连接。 要进行此设置,请完成我们关于 如何在 Ubuntu 18.04 上为 MySQL 配置 SSL/TLS 的教程的每个步骤,包括可选的 步骤 6。 当您按照本指南进行操作时,请务必使用 PostgreSQL 服务器 作为 MySQL 客户端机器,因为您需要能够从 Postgres 机器连接到 MySQL 服务器才能使用 pgLoader 迁移数据.

请注意,在本指南中,您安装 MySQL 的服务器将被称为“MySQL 服务器”,并且应该在这台机器上运行的任何命令都将以蓝色背景显示,如下所示:


同样,本指南将另一台服务器称为“PostgreSQL”或“Postgres”服务器,并且必须在该机器上运行的任何命令都将以红色背景显示:


请在遵循本教程时牢记这些,以避免任何混淆。

第 1 步 - (可选)在 MySQL 中创建示例数据库和表

此步骤描述了创建测试数据库并使用虚拟数据填充它的过程。 我们鼓励您在这个测试用例中练习使用 pgLoader,但是如果您已经有一个要迁移的数据库,您可以继续 下一步

首先在您的 MySQL 服务器上打开 MySQL 提示符:

mysql -u root -p

输入您的 root MySQL 用户密码后,您将看到 MySQL 提示。

从那里,通过运行以下命令创建一个新数据库。 您可以随意命名数据库,但在本指南中,我们将其命名为 source_db

CREATE DATABASE source_db;

然后使用 USE 命令切换到这个数据库:

USE source_db;
OutputDatabase changed

在此数据库中,使用以下命令创建示例表。 在这里,我们将这个表命名为 sample_table,但可以随意给它取另一个名字:

CREATE TABLE sample_table (
   employee_id INT PRIMARY KEY,
   first_name VARCHAR(50),
   last_name VARCHAR(50),
   start_date DATE,
   salary VARCHAR(50)
);

然后使用以下命令使用一些示例员工数据填充此表:

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');

在此之后,您可以关闭 MySQL 提示符:

exit

现在您已经有了一个加载了虚拟数据的示例数据库,您可以继续下一步,在您的 PostgreSQL 服务器上安装 pgLoader。

第 2 步 — 安装 pgLoader

pgLoader 是一个可以从各种不同来源将数据加载到 PostgreSQL 数据库中的程序。 它使用 PostgreSQL 的 COPY 命令 将数据从源数据库或文件(例如 逗号分隔值 (CSV) 文件)复制到目标 PostgreSQL 数据库中。

pgLoader 可从默认的 Ubuntu APT 存储库中获得,您可以使用 apt 命令安装它。 但是,在本指南中,我们将利用 pgLoader 的 useSSL 选项,该功能允许通过 SSL 连接从 MySQL 迁移。 此功能仅在 3.5.1 和更新的 pgLoader 版本中可用,但在撰写本文时,从默认的 Ubuntu 存储库安装它将安装版本 3.4.1。 因此,本指南将概述如何使用项目 GitHub 存储库中的源代码安装最新版本的 pgLoader。

在安装 pgLoader 之前,您需要安装它的依赖项。 如果您最近没有这样做,请更新 您的 Postgres 服务器的 包索引:

sudo apt update

然后安装以下软件包:

  • sbcl:一个 Common Lisp 编译器
  • unzip.zip 文件的解压缩器
  • libsqlite3-dev:SQLite 3 的开发文件集合
  • gawk:“GNU awk”的缩写,一种模式扫描和处理语言
  • curl:用于从 URL 传输数据的命令行工具
  • make:用于管理包编译的实用程序
  • freetds-dev:MS SQL 和 Sybase 数据库的客户端库
  • libzip-dev:用于读取、创建和修改 zip 档案的库

使用以下命令安装这些依赖项:

sudo apt install sbcl unzip libsqlite3-dev gawk curl make freetds-dev libzip-dev

出现提示时,按 ENTER 确认您要安装这些软件包。

接下来,导航到 pgLoader GitHub 项目的 发布页面 并找到最新版本。 对于本指南,我们将使用撰写本文时的最新版本:version 3.6.2。 向下滚动到其 Assets 菜单并复制标记为 Source codetar.gz 文件的链接。 然后将链接粘贴到以下 curl 命令中,替换突出显示的 URL:

curl -fsSLO https://github.com/dimitri/pgloader/archive/v3.6.2.tar.gz

cURL 是一个命令行工具,可用于许多用于传输数据的操作系统。 它读取存储在传递给它的 URL 中的任何数据,并将内容打印到系统的输出。

这个 curl 命令包括 O 选项,它将文件内容输出到与源文件同名的本地文件 - v3.6.2.tar.gz - 而不是服务器的标准输出. 请注意,此命令还包括选项 -fsSL,它们一起基本上告诉 cURL 静默失败。 这意味着如果由于某种原因 cURL 无法联系 GitHub,它不会将生成的错误代码输出到本地文件。

下载 curl 后,使用以下命令解压缩 tarball:

tar xvf v3.6.2.tar.gz

这将在您的服务器上创建许多新目录和文件。 导航到新的 pgLoader 父目录:

cd pgloader-3.6.2/

然后使用 make 实用程序编译 pgloader 二进制文件:

make pgloader

此命令可能需要几分钟来构建 pgloader 二进制文件。

完成后,将二进制文件移动到 /usr/local/bin 目录,即 Ubuntu 查找可执行文件的位置:

sudo mv ./build/bin/pgloader /usr/local/bin/

您可以通过检查其版本来测试 pgLoader 是否已正确安装,如下所示:

pgloader --version
Outputpgloader version "3.6.2"
compiled with SBCL 1.4.5.debian

pgLoader 现在已安装,但在开始迁移之前,您需要对 PostgreSQL 和 MySQL 实例进行一些配置更改。 我们将首先关注 PostgreSQL 服务器。

第 3 步 — 创建 PostgreSQL 角色和数据库

pgloader 命令通过从文件或直接从数据库复制源数据并将其插入 PostgreSQL 数据库来工作。 因此,您必须以有权访问 Postgres 数据库的 Linux 用户身份运行 pgLoader,或者您必须在加载命令中指定具有适当权限的 PostgreSQL 角色。

PostgreSQL 通过使用 roles 来管理数据库访问。 根据角色的配置方式,可以将其视为数据库用户或一组数据库用户。 在大多数 RDBMS 中,您使用 CREATE USER SQL 命令创建用户。 然而,Postgres 安装了一个名为 createuser 的便捷脚本。 此脚本用作 CREATE USER SQL 命令的包装器,您可以直接从命令行运行该命令。

注意: 在 PostgreSQL 中,默认使用 Identification Protocolident 身份验证方法作为数据库用户进行身份验证,而不是使用密码。 这涉及 PostgreSQL 获取客户端的 Ubuntu 用户名并将其用作允许的 Postgres 数据库用户名。 这在许多情况下允许更高的安全性,但在您希望外部程序连接到您的数据库之一的情况下,它也可能导致问题。

pgLoader 可以通过使用 ident 方法进行身份验证的角色将数据加载到 Postgres 数据库中,只要该角色与发出 pgloader 命令的 Linux 用户配置文件具有相同的名称。 但是,为了使这个过程尽可能清晰,本教程描述了设置一个不同的 PostgreSQL 角色,该角色使用密码而不是使用 ident 方法进行身份验证。


在 Postgres 服务器上运行以下命令以创建新角色。 注意 -P 标志,它告诉 createuser 提示您输入新角色的密码:

sudo -u postgres createuser --interactive -P

系统可能会首先提示您输入 sudo 密码。 然后脚本将提示您输入新角色的名称。 在本指南中,我们将此角色称为 pgloader_pg

OutputEnter name of role to add: pgloader_pg

之后,createuser 将提示您输入并确认此角色的密码。 请务必记下此密码,因为在第 5 步中执行迁移时需要它:

OutputEnter password for new role: 
Enter it again: 

最后,脚本会询问您是否应将新角色归类为超级用户。 在 PostgreSQL 中,使用超级用户角色连接到数据库允许您绕过数据库的所有权限检查,登录权限除外。 因此,不应轻易使用超级用户权限,并且 PostgreSQL 文档建议 您将大部分数据库工作作为非超级用户角色。 但是,由于 pgLoader 需要广泛的权限来访问和加载数据到表中,您可以安全地授予这个新角色超级用户权限。 通过键入 y 然后按 ENTER 来执行此操作:

Output. . .
Shall the new role be a superuser? (y/n) y

PostgreSQL 附带另一个有用的脚本,允许您从命令行创建数据库。 由于 pgLoader 还需要一个可以加载源数据的目标数据库,请运行以下命令来创建一个。 我们将此数据库命名为 new_db,但如果您愿意,可以随意修改:

sudo -u postgres createdb new_db

如果没有任何错误,则此命令将完成且没有任何输出。

既然您有一个专用的 PostgreSQL 用户和一个可以将 MySQL 数据加载到其中的空数据库,那么在执行迁移之前您还需要进行一些更改。 您需要创建一个可以访问您的源数据库的专用 MySQL 用户,并将您的客户端证书添加到 Ubuntu 的受信任证书存储中。

第 4 步 — 在 MySQL 中创建专用用户并管理证书

保护数据免受窥探者的侵害是任何数据库管理员工作中最重要的部分之一。 将数据从一台机器迁移到另一台机器为恶意行为者提供了 嗅探 未经加密的通过网络连接传输的数据包的机会。 在这一步中,您将创建一个专用的 MySQL 用户,pgLoader 将使用该用户通过 SSL 连接执行迁移。

首先打开你的 MySQL 提示符:

mysql -u root -p

在 MySQL 提示符下,使用以下 CREATE USER 命令创建一个新的 MySQL 用户。 我们将这个用户命名为 pgloader_my。 因为这个用户只会从你的 PostgreSQL 服务器访问 MySQL,所以一定要把 your_postgres_server_ip 替换为你的 PostgreSQL 服务器的公共 IP 地址。 此外,将 password 替换为安全密码或密码:

CREATE USER 'pgloader_my'@'your_postgres_server_ip' IDENTIFIED BY 'password' REQUIRE SSL;

请注意此命令末尾的 REQUIRE SSL 子句。 这将限制 pgloader_my 用户只能通过安全 SSL 连接访问数据库。

接下来,授予 pgloader_my 用户对目标数据库及其所有表的访问权限。 在这里,我们将指定我们在可选步骤 1 中创建的数据库,但如果您有自己的数据库想要迁移,请使用其名称代替 source_db

GRANT ALL ON source_db.* TO 'pgloader_my'@'your_postgresql_server_ip';

然后运行 FLUSH PRIVILEGES 命令重新加载授权表,启用权限更改:

FLUSH PRIVILEGES;

在此之后,您可以关闭 MySQL 提示符:

exit

现在回到您的 Postgres 服务器并尝试以新的 pgloader_my 用户身份登录 MySQL 服务器。 如果您遵循了 为 MySQL 配置 SSL/TLS 的先决条件指南,那么您将已经在您的 PostgreSQL 服务器上安装了 mysql-client,并且您应该能够使用以下命令进行连接:

mysql -u pgloader_my -p -h your_mysql_server_ip

如果命令成功,您将看到 MySQL 提示:


确认您的 pgloader_my 用户可以成功连接后,继续并关闭提示:

exit

此时,您有一个专用的 MySQL 用户,可以从您的 Postgres 机器访问源数据库。 但是,如果您尝试使用 SSL 迁移 MySQL 数据库,则尝试将失败。

原因是 pgLoader 无法读取 MySQL 的配置文件,因此不知道在哪里查找您在先决条件 SSL/TLS 配置中复制到 PostgreSQL 服务器的 CA 证书或客户端证书指南。 但是,pgLoader 并没有忽略 SSL 要求,而是在需要 SSL 连接到 MySQL 的情况下需要使用受信任的证书。 因此,您可以通过将 ca.pemclient-cert.pem 文件添加到 Ubuntu 的受信任证书存储 来解决此问题。

为此,请将 ca.pemclient-cert.pem 文件复制到 /usr/local/share/ca-certificates/ 目录。 请注意,您还必须重命名这些文件,使它们具有 .crt 文件扩展名。 如果您不重命名它们,您的系统将无法识别您已添加这些新证书:

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

在此之后,运行 update-ca-certificates 命令。 该程序在 /usr/local/share/ca-certificates 中查找证书,将任何新证书添加到 /etc/ssl/certs/ 目录,并根据 ca-certificates.crt 的内容生成可信 SSL 证书列表X192X]目录:

sudo update-ca-certificates
OutputUpdating certificates in /etc/ssl/certs...
2 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.

这样,您就可以将 MySQL 数据库迁移到 PostgreSQL。

第 5 步 — 迁移数据

现在您已经配置了从 PostgreSQL 服务器到 MySQL 服务器的远程访问,您可以开始迁移了。

注意: 在采取任何可能影响数据完整性的操作之前备份数据库非常重要。 但是,当使用 pgLoader 执行迁移时,这不是必需的,因为它不会删除或转换数据; 它只复制它。

也就是说,如果您感到谨慎并希望在迁移之前备份您的数据,您可以使用 mysqldump 实用程序进行备份。 详见【X4X】官方MySQL文档【X40X】。


pgLoader 允许用户使用单个命令迁移整个数据库。 对于从 MySQL 数据库迁移到单独服务器上的 PostgreSQL 数据库,该命令将具有以下语法:

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

这包括 pgloader 命令和两个 连接字符串 ,第一个用于源数据库,第二个用于目标数据库。 这两个连接字符串都以声明连接字符串指向的 DBMS 类型开始,然后是可以访问数据库的用户名和密码(用冒号分隔)、安装数据库的服务器的主机地址、 pgLoader 应该定位的数据库的名称,以及影响 pgLoader 行为的 各种选项

使用本教程前面定义的参数,您可以使用具有以下结构的命令迁移 MySQL 数据库。 请务必替换任何突出显示的值以与您自己的设置保持一致:

pgloader mysql://pgloader_my:mysql_password@mysql_server_ip/source_db?useSSL=true postgresql://pgloader_pg:postgresql_password@localhost/new_db

请注意,此命令在 MySQL 连接字符串中包含 useSSL 选项。 通过将此选项设置为 true,pgLoader 将通过 SSL 连接到 MySQL。 这是必要的,因为您已将 MySQL 服务器配置为仅接受安全连接。

如果此命令成功,您将看到一个描述迁移过程的输出表:

Output. . .
             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

要检查数据是否正确迁移,请打开 PostgreSQL 提示符:

sudo -i -u postgres psql

从那里,连接到您加载数据的数据库:

\c new_db

然后运行以下查询来测试迁移的数据是否存储在您的 PostgreSQL 数据库中:

SELECT * FROM source_db.sample_table;

注意: 注意此查询中的 FROM 子句指定 source_db schema 中的 sample_table

. . . FROM source_db.sample_table;

这称为 限定名称 。 您可以进一步指定 完全限定名称 通过包括数据库的名称以及模式和表的名称:

. . . FROM new_db.source_db.sample_table;

当您在 PostgreSQL 数据库中运行查询时,如果表保存在默认的 public 模式中,则不需要这样做。 您必须在此处这样做的原因是,当 pgLoader 将数据加载到 Postgres 时,它会创建并定位一个以原始数据库命名的新模式——在本例中为 source_db。 这是 pgLoader 对于 MySQL 到 PostgreSQL 迁移的默认行为。 但是,一旦完成加载数据,您可以使用加载文件指示 pgLoader 将表的架构更改为 public。 有关如何执行此操作的示例,请参见下一步。


如果确实正确加载了数据,您将在查询的输出中看到下表:

Output 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)

要关闭 Postgres 提示符,请运行以下命令:

\q

现在我们已经讨论了如何通过网络迁移 MySQL 数据库并将其加载到 PostgreSQL 数据库中,我们将讨论其他一些 pgLoader 可能有用的常见迁移场景。

第 6 步 — 探索其他迁移选项

pgLoader 是一个高度灵活的工具,可以在各种情况下使用。 在这里,我们将快速了解一些其他可以使用 pgLoader 将 MySQL 数据库迁移到 PostgreSQL 的方法。

使用 pgLoader 加载文件进行迁移

在 pgLoader 的上下文中, 加载文件命令文件 是告诉 pgLoader 如何执行迁移的文件。 该文件可以包含影响 pgLoader 行为的命令和选项,让您可以更好地控制数据如何加载到 PostgreSQL 中,并允许您执行复杂的迁移。

pgLoader 的文档 提供了有关如何使用和扩展这些文件以支持多种迁移类型的全面说明,因此在这里我们将通过一个相对基本的示例进行操作。 我们将执行在第 5 步中运行的相同迁移,但还将包含一个 ALTER SCHEMA 命令以将 new_db 数据库的架构从 source_db 更改为 public

首先,使用您喜欢的文本编辑器在 Postgres 服务器上创建一个新的加载文件:

nano pgload_test.load

然后添加以下内容,确保更新突出显示的值以与您自己的配置保持一致:

pgload_test.load

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'
;

以下是每个子句的作用:

  • LOAD DATABASE:此行指示 pgLoader 从单独的数据库加载数据,而不是文件或数据存档。
  • FROM:此子句指定源数据库。 在这种情况下,它指向我们在 Step 1 中创建的 MySQL 数据库的连接字符串。
  • INTO:同样,此行指定 pgLoader 应将数据加载到的 PostgreSQL 数据库。
  • WITH:此子句允许您为 pgLoader 定义特定的行为。 您可以在此处 找到与 MySQL 迁移 兼容的 WITH 选项的完整列表。 在此示例中,我们仅包含两个选项: include drop:使用此选项时,pgLoader 将删除目标 PostgreSQL 数据库中也出现在源 MySQL 数据库中的所有表。 如果在将数据迁移到现有 PostgreSQL 数据库时使用此选项,则应备份整个数据库以避免丢失任何数据。 create tables:这个选项告诉 pgLoader 根据 MySQL 数据库中保存的元数据在目标 PostgreSQL 数据库中创建新表。 如果使用相反的选项 create no tables,则目标表必须在迁移之前已存在于目标 Postgres 数据库中。
  • ALTER SCHEMA:在 WITH 子句之后,您可以像这样添加特定的 SQL 命令来指示 pgLoader 执行其他操作。 在这里,我们指示 pgLoader 将新 Postgres 数据库的模式从 source_db 更改为 public,但前提是它创建了模式。 请注意,您还可以将此类命令嵌套在其他子句中 - 例如 BEFORE LOAD DO - 以指示 pgLoader 在迁移过程中的特定点执行这些命令。

这是您可以在加载文件中包含哪些内容以修改 pgLoader 行为的演示示例。 可以添加到加载文件的子句的完整列表以及它们的作用可以在 官方 pgLoader 文档 中找到。

添加完此内容后,保存并关闭加载文件。 要使用它,请将文件名作为参数包含在 pgloader 命令中:

pgloader pgload_test.load

要测试迁移是否成功,请打开 Postgres 提示符:

sudo -u postgres psql

然后连接数据库:

\c new_db

并运行以下查询:

SELECT * FROM sample_table;
Output 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)

此输出确认 pgLoader 成功迁移数据,并且我们添加到加载文件的 ALTER SCHEMA 命令按预期工作,因为我们不需要在查询中指定 source_db 模式查看数据。

请注意,如果您计划使用加载文件将保存在一个数据库中的数据迁移到位于另一台计算机上的另一个数据库,您仍需要调整任何相关的网络和防火墙规则以使迁移成功。

将 MySQL 数据库本地迁移到 PostgreSQL

您可以使用 pgLoader 将 MySQL 数据库迁移到同一台机器上的 PostgreSQL 数据库。 您只需要从具有 root MySQL 用户访问权限的 Linux 用户配置文件运行迁移命令:

pgloader mysql://root@localhost/source_db pgsql://sammy:postgresql_password@localhost/target_db

像这样执行本地迁移意味着您不必对 MySQL 的默认网络配置或系统的防火墙规则进行任何更改。

从 CSV 文件迁移

您还可以使用 CSV 文件中的数据加载 PostgreSQL 数据库。

假设您有一个名为 load.csv 的 CSV 数据文件,将其加载到 Postgres 数据库的命令可能如下所示:

pgloader load.csv pgsql://sammy:password@localhost/target_db

由于 CSV 格式未完全标准化,因此在以这种方式直接从 CSV 文件加载数据时,您可能会遇到问题。 幸运的是,您可以通过在 pgLoader 的命令行选项 中包含各种选项或在加载文件中指定它们来纠正不规则性。 有关更多详细信息,请参阅有关该主题的 pgLoader 文档

迁移到托管 PostgreSQL 数据库

还可以执行从自我管理数据库到托管 PostgreSQL 数据库的迁移。 为了说明这种迁移的外观,我们将使用 MySQL 服务器和 DigitalOcean 托管的 PostgreSQL 数据库。 我们还将使用我们在 步骤 1 中创建的示例数据库,但如果您跳过该步骤并拥有自己想要迁移的数据库,则可以指向该数据库。

注意:有关如何设置DigitalOcean托管数据库的说明,请参阅我们的托管数据库快速入门指南。


对于此迁移,我们不需要 pgLoader 的 useSSL 选项,因为它仅适用于远程 MySQL 数据库,我们将从本地 MySQL 数据库运行此迁移。 但是,当我们加载并连接到 DigitalOcean 托管 PostgreSQL 数据库时,我们将使用 sslmode=require 选项,这将确保您的数据受到保护。

因为这次我们没有使用 useSSL,您可以使用 apt 连同 postgresql-client 软件包一起安装 pgLoader,这将允许您访问托管 PostgreSQL 数据库从您的 MySQL 服务器:

sudo apt install pgloader postgresql-client

之后,您可以运行 pgloader 命令来迁移数据库。 为此,您需要托管数据库的连接字符串。

对于 DigitalOcean 托管数据库,您可以从云控制面板复制连接字符串。 首先,单击左侧边栏菜单中的Databases,然后选择要将数据迁移到的数据库。 然后向下滚动到 Connection Details 部分。 单击下拉菜单并选择连接字符串。 然后,单击 Copy 按钮将字符串复制到剪贴板并将其粘贴到以下迁移命令中,替换此处显示的示例 PostgreSQL 连接字符串。 这会将您的 MySQL 数据库作为 doadmin PostgreSQL 角色迁移到 defaultdb PostgreSQL 数据库:

pgloader mysql://root:password@localhost/source_db postgres://doadmin:password@db_host/defaultdb?sslmode=require

在此之后,您可以使用相同的连接字符串作为 psql 的参数来连接到托管 PostgreSQL 数据库并确认迁移成功:

psql postgres://doadmin:password@db_host/defaultdb?sslmode=require

然后,运行以下查询以检查 pgLoader 是否正确迁移了数据:

SELECT * FROM source_db.sample_table;
Output 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)

这确认 pgLoader 已成功将您的 MySQL 数据库迁移到您的托管 PostgreSQL 实例。

结论

pgLoader 是一个灵活的工具,可以在单个命令中执行数据库迁移。 通过一些配置调整,它可以使用安全的 SSL/TLS 连接将整个数据库从一台物理机迁移到另一台物理机。 我们希望通过学习本教程,您将对 pgLoader 的功能和潜在用例有更清晰的了解。

将数据迁移到 PostgreSQL 后,您可能会发现以下教程很有趣: