跳至主要内容

将 MySQL 与 ClickHouse 集成

本页介绍将 MySQL 与 ClickHouse 集成的两种方法

  • 使用 MySQL 表引擎,用于从 MySQL 表读取数据
  • 使用 MaterializedMySQL 数据库引擎,用于将 MySQL 中的数据库与 ClickHouse 中的数据库同步

使用 MySQL 表引擎将 ClickHouse 连接到 MySQL

MySQL 表引擎允许您将 ClickHouse 连接到 MySQL。SELECTINSERT 语句可以在 ClickHouse 或 MySQL 表中执行。本文介绍了如何使用 MySQL 表引擎的基本方法。

1. 配置 MySQL

  1. 在 MySQL 中创建一个数据库

    CREATE DATABASE db1;
  2. 创建一个表

    CREATE TABLE db1.table1 (
    id INT,
    column1 VARCHAR(255)
    );
  3. 插入示例行

    INSERT INTO db1.table1
    (id, column1)
    VALUES
    (1, 'abc'),
    (2, 'def'),
    (3, 'ghi');
  4. 创建一个用户从 ClickHouse 连接

    CREATE USER 'mysql_clickhouse'@'%' IDENTIFIED BY 'Password123!';
  5. 根据需要授予权限。(为了演示目的,mysql_clickhouse 用户被授予管理员权限。)

    GRANT ALL PRIVILEGES ON *.* TO 'mysql_clickhouse'@'%';
注意

如果您在 ClickHouse 云中使用此功能,您可能需要允许 ClickHouse 云 IP 地址访问您的 MySQL 实例。查看 ClickHouse 云端点 API 以获取出站流量详细信息。

2. 在 ClickHouse 中定义一个表

  1. 现在让我们创建一个使用 MySQL 表引擎的 ClickHouse 表

    CREATE TABLE mysql_table1 (
    id UInt64,
    column1 String
    )
    ENGINE = MySQL('mysql-host.domain.com','db1','table1','mysql_clickhouse','Password123!')

    最小参数是

    参数描述示例
    主机主机名或 IPmysql-host.domain.com
    数据库MySQL 数据库名称db1
    MySQL 表名称table1
    用户连接到 MySQL 的用户名mysql_clickhouse
    密码连接到 MySQL 的密码Password123!
    注意

    查看 MySQL 表引擎 文档页面以获取完整的参数列表。

3. 测试集成

  1. 在 MySQL 中,插入一个示例行

    INSERT INTO db1.table1
    (id, column1)
    VALUES
    (4, 'jkl');
  2. 请注意,MySQL 表中的现有行位于 ClickHouse 表中,以及您刚刚添加的新行

    SELECT
    id,
    column1
    FROM mysql_table1

    您应该看到 4 行

    Query id: 6d590083-841e-4e95-8715-ef37d3e95197

    ┌─id─┬─column1─┐
    │ 1 │ abc │
    │ 2 │ def │
    │ 3 │ ghi │
    │ 4 │ jkl │
    └────┴─────────┘

    4 rows in set. Elapsed: 0.044 sec.
  3. 让我们向 ClickHouse 表添加一行

    INSERT INTO mysql_table1
    (id, column1)
    VALUES
    (5,'mno')
  4. 请注意,新行出现在 MySQL 中

    mysql> select id,column1 from db1.table1;

    您应该看到新行

    +------+---------+
    | id | column1 |
    +------+---------+
    | 1 | abc |
    | 2 | def |
    | 3 | ghi |
    | 4 | jkl |
    | 5 | mno |
    +------+---------+
    5 rows in set (0.01 sec)

摘要

MySQL 表引擎允许您将 ClickHouse 连接到 MySQL 以交换数据。有关更多详细信息,请务必查看 MySQL 表引擎 的文档页面。

在 ClickHouse 中复制 MySQL 数据库

ClickHouse 云不支持
实验性功能。 了解更多。

MaterializedMySQL 数据库引擎允许您在 ClickHouse 中定义一个数据库,该数据库包含 MySQL 数据库中的所有现有表,以及这些表中的所有数据。在 MySQL 方面,可以继续进行 DDL 和 DML 操作,ClickHouse 会检测这些更改并充当 MySQL 数据库的副本。

本文介绍了如何配置 MySQL 和 ClickHouse 以实现此复制。

