介绍
PostgreSQL也称为“Postgres”,是一种开源关系数据库管理系统 (RDBMS)。近年来,它的受欢迎程度急剧增长,许多开发人员和公司将他们的数据从其他数据库解决方案迁移到 Postgres。
迁移数据库的前景可能令人生畏,尤其是在从一个数据库管理系统迁移到另一个数据库管理系统时。pgLoader是一个开源的数据库迁移工具,旨在简化迁移到 PostgreSQL 的过程。它支持从多种文件类型和 RBDMS(包括MySQL和SQLite)迁移到 PostgreSQL。
本教程提供了有关如何安装 pgLoader 并使用它通过 SSL 连接将远程 MySQL 数据库迁移到 PostgreSQL 的说明。在本教程即将结束时,我们还将简要介绍一些 pgLoader 可能有用的不同迁移场景。
先决条件
要完成本教程,您需要具备以下条件:
- 访问两台服务器,每台服务器都运行 Ubuntu 18.04。两台服务器都应该有一个防火墙和一个配置了 sudo 权限的非 root 用户。要设置这些,您可以按照我们的 Ubuntu 18.04 初始服务器设置指南进行操作。
- MySQL 安装在其中一台服务器上。要进行设置,请按照我们关于如何在 Ubuntu 18.04 上安装 MySQL 的指南的步骤 1、2 和 3进行操作。请注意,为了完成此处链接的所有先决条件教程,您需要配置MySQL根用户以使用密码进行身份验证,如MySQL 安装指南的第 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
输入您的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 迁移。此功能仅在pgLoader 的3.5.1和更新版本中可用,但在撰写本文时,从默认 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 项目的Releases页面并找到最新版本。对于本指南,我们将使用撰写本文时的最新版本:3.6.2版。向下滚动到它的Assets菜单并复制tar.gz
标有Source code的文件的链接。然后将链接粘贴到以下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,或者必须在 load 命令中指定具有适当权限的 PostgreSQL 角色。
PostgreSQL 通过使用角色来管理数据库访问。根据角色的配置方式,可以将其视为数据库用户或一组数据库用户。在大多数 RDBMS 中,您使用CREATE USER
SQL 命令创建用户。但是,Postgres 附带了一个名为createuser
. 此脚本用作CREATE USER
SQL 命令的包装器,您可以直接从命令行运行该命令。
注意:在 PostgreSQL 中,默认情况下,您使用身份验证协议或ident 身份验证方法而不是密码来以数据库用户身份进行身份验证。这涉及 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,所以一定要替换成你的 PostgreSQL 服务器your_postgres_server_ip
的公网 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的先决条件指南,那么您将已经mysql-client
安装在 PostgreSQL 服务器上,您应该能够使用以下命令进行连接:
- mysql -u pgloader_my -p -h your_mysql_server_ip
如果命令成功,您将看到 MySQL 提示:
-
确认您的pgloader_my用户可以成功连接后,继续并关闭提示:
- exit
此时,您有一个专用的 MySQL 用户,可以从您的 Postgres 机器访问源数据库。但是,如果您尝试使用 SSL 迁移 MySQL 数据库,则尝试将失败。
这样做的原因是 pgLoader 无法读取 MySQL 的配置文件,因此不知道在哪里查找您在先决条件SSL/TLS 配置指南中复制到 PostgreSQL 服务器的 CA 证书或客户端证书。但是,在需要 SSL 连接到 MySQL 的情况下,pgLoader 并没有忽略 SSL 要求,而是要求使用受信任的证书。因此,您可以通过将ca.pem
和client-cert.pem
文件添加到Ubuntu 的受信任证书存储区来解决此问题。
为此,请将ca.pem
和client-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
根据/etc/ssl/certs/
目录的内容生成受信任的 SSL 证书列表:
- 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
实用程序进行备份。有关详细信息,请参阅官方 MySQL 文档。
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
请注意,此命令useSSL
在 MySQL 连接字符串中包含该选项。通过将此选项设置为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
此查询中的子句指定sample_table
了source_db
架构内的持有:
- . . . 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
然后添加以下内容,确保更新突出显示的值以与您自己的配置保持一致:
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
: 这个子句指定了源数据库。在本例中,它指向我们在步骤 1 中创建的 MySQL 数据库的连接字符串。INTO
: 同样,这一行指定了 pgLoader 应该加载数据的 PostgreSQL 数据库。WITH
: 这个子句允许你为 pgLoader 定义特定的行为。您可以在此处找到WITH
与 MySQL 迁移兼容的完整选项列表。在这个例子中,我们只包括两个选项: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 数据库。您只需要从具有MySQL根用户访问权限的 Linux 用户配置文件中运行迁移命令:
- pgloader mysql://root@localhost/source_db pgsql://sammy:postgresql_password@localhost/target_db
执行这样的本地迁移意味着您不必对 MySQL 的默认网络配置或系统的防火墙规则进行任何更改。
从 CSV 文件迁移
您还可以使用 CSV 文件中的数据加载 PostgreSQL 数据库。
假设您有一个名为 的 CSV 数据文件load.csv
,将其加载到 Postgres 数据库的命令可能如下所示:
- pgloader load.csv pgsql://sammy:password@localhost/target_db
由于 CSV 格式未完全标准化,因此在以这种方式直接从 CSV 文件加载数据时,您可能会遇到问题。幸运的是,您可以通过在pgLoader 的命令行选项中包含各种选项或通过在加载文件中指定它们来纠正不规则性。有关更多详细信息,请参阅有关该主题的 pgLoader 文档。
迁移到托管 PostgreSQL 数据库
也可以从自我管理的数据库迁移到管理的 PostgreSQL 数据库。为了说明这种迁移的外观,我们将使用 MySQL 服务器和 DigitalOcean Managed PostgreSQL 数据库。我们还将使用我们在第 1 步中创建的示例数据库,但如果您跳过了该步骤并拥有您想要迁移的自己的数据库,则可以改为指向该数据库。
注意:有关如何设置 DigitalOcean 托管数据库的说明,请参阅我们的托管数据库快速入门指南。
对于此迁移,我们不需要 pgLoader 的useSSL
选项,因为它仅适用于远程 MySQL 数据库,我们将从本地 MySQL 数据库运行此迁移。但是,sslmode=require
当我们加载并连接到 DigitalOcean Managed PostgreSQL 数据库时,我们将使用该选项,这将确保您的数据受到保护。
因为useSSL
这次我们没有使用,您可以使用apt
安装 pgLoader 和postgresql-client
软件包,这将允许您从 MySQL 服务器访问托管 PostgreSQL 数据库:
- sudo apt install pgloader postgresql-client
之后,您可以运行pgloader
命令来迁移数据库。为此,您需要托管数据库的连接字符串。
对于 DigitalOcean 托管数据库,您可以从云控制面板复制连接字符串。首先,单击数据库在左侧边栏菜单,并选择要迁移数据的数据库。然后向下滚动到“连接详细信息”部分。单击下拉菜单并选择Connection string。然后,单击复制按钮将字符串复制到剪贴板并将其粘贴到以下迁移命令中,替换此处显示的示例 PostgreSQL 连接字符串。这会将您的 MySQL 数据库defaultdb
作为doadmin PostgreSQL 角色迁移到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 后,您可能会发现以下教程很有趣: