原始网页:https://www.cockroachlabs.com/docs/stable/migration-overview.html#schema-and-application-changes


WARING: 这是一个beta功能,目前正在接受持续的测试。如果确认存在BUG,请提交Github issue

本小节将说明如何使用IMPORT功能读取pg_dump生成文件,从Postgres迁移数据到CockroachDB。

以下示例将从Amazon S3拉取真实的数据,其使用的employees数据集也被使用在MySQL文档当中。该数据将通过pgloader导入Postgres中,然后按照下述操作进行调整。

Step 1: 导出Postgres数据库

从Postgres数据库中导出数据(用于导入CockroachDB)有几种方式:

如果导出文件包含函数或是类型定义,则导入CockroachDB会失败。除了使用pg_dump,你可能还需要编辑导出文件,删除函数和数据类型相关的内容。

此外,CockroachDB的IMPORT不支持从Postgres非公开的Schemas自动导入数据。解决方式是编辑导出文件,修改CREATE TABLE语句中相关的表和Schema名称。

导出整个数据库

绝大多数用户需要一次性导出整个Postgres数据库,可以使用pg_dump命令导出整个数据库,如下所示:

pg_dump employees > /tmp/employees-full.sql

具体到该数据集,需要对Postgres导出文件进行以下修改:

一次只导出单张表的数据

从Postgres数据库中导出employees表的数据,可以使用pg_dump工具执行以下命令:

pg_dump -t employees  employees > /tmp/employees.sql

具体到该数据集,需要对Postgres导出的文件进行以下修改:

Step 2: 上传文件到集群能访问到的位置

CockroachDB集群中的每个节点都需要访问到导入使用的数据文件。有几种方式能够使得集群访问到数据文件。关于IMPORT语句支持的存储位置的类型,可以查看Import File URL

TIPS: 我们强烈推荐使用云存储(例如Amazon S3或是Google Cloud)托管需要导入的数据文件。

Step 3: 导入Postgres导出文件

用户可以根据情况(导入整个数据库或是导入单张表)使用并调整IMPROT语句来导入数据。

本小节使用的IMPORT语句将从Amazon S3中拉取真实数据,开启后台导入任务。用户可以通过SHOW JOBS查看该任务。

导入整个数据库的导出文件

假使用户导出了整个数据库,可以通过以下的IMPORT语句从导出文件中读取全部数据和DDL语句(包含存在的外键关系)。

IMPORT PGDUMP 'https://s3-us-west-1.amazonaws.com/cockroachdb-movr/datasets/employees-db/pg_dump/employees-full.sql.gz';
       job_id       |  status   | fraction_completed |  rows  | index_entries | system_records |  bytes
--------------------+-----------+--------------------+--------+---------------+----------------+----------
 381845110403104769 | succeeded |                  1 | 300024 |             0 |              0 | 11534293
(1 row)

导入整个数据库导出文件中的单张表

假使用户导出了整个数据库,可以通过以下的IMPORT语句从导出文件中读取某个表的数据和其CREATE TABLE语句:

CREATE DATABASE IF NOT EXISTS employees;
USE employees;
IMPORT TABLE employees FROM PGDUMP 'https://s3-us-west-1.amazonaws.com/cockroachdb-movr/datasets/employees-db/pg_dump/employees-full.sql.gz';
       job_id       |  status   | fraction_completed |  rows  | index_entries | system_records |  bytes
--------------------+-----------+--------------------+--------+---------------+----------------+----------
 383839294913871873 | succeeded |                  1 | 300024 |             0 |              0 | 11534293
(1 row)

导入单张表的导出文件

假使用户导出了单张表,最简单的导入方式是通过以下的IMPORT TABLE语句从导出文件中读取该文件的数据和CREATE TABLE语句:

CREATE DATABASE IF NOT EXISTS employees;
USE employees;
IMPORT PGDUMP 'https://s3-us-west-1.amazonaws.com/cockroachdb-movr/datasets/employees-db/pg_dump/employees.sql.gz';
       job_id       |  status   | fraction_completed |  rows  | index_entries | system_records |  bytes   
--------------------+-----------+--------------------+--------+---------------+----------------+----------
 383855569817436161 | succeeded |                  1 | 300024 |             0 |              0 | 11534293
(1 row)

如果因为一些原因需要指定为表的某些列,用户可以使用以下的IMPORT TABLE语句,它将忽略文件中的CREATE TABLE语句,选择使用用户指定的列创建表。

IMPORT TABLE employees (
  emp_no INT PRIMARY KEY,
  birth_date DATE NOT NULL,
  first_name STRING NOT NULL,
  last_name STRING NOT NULL,  
  gender STRING NOT NULL,
  hire_date DATE NOT NULL
)
PGDUMP DATA ('https://s3-us-west-1.amazonaws.com/cockroachdb-movr/datasets/employees-db/pg_dump/employees.sql.gz');

配置选项

IMPORT ... PGDUMP语句相关的配置选项有:

最大行大小

max_row_size选项可以用来调整行大小的限制,默认是0.5MB。如果导出的文件中包含特别长的行,则需要调整该选项:

IMPORT TABLE employees (
  emp_no INT PRIMARY KEY,
  birth_date DATE NOT NULL,
  first_name STRING NOT NULL,
  last_name STRING NOT NULL,
  gender STRING NOT NULL,
  hire_date DATE NOT NULL
)
PGDUMP DATA ('s3://your-external-storage/employees.sql?AWS_ACCESS_KEY_ID=123&AWS_SECRET_ACCESS_KEY=456') WITH max_row_size = '5MB';

忽略外键

默认情况下,IMPORT ... PGDUMP支持外键,即该配置选项的默认值为false。使用skip_foreign_keys选项能够忽略导出文件中DDL语句的外键约束,加快导入的速度。在导入某张表的时候,该选项也能够帮助用户避免可能的、因为引用其他表所导致的错误。

IMPORT TABLE employees (
    emp_no INTEGER NOT NULL,
    birth_date DATE NOT NULL,
    first_name STRING NOT NULL,
    last_name STRING NOT NULL,
    gender STRING NOT NULL,
    hire_date DATE NOT NULL
  ) PGDUMP DATA ('s3://your-external-storage/employees.sql?AWS_ACCESS_KEY_ID=123&AWS_SECRET_ACCESS_KEY=456') WITH skip_foreign_keys;

在导入完成后可以使用ALTER TABLE ... ADD CONSTRAINT命令添加外键约束