EMR 开发指南

MySQL 数据导入

最近更新时间:2020-04-22 19:43:50

概述

本文介绍两种将 MySQL 数据库中的数据导入到 ClickHouse 集群的方案。

  • 利用 ClickHouse 支持 MySQL 外表的特性来实现。
  • 使用 Altinity 提供的clickhouse-mysql-data-reader工具来实现数据导入。

本文示例中,将 MySQL 数据表 test.clickhouse_test 中的数据导入到 ClickHouse 集群中,该表的 Schema 如下:

基于 MySQL 表引擎来实现数据导入(简易方案)

ClickHouse 的 MySQL 表引擎可以对存储在远程 MySQL 服务器上的数据执行 SELECT 查询。基于这样能力,利用CREATE ... SELECT * FROM或者INSERT INTO ... SELECT * FROM语句即可完成数据导入。

具体步骤:

  • 步骤1:在 ClickHouse 中创建 MySQL 表引擎。
  • 步骤2:建立 ClickHouse 表。
  • 步骤3:将步骤1中的外表中数据,导入到 ClickHouse 表中。

还可以将步骤2/3合并成一个步骤,即采用CREATE TABLE AS SELECT * FROM方式来达到同样效果。

ClickHouse 支持 MySQL 外表引擎,是否还有必要将数据导入到 ClickHouse 中?
是非常有必要的。MySQL 外表引擎,本身不存储数据,数据存储在 MySQL 中。在复制查询中,特别是有 JOIN 的情况下,访问外表是相当慢的,甚至不可能完成。该方案有明显缺陷,无法增量导入数据。

基于 Altinity 的工具实现数据导入(推荐方案)

Altinity 提供了一个工具 clickhouse-mysql-data-reader 来实现数据导入。该工具可以实现 MySQL 的存量数据导出和增量数据的导出。

按照官网推荐,使用 pypy 工具能够显著提升 clickhouse-mysql-data-reader 导入数据的性能。

工具准备

  • 步骤1:下载 pypy3.6-7.2.0,解压到 pypy 目录下。
  • 步骤2:安装 clickhouse-mysql。如果是在腾讯云 ClickHouse 集群,完成下面安装操作后,工具已经集成,开箱即用,无需配置。
    • 安装 pip:执行pypy/bin/pypy3 -m ensurepip
    • 安装 mysql-replication,clickhouse-driver,执行pypy/bin/pip3 install mysql-replicationpypy/bin/pip3 install clickhouse-driver
    • 安装 clickhouse-mysql 并初始化,执行pypy/bin/pip3 install clickhouse-mysql,执行pypy/bin/clickhouse-mysql --install
    • 安装 clickhouse-client,执行yum install -y clickhouse-client
    • 安装 mysql-community-devel,执行yum install -y mysql-community-devel
  • 步骤3:数据库权限准备,所需权限为 SUPER、REPLICATION CLIENT。
    CREATE USER 'root'@'%' IDENTIFIED BY 'cloud';
    GRANT SELECT, REPLICATION CLIENT, REPLICATION SLAVE, SUPER ON *.* TO 'root'@'%';
    FLUSH PRIVILEGES;

数据导入

准备工作完成后,即可使用该工具完成数据从 MySQL 导入到 ClickHouse 集群中。具体步骤如下:

  1. 使用 clickhouse-mysql-data-reader 生成建表 SQL。

    然后修改 SQL 语句,选择合适的表引擎(在本示例中使用 TinyLog)。执行建表语句clickhouse-client -m < create.sql
  2. 导入存量数据
  3. 导入增量数据

    其中,参数含义如下:
    • src-host:MySQL 数据库 IP。
    • src-user:MySQL 数据库用户名。
    • src-password:MySQL 数据库密码。
    • create-table-sql-template:生产 ClickHouse 的建表脚本。
    • with-create-database:建表脚本中增加创建数据库语句。
    • src-tables:源表(MySQL 表)。
    • mempool-max-flush-interval:mempool flush 的时间周期。
    • src-server-id:源 MySQL 是否为 master 节点。
    • src-resume:断点续传。
    • src-wait:等待数据。
    • nice-pause:如果没有数据,睡眠的时间间隔。
目录