原始网页:https://www.cockroachlabs.com/docs/stable/migrate-from-postgres.html


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

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

以下示例使用的employees数据集也被使用在MySQL文档当中。

注意事项

除了Migration Overview里提到的注意事项以外,对于MySQL来说在迁移数据之前,有一些特别的注意事项需要用户关注。

字符串大小写的敏感性

默认情况下MySQL字符串是大小写不敏感的,但是CockroachDB中的字符串是大小写敏感的。这意味着用户需要编辑MySQL导出文件的部分内容以符合CockroachDB的要求。例如,用户在MySQL中进行的字符串对比操作,可能需要调整才能在CockroachDB中正常执行。

关于MySQL字符串大小写的敏感性可以查看MySQL文档中的Case Sensitivity in String Searches。关于CockroachDB当中字符串的细节,可以查看STRING

Step 1: 导出MySQL数据库

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

导出整个数据库

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

mysqldump -uroot employees > /tmp/employees-full.sql

一次只导出单张表的数据

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

mysqldump -uroot employees employees > employees.sql

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

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

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

Step 3: 导入MySQL导出文件

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

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

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

假使用户导出了整个数据库,可以通过以下的IMPORT语句从导出文件中读取全部数据和DDL语句(包含CREATE TABLE语句和外键约束):

CREATE DATABASE IF NOT EXISTS employees;
USE employees;
IMPORT MYSQLDUMP 'https://s3-us-west-1.amazonaws.com/cockroachdb-movr/datasets/employees-db/mysqldump/employees-full.sql.gz';
       job_id       |  status   | fraction_completed |  rows   | index_entries | system_records |   bytes
--------------------+-----------+--------------------+---------+---------------+----------------+-----------
 382716507639906305 | succeeded |                  1 | 3919015 |        331636 |              0 | 110104816
(1 row)

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

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

CREATE DATABASE IF NOT EXISTS employees;
USE employees;
IMPORT MYSQLDUMP 'https://s3-us-west-1.amazonaws.com/cockroachdb-movr/datasets/employees-db/mysqldump/employees.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 TABLE employees FROM MYSQLDUMP 'https://s3-us-west-1.amazonaws.com/cockroachdb-movr/datasets/employees-db/mysqldump/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语句,选择使用用户指定的列创建表。

CREATE DATABASE IF NOT EXISTS employees;
USE employees;
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
  )
MYSQLDUMP DATA ('https://s3-us-west-1.amazonaws.com/cockroachdb-movr/datasets/employees-db/mysqldump/employees.sql.gz');

配置选项

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

忽略外键

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

IMPORT MYSQLDUMP 's3://your-external-storage/employees.sql?AWS_ACCESS_KEY_ID=123&AWS_SECRET_ACCESS_KEY=456' WITH skip_foreign_keys;

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