从任意源将数据导入 MariaDB 或 MySQL 数据库实例 - Amazon Relational Database Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

从任意源将数据导入 MariaDB 或 MySQL 数据库实例

如果您需要加载超过 1 GiB 的数据,或者如果您的数据源于 MariaDB 或 MySQL 数据库以外的其他位置,我们建议创建平面文件并使用 mysqlimport 加载。mysqlimport 实用程序是 MySQL 和 MariaDB 客户端软件绑定的另一种命令行实用程序。其目的是将平面文件加载到 MySQL 或 MariaDB 中。有关 mysqlimport 的信息,请参阅 MySQL 文档中的 mysqlimport - 数据导入计划

我们还建议您在加载数据前后创建目标 Amazon RDS 数据库实例的数据库快照。Amazon RDS 数据库快照是数据库实例的完整备份,可用于将数据库实例还原到已知状态。在启动数据库快照时,针对数据库实例的 I/O 操作将在备份数据库过程中暂停。

通过在即将开始加载前创建数据库快照,您可以在需要时将数据库还原到加载前的状态。完成加载后立即创建数据库快照,可让您在遇到问题时不必再次加载数据,且您还可以使用该数据库快照创建新数据库实例。

下面列表显示了需要采取的步骤。下文将详述其中每个步骤。

  1. 创建包含待加载数据的平面文件。

  2. 阻止所有应用程序访问目标数据库实例。

  3. 创建数据库快照。

  4. 考虑关闭 Amazon RDS 自动备份。

  5. 使用 Mysqlimport 加载数据。

  6. 再次启用自动备份。

步骤 1:创建包含待加载数据的平面文件

使用通用格式存储待加载的数据,如逗号分隔值 (CSV)。每个表都必须拥有自己的文件;不能将多个表的数据合并到同一文件。每个文件的名称都必须与对应的表相同。可以根据个人喜好设置文件扩展名。例如,如果表名为 sales,文件名可能为 sales.csvsales.txt,但不能是 sales_01.csv

只要可能,按照正在加载的表的主键对数据进行排序。这样做可以显著优化加载时间并尽可能减少磁盘存储要求。

该过程的速度和效率取决于能否将文件的大小保持在较小状态。如果在未压缩状态下单个文件的大小超过 1 GiB,则需将此文件分割为多个文件,然后分别加载各个文件。

在类 Unix 的系统(包括 Linux)中,请使用 split 命令。例如,以下命令会将 sales.csv 文件分割为多个小于 1 GiB 的文件,且只在换行符处进行分割 (-C 1024m)。新文件被命名为 sales.part_00sales.part_01,以此类推。

split -C 1024m -d sales.csv sales.part_

其他操作系统也具有类似的实用程序。

步骤 2:阻止所有应用程序访问目标数据库实例

开始大量加载前,阻止所有应用程序活动访问您打算加载到的目标数据库实例。我们建议您这样做,特别是当其他会话将要修改正在加载的表或引用的表时。这可以降低加载过程中发生约束冲突的风险并提高加载性能。它还可以将数据库实例还原到加载前的某一时间点,而不会丢失未参与加载的进程所做的更改。

当然,这可能并不可行或不现实。如果您无法在加载前阻止应用程序访问数据库实例,应采取步骤以确保数据的可用性和完整性。所需的具体步骤在很大程度上根据特定的使用案例和现场要求而有所不同。

步骤 3:创建数据库快照

如果您计划将数据加载到不包含数据的新数据库实例,可以跳过此步骤。否则,通过创建数据库实例的数据库快照,您可以在必要时将数据库实例还原到加载前的时间点。正如上面所述,在启动数据库快照时,针对数据库实例的 I/O 操作将在备份数据库过程中暂停几分钟。

以下示例使用 Amazon CLI create-db-snapshot 命令创建 AcmeRDS 实例的数据库快照,并为数据库快照指定标识符 "preload"

对于 Linux、macOS 或 Unix:

aws rds create-db-snapshot \ --db-instance-identifier AcmeRDS \ --db-snapshot-identifier preload

对于 Windows:

aws rds create-db-snapshot ^ --db-instance-identifier AcmeRDS ^ --db-snapshot-identifier preload

也可以使用从数据库快照还原功能,以创建用于试运行的测试数据库实例或撤消在加载期间进行的更改。

请务必注意,从数据库快照还原数据库将创建新的数据库实例,与所有数据库实例一样,该数据库实例具有唯一的标识符和终端节点。要还原数据库实例但不改变端点,请先删除该数据库实例,以使您能够重新使用此端点。

例如,要创建一个适用于试运行或其他测试的数据库实例,您可为数据库实例指定它自己的标识符。在示例中,标识符为 AcmeRDS-2"。该示例使用与 AcmeRDS-2 关联的端点连接到数据库实例。

对于 Linux、macOS 或 Unix:

aws rds restore-db-instance-from-db-snapshot \ --db-instance-identifier AcmeRDS-2 \ --db-snapshot-identifier preload

对于 Windows:

aws rds restore-db-instance-from-db-snapshot ^ --db-instance-identifier AcmeRDS-2 ^ --db-snapshot-identifier preload

