• ClickHouse学习系列之八【数据导入迁移&同步】


    背景

      在介绍了一些ClickHouse相关的系列文章之后,大致对ClickHouse有了比较多的了解。它是一款非常优秀的OLAP数据库,为了更好的来展示其强大的OLAP能力,本文将介绍一些快速导入大量数据到ClickHouse的方法。如:通过文件、远程数据库等方式。

    说明

    一、其他数据库导入到ClickHouse

    MySQL可以做为ClickHouse的外部存储类型,还有其他的存储类型,如:MongoDB、PostgreSQL、HDFS、JDBC、ODBC、Kafka、File、RabbitMQ、S3等等,具体的可以看官网说明。本文介绍MySQL、MongoDB、File三种方式的导入,前2种方式相当于链表。

    ① MySQL数据导入到ClickHouse

    方法一: 外部引擎,建立远程表

    MySQL引擎允许对存储在远程 MySQL 服务器上的数据执行 SELECT 和 INSERT 查询,不能执行DELETE 和 UPDATE。

    CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
    (
        name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1],
        name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2],
        ...
    ) ENGINE = MySQL('host:port', 'database', 'table', 'user', 'password'[, replace_query, 'on_duplicate_clause'])
    SETTINGS
        [connection_pool_size=16, ]
        [connection_max_tries=3, ]
        [connection_auto_close=true ]
    ;

    建议:列名相同。参数 external_table_functions_use_nulls 表示如何处理null值,默认1,可选值0。1:可以为null,0:不能为null,使用默认值代替。MySQL的参数说明:

    • host:port — MySQL 地址

    • database — MySQL数据库名

    • table — MySQL表名

    • user — MySQL 用户

    • password — MySQL用户密码

    • replace_query — 默认0,对应replace into。设置1这会用replace into 代替 insert into

    • on_duplicate_clause — 默认0,对应 ON DUPLICATE KEY。设置1这会代替 insert into,和replace_query互斥

    例子:

    CREATE TABLE testdb.test
    (
        `id` UInt32,
        `c1` Date COMMENT 'c1',
        `c2` DateTime COMMENT 'c2',
        `c3` String COMMENT 'c3',
        `c4` UInt32 COMMENT 'c4'
    )
    ENGINE = MySQL('10.10.10.10:3306','test','test','dba','dba')

    注意:在查询远程表的时候,除了where条件会带入到远程的MySQL中,其余的条件(聚合),包含limit都会在ClickHouse本地执行,而远程则执行全表扫描。最后可以对该表执行 SELECT 和 INSERT 查询,不能执行DELETE 和 UPDATE。

    此后就可以在ClickHouse上创建符合要求的引擎表,如MergeTree引擎,再通过以下SQL来进行导入数据。

     insert into ck_tb select * from my_tb

     方法二:和方法一类似,不过方法二是直接用了mysql函数来进行远程访问:建立需要的引擎,再用mysql函数进行远程导入,可以指定列来导入数据,把*改成具体列名。

    insert into ck_tb select * from mysql('host:port', 'database', 'table', 'user', 'password')

    mysql函数里的参数可以参考方法一的说明。
    例子:

    -- 建立表
    CREATE TABLE testdb.test_ck1
    (
        `id` UInt32,
        `c1` Date COMMENT 'c1',
        `c2` DateTime COMMENT 'c2',
        `c3` String COMMENT 'c3',
        `c4` UInt32 COMMENT 'c4'
    )
    ENGINE = MergeTree
    PARTITION BY c1
    ORDER BY id
    
    -- 插入数据
    INSERT INTO test_ck1 SELECT *
    FROM mysql('10.10.10.10:3306','test','test','dba','dba')

    方法三:create + select

    CREATE TABLE [IF NOT EXISTS] [db.]table_name
    ENGINE = ENGINE
    AS
    SELECT *
    FROM mysql('host:port', 'database', 'table', 'user', 'password')

    mysql函数里的参数可以参考方法一的说明。

    例子:

    create table test_ck2 engine = MergeTree order by id as select * from mysql('10.10.10.10:3306','test','test','dba','dba');
    或
    create table test_ck2 engine = Log as select * from mysql('10.10.10.10:3306','test','test','dba','dba');

    通过该方法的导入,不需要事先建立表,它会自动根据select出来的数据按照需要创建符合要求的类型。

    ② MongoDB数据导入到ClickHouse

    MongoDB引擎允许对存储在远程 MongoDB 服务器上的数据执行 SELECT 查询,不能执行 INSERT、DELETE 和 UPDATE。

    CREATE TABLE [IF NOT EXISTS] [db.]table_name
    (
        name1 [type1],
        name2 [type2],
        ...
    ) ENGINE = MongoDB(host:port, database, collection, user, password);

    建议:列名相同。MongoDB的参数说明:

    • host:port — MongoDB 地址.

    • database — MongoDB 数据库名

    • collection — MongoDB 集合名

    • user — MongoDB 用户

    • password — MongoDB 密码

    例子:

    CREATE TABLE mongo_table
    (
        key UInt64, 
        data String
    ) ENGINE = MongoDB('mongo1:27017', 'test', 'simple_table', 'testuser', 'clickhouse');

    注意:相对于MySQL,MongoDB远程表还不允许INSERT。此后就可以在ClickHouse上创建符合要求的引擎表,如MergeTree引擎,再通过以下SQL来进行导入数据。

    insert into ck_tb select * from mon_tb

    MongoDB目前只作为一个外部引擎,不像MySQL还能作为一个函数进行远程操作,所以MySQL数据处理中的方法二、三不适用于MongoDB数据的处理。

    ③ File数据导入到ClickHouse外部引擎函数

    和MySQL引擎导入方法类似, 支持并发读,不支持并发插入。不支持ALTER、索引和副本

    方法一:外部引擎(建立远程表)

    CREATE TABLE file_engine_table (name String, value UInt32) ENGINE=File(Format)

    File函数里的参数Format的取值可以看文档,这里说明下csv的例子。

    -- 建立表
    create table csv_table(id UInt64,name String)engine = File('CSV');
    
    -- 在表目录里创建文件或则导入文件,必须命名为data.CSV
    $ cat data.CSV 
    1,a
    2,b
    3,c
    4,d
    5,e
    
    -- 这样,在表里就可以看到数据了
    :) select * from csv_table;
    
    ┌─id─┬─name─┐
    │  1 │ a    │
    │  2 │ b    │
    │  3 │ c    │
    │  4 │ d    │
    │  5 │ e    │
    └────┴──────┘

    注意:File引擎的表,可以对其进行SELECT、INSERT,不能进行DELETE、UPDATE。此后就可以在ClickHouse上创建符合要求的引擎表,如MergeTree引擎,再通过以下SQL来进行导入数据。

    insert into ck_tb select * from csv_tb

    方法二: 

    通过file函数导入数据,并且以表的形式展示,格式为:

    select * from file(path, format, structure)
    • path — 参数user_files_path下的相对路径,支持以下格式:*、?、{abc,def} 和 {N..M} ,其中 N、M — 数字、'abc'、'def' — 字符串。
    • format — 文件格式
    • structure — 表结构。 格式:'column1_name column1_type, column2_name column2_type, ...'

    在config.xml文件中找到参数user_files_path,在该参数指定的目录下创建一个csv文件:

    $ cat test.csv 
    1,a,123
    2,b,234
    3,c,345
    4,d,456
    5,e,567

    然后通过SQL查询:

    :) SELECT * FROM file('test.csv', 'CSV', 'column1 UInt32, column2 String, column3 UInt32');
    ┌─column1─┬─column2─┬─column3─┐
    │       1 │ a       │     123 │
    │       2 │ b       │     234 │
    │       3 │ c       │     345 │
    │       4 │ d       │     456 │
    │       5 │ e       │     567 │
    └─────────┴─────────┴─────────┘

    如果该目录下有多个csv文件:test.csv、test1.csv、test2.csv,则可以通过通配符来进行全部加载读取:

    :) SELECT * FROM file('test*.csv', 'CSV', 'column1 UInt32, column2 String, column3 UInt32');
    
    ┌─column1─┬─column2─┬─column3─┐
    │       1 │ aaa     │     123 │
    │       2 │ bbb     │     234 │
    │       3 │ ccc     │     345 │
    │       4 │ ddd     │     456 │
    │       5 │ eee     │     567 │
    └─────────┴─────────┴─────────┘
    ┌─column1─┬─column2─┬─column3─┐
    │       1 │ a       │     123 │
    │       2 │ b       │     234 │
    │       3 │ c       │     345 │
    │       4 │ d       │     456 │
    │       5 │ e       │     567 │
    └─────────┴─────────┴─────────┘
    ┌─column1─┬─column2─┬─column3─┐
    │       1 │ aa      │     123 │
    │       2 │ bb      │     234 │
    │       3 │ cc      │     345 │
    │       4 │ dd      │     456 │
    │       5 │ ee      │     567 │
    └─────────┴─────────┴─────────┘

    此后就可以在ClickHouse上创建符合要求的引擎表,如MergeTree引擎,再通过以下SQL来进行导入数据。

    :) insert into csv_table_ck SELECT * FROM file('test*.csv', 'CSV', 'column1 UInt32, column2 String, column3 UInt32')

    方法三: create + select

    CREATE TABLE [IF NOT EXISTS] [db.]table_name
    ENGINE = ENGINE 
    AS
    SELECT *
    FROM file(path, format, structure)

    例子:

    :) create table csv_table_ck1 engine = MergeTree ORDER BY column1 as  SELECT * FROM file('test*.csv', 'CSV', 'column1 UInt32, column2 String, column3 UInt32');

    注意:需要在file函数的参数structure指定的表结构字段中选取字段进行 ORDER BY 的指定设置。并且通过该方法的导入,不需要事先建立表,它会自动根据select出来的数据按照需要创建符合要求的类型。

    方法四:也可以通过输入流来进行数据的导入,clickhouse-local 

    $ echo -e "1,2
    3,4" | clickhouse-local -q "CREATE TABLE table (a Int64, b Int64) ENGINE = File(CSV, stdin); SELECT a, b FROM table; DROP TABLE table"

    二、MySQL同步到ClickHouse(实验阶段)

    ClickHouse推出了MaterializeMySQL数据库引擎,用于将MySQL服务器中的表映射到ClickHouse中。ClickHouse服务做为MySQL副本,读取Binlog并执行DDL和DML请求,实现了基于MySQL Binlog机制的业务数据库实时同步功能:支持全量和增量同步,首次创建数据库引擎时进行一次全量复制,之后通过监控binlog变化进行增量数据同步。阿里云上也有介绍说明

    CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster]
    ENGINE = MaterializeMySQL('host:port', ['database' | database], 'user', 'password') [SETTINGS ...]
    • host:port — MySQL 地址
    • database — MySQL 数据库名
    • user — MySQL 用户名,具有MySQL库的RELOAD、REPLICATION SLAVE、REPLICATION CLIENT以及SELECT PRIVILEGE权限
    • password — MySQL 密码

    使用MaterializeMySQL数据库引擎,同步到ClickHouse集群上表的默认引擎为ReplacingMergeTree,并会在表中增加2个虚拟列:

    • _version — 事务计数器,记录数据版本信息。UInt64类型。
    • _sign — 删除标记,标记该行是否删除。TypeInt8类型:
      • 1 — 未删除
      • -1 — 已删除

    测试:

    MaterializeMySQL数据库引擎需要开启allow_experimental_database_materialize_mysql参数。即需要设置为1:

    SET allow_experimental_database_materialize_mysql = 1

    以上SET 只是更改了当前会话中的值,分布式 DDL 在单独的会话中执行,SET 不影响它。 应该在服务器配置中全局启用 allow_experimental_database_materialize_mysql 设置,如:

     修改user.xml:

        <profiles>
            <!-- Default settings. -->
            <default>
    ...
                <allow_experimental_database_materialize_mysql>1</allow_experimental_database_materialize_mysql>
            </default>
    ...
        </profiles>

    修改config.xml: 

        <distributed_ddl>
    ...
            <path>/clickhouse/task_queue/ddl</path>
            <allow_experimental_database_materialize_mysql>1</allow_experimental_database_materialize_mysql>
    ...
        </distributed_ddl>

    修改这些配置是动态生效的,可以查看该参数是否修改成功: 

    :) SELECT * FROM system.settings WHERE name = 'allow_experimental_database_materialize_mysql';
    
    ┌─name──────────────────────────────────────────┬─value─┬─changed─┬─description─────────────────────────────────────────────────┬─min──┬─max──┬─readonly─┬─type─┐
    │ allow_experimental_database_materialize_mysql │ 11 │ Allow to create database with Engine=MaterializeMySQL(...). │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │        0 │ Bool │
    └───────────────────────────────────────────────┴───────┴─────────┴─────────────────────────────────────────────────────────────┴──────┴──────┴──────────┴──────┘

    现在可以开始MaterializeMySQL数据库引擎来同步MySQL数据库了。需要注意的是MySQL的binlog格式为Row,并且开启GTID。

    ①:创建MaterializeMySQL数据库:同步MySQL的ck_test库中的表

    :) create database mysql_2_ck ENGINE = MaterializeMySQL('10.10.10.10:3306','ck_test','test','test');

    ②:全量同步

    -- 全量:
    通过 select * from tb 拉取MySQL的全量数据进行同步,再在本地ClickHouse上回放

    ③:增量同步

    -- 增量:
    通过订阅MySQL binlog来进行增量同步,在mysql上可以看到 Binlog Dump GTID 的订阅线程,再在本地ClickHouse上回放

    ④:记录MySQL Binlog信息 

    -- 记录 binlog 信息<path>指定的目录下的metadata/dbname中保存binlog和position:<path>/metadata/dbname/.metadata

    通过①~⑤同步关系已经搭建完成,为了测试同步效果,进行测试:测试同步包括:insert,update,delete,alter,create,drop,truncate等大部分DML和DDL操作

    说明:在①中已经建立了ClickHouse【mysql_2_ck】和MySQL【ck_test】库的同步,后续操作在该库中进行。

    新建表
    -- mysql> CREATE TABLE employees (
        ->     emp_no      INT             NOT NULL,
        ->     birth_date  DATE            NOT NULL,
        ->     first_name  VARCHAR(14)     NOT NULL,
        ->     last_name   VARCHAR(16)     NOT NULL,
        ->     gender      CHAR(3)         NOT NULL,    
        ->     hire_date   DATE            NOT NULL,
        ->     PRIMARY KEY (emp_no)
        -> ) ENGINE=INNODB;
    
    -- clickhouse :) show create table employeesG
    statement: CREATE TABLE mysql_2_ck.employees
    (
        `emp_no` Int32,
        `birth_date` Date,
        `first_name` String,
        `last_name` String,
        `gender` String,
        `hire_date` Date,
        `_sign` Int8 MATERIALIZED 1,
        `_version` UInt64 MATERIALIZED 1,
        INDEX _version _version TYPE minmax GRANULARITY 1
    )
    ENGINE = ReplacingMergeTree(_version)
    PARTITION BY intDiv(emp_no, 4294967)
    ORDER BY tuple(emp_no)
    SETTINGS index_granularity = 8192
    
    
    新增数据
    -- mysql> INSERT INTO `employees` VALUES (10001,'1953-09-02','Georgi','Facello','M','1986-06-26'),
        -> (10002,'1964-06-02','Bezalel','Simmel','F','1985-11-21'),
        -> (10003,'1959-12-03','Parto','Bamford','M','1986-08-28'),
        -> (10004,'1954-05-01','Chirstian','Koblick','M','1986-12-01'),
        -> (10005,'1955-01-21','Kyoichi','Maliniak','M','1989-09-12'),
        -> (10006,'1953-04-20','Anneke','Preusig','F','1989-06-02'),
        -> (10007,'1957-05-23','Tzvetan','Zielinski','F','1989-02-10'),
        -> (10008,'1958-02-19','Saniya','Kalloufi','M','1994-09-15'),
        -> (10009,'1952-04-19','Sumant','Peac','F','1985-02-18'),
        -> (10010,'1963-06-01','Duangkaew','Piveteau','F','1989-08-24'),
        -> (10011,'1953-11-07','Mary','Sluis','F','1990-01-22'),
        -> (10012,'1960-10-04','Patricio','Bridgland','M','1992-12-18'),
        -> (10013,'1963-06-07','Eberhardt','Terkki','M','1985-10-20'),
        -> (10014,'1956-02-12','Berni','Genin','M','1987-03-11'),
        -> (10015,'1959-08-19','Guoxiang','Nooteboom','M','1987-07-02'),
        -> (10016,'1961-05-02','Kazuhito','Cappelletti','M','1995-01-27'),
        -> (10017,'1958-07-06','Cristinel','Bouloucos','F','1993-08-03'),
        -> (10018,'1954-06-19','Kazuhide','Peha','F','1987-04-03');
    
    -- clickhouse :) select * from mysql_2_ck.employees;
    ┌─emp_no─┬─birth_date─┬─first_name─┬─last_name───┬─gender─┬──hire_date─┐
    │  100022143-11-07 │ Bezalel    │ Simmel      │ F      │ 1985-11-21 │
    │  100062132-09-24 │ Anneke     │ Preusig     │ F      │ 1989-06-02 │
    │  100112133-04-13 │ Mary       │ Sluis       │ F      │ 1990-01-22 │
    │  100152139-01-23 │ Guoxiang   │ Nooteboom   │ M      │ 1987-07-02 │
    │  100162140-10-06 │ Kazuhito   │ Cappelletti │ M      │ 1995-01-27 │
    └────────┴────────────┴────────────┴─────────────┴────────┴────────────┘
    ┌─emp_no─┬─birth_date─┬─first_name─┬─last_name─┬─gender─┬──hire_date─┐
    │  100042133-10-05 │ Chirstian  │ Koblick   │ M      │ 1986-12-01 │
    │  100092131-09-24 │ Sumant     │ Peac      │ F      │ 1985-02-18 │
    │  100132142-11-11 │ Eberhardt  │ Terkki    │ M      │ 1985-10-20 │
    │  100182133-11-23 │ Kazuhide   │ Peha      │ F      │ 1987-04-03 │
    └────────┴────────────┴────────────┴───────────┴────────┴────────────┘
    ┌─emp_no─┬─birth_date─┬─first_name─┬─last_name─┬─gender─┬──hire_date─┐
    │  100032139-05-09 │ Parto      │ Bamford   │ M      │ 1986-08-28 │
    │  100072136-10-27 │ Tzvetan    │ Zielinski │ F      │ 1989-02-10 │
    │  100102142-11-05 │ Duangkaew  │ Piveteau  │ F      │ 1989-08-24 │
    │  100142135-07-19 │ Berni      │ Genin     │ M      │ 1987-03-11 │
    │  100172137-12-10 │ Cristinel  │ Bouloucos │ F      │ 1993-08-03 │
    └────────┴────────────┴────────────┴───────────┴────────┴────────────┘
    ┌─emp_no─┬─birth_date─┬─first_name─┬─last_name─┬─gender─┬──hire_date─┐
    │  100012133-02-06 │ Georgi     │ Facello   │ M      │ 1986-06-26 │
    │  100052134-06-27 │ Kyoichi    │ Maliniak  │ M      │ 1989-09-12 │
    │  100082137-07-26 │ Saniya     │ Kalloufi  │ M      │ 1994-09-15 │
    │  100122140-03-10 │ Patricio   │ Bridgland │ M      │ 1992-12-18 │
    └────────┴────────────┴────────────┴───────────┴────────┴────────────┘
    
    
    删除数据
    -- mysql> delete from employees where emp_no >10010;
    Query OK, 8 rows affected (0.01 sec)
    
    -- clickhouse :) select * from mysql_2_ck.employees;
    ┌─emp_no─┬─birth_date─┬─first_name─┬─last_name─┬─gender─┬──hire_date─┐
    │  100012133-02-06 │ Georgi     │ Facello   │ M      │ 1986-06-26 │
    │  100052134-06-27 │ Kyoichi    │ Maliniak  │ M      │ 1989-09-12 │
    │  100082137-07-26 │ Saniya     │ Kalloufi  │ M      │ 1994-09-15 │
    └────────┴────────────┴────────────┴───────────┴────────┴────────────┘
    ┌─emp_no─┬─birth_date─┬─first_name─┬─last_name─┬─gender─┬──hire_date─┐
    │  100042133-10-05 │ Chirstian  │ Koblick   │ M      │ 1986-12-01 │
    │  100092131-09-24 │ Sumant     │ Peac      │ F      │ 1985-02-18 │
    └────────┴────────────┴────────────┴───────────┴────────┴────────────┘
    ┌─emp_no─┬─birth_date─┬─first_name─┬─last_name─┬─gender─┬──hire_date─┐
    │  100032139-05-09 │ Parto      │ Bamford   │ M      │ 1986-08-28 │
    │  100072136-10-27 │ Tzvetan    │ Zielinski │ F      │ 1989-02-10 │
    │  100102142-11-05 │ Duangkaew  │ Piveteau  │ F      │ 1989-08-24 │
    └────────┴────────────┴────────────┴───────────┴────────┴────────────┘
    ┌─emp_no─┬─birth_date─┬─first_name─┬─last_name─┬─gender─┬──hire_date─┐
    │  100022143-11-07 │ Bezalel    │ Simmel    │ F      │ 1985-11-21 │
    │  100062132-09-24 │ Anneke     │ Preusig   │ F      │ 1989-06-02 │
    └────────┴────────────┴────────────┴───────────┴────────┴────────────┘
    
    
    修改数据
    -- mysql> update employees set hire_date = hire_date+1 where emp_no <10005;
    Query OK, 4 rows affected (0.01 sec)
    
    -- clickhouse :) select * from mysql_2_ck.employees;
    ┌─emp_no─┬─birth_date─┬─first_name─┬─last_name─┬─gender─┬──hire_date─┐
    │  100012133-02-06 │ Georgi     │ Facello   │ M      │ 1986-06-27 │
    │  100052134-06-27 │ Kyoichi    │ Maliniak  │ M      │ 1989-09-12 │
    │  100082137-07-26 │ Saniya     │ Kalloufi  │ M      │ 1994-09-15 │
    └────────┴────────────┴────────────┴───────────┴────────┴────────────┘
    ┌─emp_no─┬─birth_date─┬─first_name─┬─last_name─┬─gender─┬──hire_date─┐
    │  100032139-05-09 │ Parto      │ Bamford   │ M      │ 1986-08-29 │
    │  100072136-10-27 │ Tzvetan    │ Zielinski │ F      │ 1989-02-10 │
    │  100102142-11-05 │ Duangkaew  │ Piveteau  │ F      │ 1989-08-24 │
    └────────┴────────────┴────────────┴───────────┴────────┴────────────┘
    ┌─emp_no─┬─birth_date─┬─first_name─┬─last_name─┬─gender─┬──hire_date─┐
    │  100022143-11-07 │ Bezalel    │ Simmel    │ F      │ 1985-11-22 │
    │  100062132-09-24 │ Anneke     │ Preusig   │ F      │ 1989-06-02 │
    └────────┴────────────┴────────────┴───────────┴────────┴────────────┘
    ┌─emp_no─┬─birth_date─┬─first_name─┬─last_name─┬─gender─┬──hire_date─┐
    │  100042133-10-05 │ Chirstian  │ Koblick   │ M      │ 1986-12-02 │
    │  100092131-09-24 │ Sumant     │ Peac      │ F      │ 1985-02-18 │
    └────────┴────────────┴────────────┴───────────┴────────┴────────────┘
    
    
    修改表结构
    - 新增字段
    -- mysql> alter table employees add age int after gender;
    Query OK, 0 rows affected (0.08 sec)
    
    -- clickhouse :) desc mysql_2_ck.employees;
    ┌─name───────┬─type────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
    │ emp_no     │ Int32           │              │                    │         │                  │                │
    │ birth_date │ Date            │              │                    │         │                  │                │
    │ first_name │ String          │              │                    │         │                  │                │
    │ last_name  │ String          │              │                    │         │                  │                │
    │ gender     │ String          │              │                    │         │                  │                │
    │ age        │ Nullable(Int32) │              │                    │         │                  │                │
    │ hire_date  │ Date            │              │                    │         │                  │                │
    │ _sign      │ Int8            │ MATERIALIZED │ 1                  │         │                  │                │
    │ _version   │ UInt64          │ MATERIALIZED │ 1                  │         │                  │                │
    └────────────┴─────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
    
    - 删除字段
    -- mysql> alter table employees drop age;
    Query OK, 0 rows affected (0.09 sec)
    
    -- clickhouse :) desc mysql_2_ck.employees;
    ┌─name───────┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
    │ emp_no     │ Int32  │              │                    │         │                  │                │
    │ birth_date │ Date   │              │                    │         │                  │                │
    │ first_name │ String │              │                    │         │                  │                │
    │ last_name  │ String │              │                    │         │                  │                │
    │ gender     │ String │              │                    │         │                  │                │
    │ hire_date  │ Date   │              │                    │         │                  │                │
    │ _sign      │ Int8   │ MATERIALIZED │ 1                  │         │                  │                │
    │ _version   │ UInt64 │ MATERIALIZED │ 1                  │         │                  │                │
    └────────────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
    
    新增索引
    -- ClickHouse不会同步
    
    删除索引
    -- ClickHouse不会同步
    
    修改字段长度
    -加长
    -- mysql> alter table employees modify age bigint;
    
    -- clickhouse :) desc employees;
    ┌─name───────┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
    │ emp_no     │ Int32            │              │                    │         │                  │                │
    │ birth_date │ Date             │              │                    │         │                  │                │
    │ first_name │ String           │              │                    │         │                  │                │
    │ last_name  │ String           │              │                    │         │                  │                │
    │ gender     │ String           │              │                    │         │                  │                │
    │ age        │ Nullable(Int64)  │              │                    │         │                  │                │
    │ address    │ Nullable(String) │              │                    │         │                  │                │
    │ hire_date  │ Date             │              │                    │         │                  │                │
    │ _sign      │ Int8             │ MATERIALIZED │ 1                  │         │                  │                │
    │ _version   │ UInt64           │ MATERIALIZED │ 1                  │         │                  │                │
    └────────────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
    
    -改短
    -- mysql> alter table employees modify age int;
    
    -- clickhouse :) desc employees;
    ┌─name───────┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
    │ emp_no     │ Int32            │              │                    │         │                  │                │
    │ birth_date │ Date             │              │                    │         │                  │                │
    │ first_name │ String           │              │                    │         │                  │                │
    │ last_name  │ String           │              │                    │         │                  │                │
    │ gender     │ String           │              │                    │         │                  │                │
    │ age        │ Nullable(Int32)  │              │                    │         │                  │                │
    │ address    │ Nullable(String) │              │                    │         │                  │                │
    │ hire_date  │ Date             │              │                    │         │                  │                │
    │ _sign      │ Int8             │ MATERIALIZED │ 1                  │         │                  │                │
    │ _version   │ UInt64           │ MATERIALIZED │ 1                  │         │                  │                │
    └────────────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
    
    修改字段名
    -- ClickHouse 不支持,同步报错
    
    修改字段备注
    -- ClickHouse 不会同步
    
    清空表
    -- mysql> truncate table employees;
    Query OK, 0 rows affected (0.02 sec)
    
    -- ClickHouse:) select * from mysql_2_ck.employees;
    0 rows in set. Elapsed: 0.002 sec. 
    
    重命名表
    -- ClickHouse 正常同步
    
    删除表
    -- ClickHouse 正常同步

    在测试中发现有以下几个情况会导致复制同步异常,可能不全,后续有情况会继续更新,目前发现的有:

    • 没有主键
    • 字段类型为:Enum、bit、time、json
    • 修改字段名

    出现同步异常之后,会导致正常的ClickHouse上的表也不能读取,修复则需要删除整个库,再重新同步。如果使用MaterializeMySQL同步MySQL,不允许以上导致同步异常的情况发生。

    因为MaterializeMySQL目前属于实验阶段,如果需要此功能,需要做好各种测试和验证。

    除了自带的MaterializeMySQL可以同步MySQL数据之外,还可以用 Bifrost 来进行同步,该同步工具可以避免MaterializeMySQL同步字段类型的问题,单也有一些限制。具体的可以看官方介绍,该工具支持支持全量,增量同步。

    总结

    本文介绍了几种ClickHouse的导入方法,以及MySQL同步到ClickHouse的方法,这种数据批量导入和同步极大的方便了迁移数据的成本。后期官方如果完善MaterializeMySQL,相信ClickHouse将会进一步提高在OLAP上的使用率。

    ~~~~~~~~~~~~~~~ 万物之中,希望至美 ~~~~~~~~~~~~~~~
  • 相关阅读:
    在字符串中查找指定字符(15)
    说反话 (20)
    鼠标经过显示问题
    Java数据库连接池-proxool
    mysql中MAX()函数和count()函数的技巧使用
    Java中多线程问题
    eclipse开发文档模板
    方法调用中的别名问题
    php类的定义
    通知浏览器下载文件,而不是直接打开下载
  • 原文地址:https://www.cnblogs.com/zhoujinyi/p/14972876.html
Copyright © 2020-2023  润新知