1. 配置 MySQL

  1. 配置 MySQL 数据库以允许复制和本机身份验证。ClickHouse 仅适用于本机密码身份验证。将以下条目添加到 /etc/my.cnf

    default_authentication_plugin = mysql_native_password
    gtid_mode = ON
    enforce_gtid_consistency = ON
  2. 创建一个用户从 ClickHouse 连接

    CREATE USER clickhouse_user IDENTIFIED BY 'ClickHouse_123';
  3. 向新用户授予所需的权限。为了演示目的,这里已授予完全的管理员权限

    GRANT ALL PRIVILEGES ON *.* TO 'clickhouse_user'@'%';
    注意

    MySQL 用户需要的最小权限是 RELOADREPLICATION SLAVEREPLICATION CLIENTSELECT PRIVILEGE

  4. 在 MySQL 中创建一个数据库

    CREATE DATABASE db1;
  5. 创建一个表

    CREATE TABLE db1.table_1 (
    id INT,
    column1 VARCHAR(10),
    PRIMARY KEY (`id`)
    ) ENGINE = InnoDB;
  6. 插入一些示例行

    INSERT INTO db1.table_1
    (id, column1)
    VALUES
    (1, 'abc'),
    (2, 'def'),
    (3, 'ghi');

2. 配置 ClickHouse

  1. 设置参数以允许使用实验性功能

    set allow_experimental_database_materialized_mysql = 1;
  2. 创建一个使用 MaterializedMySQL 数据库引擎的数据库

    CREATE DATABASE db1_mysql
    ENGINE = MaterializedMySQL(
    'mysql-host.domain.com:3306',
    'db1',
    'clickhouse_user',
    'ClickHouse_123'
    );

    最小参数是

    参数描述示例
    主机:端口主机名或 IP 和端口mysql-host.domain.com
    数据库MySQL 数据库名称db1
    用户连接到 MySQL 的用户名clickhouse_user
    密码连接到 MySQL 的密码ClickHouse_123
    注意

    查看 MaterializedMySQL 数据库引擎 文档页面以获取完整的参数列表。

3. 测试集成

  1. 在 MySQL 中,插入一个示例行

    INSERT INTO db1.table_1
    (id, column1)
    VALUES
    (4, 'jkl');
  2. 请注意,新行出现在 ClickHouse 表中

    SELECT
    id,
    column1
    FROM db1_mysql.table_1

    响应看起来像

    Query id: d61a5840-63ca-4a3d-8fac-c93235985654

    ┌─id─┬─column1─┐
    │ 1 │ abc │
    └────┴─────────┘
    ┌─id─┬─column1─┐
    │ 4 │ jkl │
    └────┴─────────┘
    ┌─id─┬─column1─┐
    │ 2 │ def │
    └────┴─────────┘
    ┌─id─┬─column1─┐
    │ 3 │ ghi │
    └────┴─────────┘

    4 rows in set. Elapsed: 0.030 sec.
  3. 假设 MySQL 中的表已修改。让我们向 MySQL 中的 db1.table_1 添加一个列

    alter table db1.table_1 add column column2 varchar(10) after column1;
  4. 现在让我们将一行插入到修改后的表中

    INSERT INTO db1.table_1
    (id, column1, column2)
    VALUES
    (5, 'mno', 'pqr');
  5. 请注意,ClickHouse 中的表现在具有新列和新行

    SELECT
    id,
    column1,
    column2
    FROM db1_mysql.table_1

    以前的行在 column2 中将为 NULL

    Query id: 2c32fd15-3c83-480b-9bfc-cba5d932d674

    Connecting to localhost:9000 as user default.
    Connected to ClickHouse server version 22.2.2 revision 54455.

    ┌─id─┬─column1─┬─column2─┐
    │ 3 │ ghi │ ᴺᵁᴸᴸ │
    └────┴─────────┴─────────┘
    ┌─id─┬─column1─┬─column2─┐
    │ 2 │ def │ ᴺᵁᴸᴸ │
    └────┴─────────┴─────────┘
    ┌─id─┬─column1─┬─column2─┐
    │ 1 │ abc │ ᴺᵁᴸᴸ │
    │ 5 │ mno │ pqr │
    └────┴─────────┴─────────┘
    ┌─id─┬─column1─┬─column2─┐
    │ 4 │ jkl │ ᴺᵁᴸᴸ │
    └────┴─────────┴─────────┘

    5 rows in set. Elapsed: 0.017 sec.

摘要

就是这样!MaterializedMySQL 数据库引擎将使 MySQL 数据库与 ClickHouse 同步。有一些细节和限制,因此请务必阅读 MaterializedMySQL 的文档页面 以获取更多详细信息。