要重新使用现有的端点,请首先删除该数据库实例,然后为还原的数据库指定相同的标识符。

对于 Linux、macOS 或 Unix:

aws rds delete-db-instance \ --db-instance-identifier AcmeRDS \ --final-db-snapshot-identifier AcmeRDS-Final aws rds restore-db-instance-from-db-snapshot \ --db-instance-identifier AcmeRDS \ --db-snapshot-identifier preload

对于 Windows:

aws rds delete-db-instance ^ --db-instance-identifier AcmeRDS ^ --final-db-snapshot-identifier AcmeRDS-Final aws rds restore-db-instance-from-db-snapshot ^ --db-instance-identifier AcmeRDS ^ --db-snapshot-identifier preload

在删除数据库实例之前,上述示例为其制作最终的数据库快照。您可以自由选择,但我们建议您这样做。

步骤 4:考虑关闭 Amazon RDS 自动备份

警告

如果需要执行时间点恢复,请勿关闭自动备份。

关闭自动备份会清除所有现有备份,因此关闭自动备份后,将无法使用时间点恢复功能。禁用自动备份是一种性能优化,并且无需数据加载。关闭自动备份不会影响手动数据库快照。仍然可以还原所有现有的手动数据库快照。

关闭自动备份可减少约 25% 的加载时间,并减少加载期间所需的存储空间。如果您计划将数据加载到不包含任何数据的新数据库实例,关闭备份就可轻松加速加载并避免使用备份所需的额外存储空间。但是,在某些情况下,您可能会计划将数据加载到已包含数据的数据库实例。如果是这样,请权衡关闭备份的优势与无法执行时间点恢复功能的影响。

数据库实例默认开启自动备份 (保留期为一天)。要关闭自动备份,请将备份保留期设置为零。加载后,可以将备份保留期设置为非零值,重新开启自动备份。要开启或关闭备份,Amazon RDS 将关闭并重新启动数据库实例,以开启或关闭 MariaDB 或 MySQL 日志记录。

使用 Amazon CLI modify-db-instance 命令将备份保留期设置为零并立即应用更改。要将保留期设置为零,需要重新启动数据库实例,因此,等到重新启动完成后再继续操作。

对于 Linux、macOS 或 Unix:

aws rds modify-db-instance \ --db-instance-identifier AcmeRDS \ --apply-immediately \ --backup-retention-period 0

对于 Windows:

aws rds modify-db-instance ^ --db-instance-identifier AcmeRDS ^ --apply-immediately ^ --backup-retention-period 0

您可以使用 Amazon CLI describe-db-instances 命令检查数据库实例的状态。以下示例显示 AcmeRDS 数据库实例的数据库实例状态。

aws rds describe-db-instances --db-instance-identifier AcmeRDS --query "*[].{DBInstanceStatus:DBInstanceStatus}"

当数据库实例状态为 available 时,您可以继续操作。

步骤 5:加载数据

使用 Mysqlimport 实用程序将平面文件加载到 Amazon RDS。以下示例让 mysqlimport 加载名为“sales”且扩展名以“part_”开头的所有文件。这种方法可以轻松加载“split”示例中创建的所有文件。

使用 --compress 选项,最大限度地减少网络流量。--fields-terminated-by=',' 选项可用于 CSV 文件,--local 选项指定传入数据应位于客户端。如果没有 --local 选项,Amazon RDS 数据库实例会查找数据库主机上的数据,因此请始终指定 --local 选项。对于 --host 选项,请指定 RDS for MySQL 数据库实例的数据库实例端点。

对于 RDS for MySQL 版本 8.0.15 及更高版本,请在使用 mysqlimport 实用程序之前运行以下语句。

GRANT SESSION_VARIABLES_ADMIN ON *.* TO master_user;

master_user 替换为您数据库实例的主用户名。

对于 Linux、macOS 或 Unix:

mysqlimport --local \ --compress \ --user=username \ --password \ --host=hostname \ --fields-terminated-by=',' Acme sales.part_*

对于 Windows:

mysqlimport --local ^ --compress ^ --user=username ^ --password ^ --host=hostname ^ --fields-terminated-by="," Acme sales.part_*

对于非常大的数据加载,请在加载文件之间定期创建额外的数据库快照,并记下加载了哪些文件。如果出现问题,您可以轻松从最后一个数据库快照的时间点恢复,从而避免冗长的重新加载问题。

步骤 6:重新开启 Amazon RDS 自动备份

加载完成后,将备份保留期重新设置为其预加载值,重新开启 Amazon RDS 自动备份。如前文所述,Amazon RDS 会重新启动数据库实例,因此,请为短暂中断做好准备。

以下示例使用 Amazon CLI modify-db-instance 命令开启 AcmeRDS 数据库实例的自动备份,并将保留期设置为一天。

对于 Linux、macOS 或 Unix:

aws rds modify-db-instance \ --db-instance-identifier AcmeRDS \ --backup-retention-period 1 \ --apply-immediately

对于 Windows:

aws rds modify-db-instance ^ --db-instance-identifier AcmeRDS ^ --backup-retention-period 1 ^ --apply-immediately