MySQL表引擎可以與MySQL數據庫中的數據表簡歷映射,並通過SQL向其發起遠程查詢。
MySQL表引擎可以與物化視圖結合,來同步更新MySQL數據庫中的數據。
語法:
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']);
解釋:
host:port MySQL服務器的地址和端口
database MySQL中的數據庫名
table 表示需要映射的MySQL表名稱
user mysql的用戶名
password mysql的用戶名對應的密碼
replace_query 默認爲0,對應於MySQL的REPLACE INTO 語法;若爲1則會用replace into 代替insert into
on_duplicate_clause 默認爲0 對應MySQL的 ON DUPLICATE KEY語法,若需要使用該設置則必須將replace——query 設置爲0.
示例:
-- 1. 在MySQL中創建表定義和加入數據:
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.20 |
+-----------+
1 row in set (0.01 sec)
mysql> show create table t_org\G
*************************** 1. row ***************************
Table: t_org
Create Table: CREATE TABLE `t_org` (
`ID` int NOT NULL AUTO_INCREMENT,
`org_code` varchar(8) DEFAULT NULL,
`org_name` varchar(32) DEFAULT NULL,
`lastmodifytime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
插入數據:
insert into t_org(org_code,org_name)values('A01','研發部'),('A02','產品部'),('A03','測試部'),('A04','數據部'),('A05','運維部');
2.在clickhouse中對MySQL表引擎建立映射:
Clickhouse> create table t_org(ID UInt32,org_code String,org_name String,LASTMODIFYTIME Datetime)ENGINE=MySQL('192.168.8.110:3306','datasets','t_org','root','oracle');
CREATE TABLE t_org
(
`ID` UInt32,
`org_code` String,
`org_name` String,
`LASTMODIFYTIME` Datetime
)
ENGINE = MySQL('192.168.8.110:3306', 'datasets', 't_org', 'root', 'oracle')
Ok.
0 rows in set. Elapsed: 0.002 sec.
注意:
1.MySQL 中的Decimal(p,s) 類型在Clickhouse中的定義的差異
2.clickhouse的數據庫引擎 ENGINE = MySQL 這裏的MySQL必須要是MySQL
否則報錯信息:
Received exception from server (version 20.4.5):
Code: 56. DB::Exception: Received from localhost:9000. DB::Exception: Unknown table engine Mysql. Maybe you meant: ['MySQL'].
查看錶的定義:
Clickhouse> desc t_org;
DESCRIBE TABLE t_org
┌─name───────────┬─type─────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ ID │ UInt32 │ │ │ │ │ │
│ org_code │ String │ │ │ │ │ │
│ org_name │ String │ │ │ │ │ │
│ LASTMODIFYTIME │ DateTime │ │ │ │ │ │
└────────────────┴──────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
4 rows in set. Elapsed: 0.002 sec.
-- 查詢clickhouse的定義:
Clickhouse> select * from t_org;
SELECT *
FROM t_org
┌─ID─┬─org_code─┬─org_name─┬──────LASTMODIFYTIME─┐
│ 1 │ A01 │ 研發部 │ 2020-07-06 15:13:46 │
│ 2 │ A02 │ 產品部 │ 2020-07-06 15:13:46 │
│ 3 │ A03 │ 測試部 │ 2020-07-06 15:13:46 │
│ 4 │ A04 │ 數據部 │ 2020-07-06 15:13:46 │
│ 5 │ A05 │ 運維部 │ 2020-07-06 15:13:46 │
└────┴──────────┴──────────┴─────────────────────┘
5 rows in set. Elapsed: 0.007 sec.
在MySQL 中插入新的數據:
insert into t_org(org_code,org_name)values('A06','銷售部'),('A07','人力部');
在clickhouse中查詢:
Clickhouse> select * from t_org;
SELECT *
FROM t_org
┌─ID─┬─org_code─┬─org_name─┬──────LASTMODIFYTIME─┐
│ 1 │ A01 │ 研發部 │ 2020-07-06 15:13:46 │
│ 2 │ A02 │ 產品部 │ 2020-07-06 15:13:46 │
│ 3 │ A03 │ 測試部 │ 2020-07-06 15:13:46 │
│ 4 │ A04 │ 數據部 │ 2020-07-06 15:13:46 │
│ 5 │ A05 │ 運維部 │ 2020-07-06 15:13:46 │
│ 6 │ A06 │ 銷售部 │ 2020-07-06 15:22:28 │
│ 7 │ A07 │ 人力部 │ 2020-07-06 15:22:28 │
└────┴──────────┴──────────┴─────────────────────┘
7 rows in set. Elapsed: 0.005 sec.
數據已經和MySQL中的數據一樣。
在MySQL中更新數據:
mysql> update t_org set org_name='財務部' where org_code='A07';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from t_org;
+----+----------+-----------+---------------------+
| ID | org_code | org_name | lastmodifytime |
+----+----------+-----------+---------------------+
| 1 | A01 | 研發部 | 2020-07-06 15:13:46 |
| 2 | A02 | 產品部 | 2020-07-06 15:13:46 |
| 3 | A03 | 測試部 | 2020-07-06 15:13:46 |
| 4 | A04 | 數據部 | 2020-07-06 15:13:46 |
| 5 | A05 | 運維部 | 2020-07-06 15:13:46 |
| 6 | A06 | 銷售部 | 2020-07-06 15:22:28 |
| 7 | A07 | 財務部 | 2020-07-06 15:24:10 |
+----+----------+-----------+---------------------+
7 rows in set (0.00 sec)
在Clickhouse中查詢:
Clickhouse> select * from t_org;
SELECT *
FROM t_org
┌─ID─┬─org_code─┬─org_name─┬──────LASTMODIFYTIME─┐
│ 1 │ A01 │ 研發部 │ 2020-07-06 15:13:46 │
│ 2 │ A02 │ 產品部 │ 2020-07-06 15:13:46 │
│ 3 │ A03 │ 測試部 │ 2020-07-06 15:13:46 │
│ 4 │ A04 │ 數據部 │ 2020-07-06 15:13:46 │
│ 5 │ A05 │ 運維部 │ 2020-07-06 15:13:46 │
│ 6 │ A06 │ 銷售部 │ 2020-07-06 15:22:28 │
│ 7 │ A07 │ 財務部 │ 2020-07-06 15:24:10 │
└────┴──────────┴──────────┴─────────────────────┘
7 rows in set. Elapsed: 0.003 sec.
通過clickhouse查詢遠程的數據 可以看到數據一樣發生了變化。
---delete 操作:
mysql> delete from t_org where org_code='A07';
Query OK, 1 row affected (0.00 sec)
mysql> select * from t_org where org_code='A07';
Empty set (0.00 sec)
Clickhouse> select * from t_org;
SELECT *
FROM t_org
┌─ID─┬─org_code─┬─org_name─┬──────LASTMODIFYTIME─┐
│ 1 │ A01 │ 研發部 │ 2020-07-06 15:13:46 │
│ 2 │ A02 │ 產品部 │ 2020-07-06 15:13:46 │
│ 3 │ A03 │ 測試部 │ 2020-07-06 15:13:46 │
│ 4 │ A04 │ 數據部 │ 2020-07-06 15:13:46 │
│ 5 │ A05 │ 運維部 │ 2020-07-06 15:13:46 │
│ 6 │ A06 │ 銷售部 │ 2020-07-06 15:22:28 │
└────┴──────────┴──────────┴─────────────────────┘
6 rows in set. Elapsed: 0.004 sec.
--- 使用霧化視圖:
Clickhouse> create materialized view mv_t_org engine=MergeTree() order by ID as select * from t_org;
CREATE MATERIALIZED VIEW mv_t_org
ENGINE = MergeTree()
ORDER BY ID AS
SELECT *
FROM t_org
Ok.
0 rows in set. Elapsed: 0.004 sec.
結論:
截止20.4.4.+ 版本已經支持MySQL表引擎的INSERT,UPDATE,DELETE操作。
MySQL函數:
可以使用MySQL 表函數:
Clickhouse> create table t_org_new (ID UInt32,org_code String,org_name String,LASTMODIFYTIME Datetime)ENGINE=MySQL('192.168.8.110:3306','datasets','t_org','root','oracle');
CREATE TABLE t_org_new
(
`ID` UInt32,
`org_code` String,
`org_name` String,
`LASTMODIFYTIME` Datetime
)
ENGINE = MySQL('192.168.8.110:3306', 'datasets', 't_org', 'root', 'oracle')
Ok.
0 rows in set. Elapsed: 0.003 sec.
DESCRIBE TABLE t_org_new
┌─name───────────┬─type─────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ ID │ UInt32 │ │ │ │ │ │
│ org_code │ String │ │ │ │ │ │
│ org_name │ String │ │ │ │ │ │
│ LASTMODIFYTIME │ DateTime │ │ │ │ │ │
└────────────────┴──────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
4 rows in set. Elapsed: 0.002 sec.
Clickhouse> select * from t_org_new;
SELECT *
FROM t_org_new
┌─ID─┬─org_code─┬─org_name─┬──────LASTMODIFYTIME─┐
│ 1 │ A01 │ 研發部 │ 2020-07-06 15:13:46 │
│ 2 │ A02 │ 產品部 │ 2020-07-06 15:13:46 │
│ 3 │ A03 │ 測試部 │ 2020-07-06 15:13:46 │
│ 4 │ A04 │ 數據部 │ 2020-07-06 15:13:46 │
│ 5 │ A05 │ 運維部 │ 2020-07-06 15:13:46 │
│ 6 │ A06 │ 銷售部 │ 2020-07-06 15:22:28 │
│ 8 │ A10 │ 法務部 │ 2020-07-06 15:34:09 │
│ 9 │ A11 │ 設計部 │ 2020-07-06 15:34:09 │
└────┴──────────┴──────────┴─────────────────────┘
8 rows in set. Elapsed: 0.008 sec.
這種表函數的方式只能獲取截止當個時刻的表數據。不能獲得update和delete和新insert的數據。
參考:
https://clickhouse.tech/docs/en/engines/table-engines/integrations/mysql/