iT邦幫忙

2022 iThome 鐵人賽

DAY 17
0
Software Development

ClickHouse:時序資料庫建置與運行系列 第 17

day17-SQL使用與操作方法介紹(八)

  • 分享至 

  • xImage
  •  

前言

從前一章節中,我們了解了CREATEINSERT INTO語句用法,接下來要介紹ALTERSYSTEMSHOW等語句的用法。

ALTER語句

ALTER語句都是拿來修改作使用,我們可以修改某個資料表的欄位,相關的SQL範例語法使用如下:

ALTER TABLE [db].name [ON CLUSTER cluster] ADD|DROP|RENAME|CLEAR|COMMENT|{MODIFY|ALTER}|MATERIALIZE COLUMN ...

我們也可以透過ALTER語句來操作分區,相關操作分區的SQL範例語法使用如下:

ALTER TABLE table_name [ON CLUSTER cluster] DETACH PARTITION|PART partition_expr

上述用法的SQL語句範例如下:

ALTER TABLE mt DETACH PARTITION '2020-11-21';
ALTER TABLE mt DETACH PART 'all_2_2_0';

DETACH PARTITION|PART是將某個指定的分區或部分移到detached目錄並遺忘它。

DROP PARTITION|PART是將指定的分區或部分移除,相關的SQL語法範例如下:

ALTER TABLE table_name [ON CLUSTER cluster] DROP PARTITION|PART partition_expr

ATTACH PARTITION|PART是從detached目錄中的分區或部分移出來並新增到資料表,相關的SQL語法範例如下:

ALTER TABLE table_name [ON CLUSTER cluster] ATTACH PARTITION|PART partition_expr

ATTACH PARTITION FROM 是從某個指定的資料表複製資料分區並加入到另一個資料表中,相關的SQL語法範例如下:

ALTER TABLE table2 [ON CLUSTER cluster] ATTACH PARTITION partition_expr FROM table1

REPLACE PARTITION是從某個指定的資料表中的資料分區進行複製並加入到另一張資料表中,並將另一張資料表上原本的資料分區的資料進行取代,來源資料表分區中的資料不會被移除,相關的SQL語法範例如下:

ALTER TABLE table2 [ON CLUSTER cluster] REPLACE PARTITION partition_expr FROM table1

MOVE PARTITION TO TABLE是從某個指定的資料表中的資料分區移到另一張資料表,來源資料表中的資料分區資料會被移除,相關的SQL語法範例如下:

ALTER TABLE table_source [ON CLUSTER cluster] MOVE PARTITION partition_expr TO TABLE table_dest

CLEAR COLUMN IN PARTITION是指將指定的資料表中的分區的欄位中的值進行重置,相關的SQL語法範例如下:

ALTER TABLE table_name [ON CLUSTER cluster] CLEAR COLUMN column_name IN PARTITION partition_expr

FREEZE PARTITION是指將指定的資料表的某個指定的分區上建立一個本地端的備份,如果PARTITION之敘述式忽略的話,則會針對所有的資料分區進行備份,相關的SQL語法範例如下:

ALTER TABLE table_name [ON CLUSTER cluster] FREEZE [PARTITION partition_expr] [WITH NAME 'backup_name']

UNFREEZE PARTITION是指將指定的資料表中的指定分區是freezed的分區移除,如果PARTITION之敘述式忽略的話,則會針對所有的資料分區是freezed的備份都移除,相關的SQL語法範例如下:

ALTER TABLE table_name [ON CLUSTER cluster] UNFREEZE [PARTITION 'part_expr'] WITH NAME 'backup_name'

CLEAR INDEX IN PARTITION指的是將指定資料表中的分區內的索引都移除,相關的SQL語法範例如下:

ALTER TABLE table_name [ON CLUSTER cluster] CLEAR INDEX index_name IN PARTITION partition_expr

FETCH PARTITION|PART指的是從另外一個ClickHouse資料庫伺服器下載一個資料表的分區,這個查詢只能用在複製(replicated)資料表,相關的SQL範例語法如下:

ALTER TABLE table_name [ON CLUSTER cluster] FETCH PARTITION|PART partition_expr FROM 'path-in-zookeeper'

MOVE PARTITION|PART指的是將資料表中的分區或是部分內的資料班移到其他的儲存體或是硬碟,這個資料表之引擎必須是MergeTree,相關的SQL範例語法如下:

ALTER TABLE table_name [ON CLUSTER cluster] MOVE PARTITION|PART partition_expr TO DISK|VOLUME 'disk_name'

UPDATE IN PARTITION指的是將資料表中某個指定的資料分區內的資料進行條件篩選,並將篩選到的資料透過定義的敘述式進行資料的更新,相關的SQL範例語法如下:

ALTER TABLE [db.]table [ON CLUSTER cluster] UPDATE column1 = expr1 [, ...] [IN PARTITION partition_id] WHERE filter_expr

DELETE IN PARTITION指的是將資料表中某個資料分區內的資料進行條件篩選,並將篩選到的資料進行刪除,相關的SQL範例語法如下:

ALTER TABLE [db.]table [ON CLUSTER cluster] DELETE [IN PARTITION partition_id] WHERE filter_expr

我們也可以使用ALTER TABLE … DELETE之SQL語句將透過指定欄位符合篩選的條件的資料進行刪除,相關的SQL範例語法如下:

ALTER TABLE [db.]table [ON CLUSTER cluster] DELETE WHERE filter_expr

我們也可以使用ALTER TABLE … UPDATE Statements之SQL語句將透過指定欄位符合的篩選條件的資料進行更新,相關的SQL範例語法如下:

ALTER TABLE [db.]table [ON CLUSTER cluster] UPDATE column1 = expr1 [, ...] WHERE filter_expr

我們也可以透過ALTER TABLE的語句來修改指定資料表的排序鍵,相關的SQL範例語法如下:

ALTER TABLE [db].name [ON CLUSTER cluster] MODIFY ORDER BY new_expression

我們也可以透過下列的SQL語句來修改指定的資料表中的稀疏索引,相關的SQL範例語法如下:

  • ALTER TABLE [db].table_name [ON CLUSTER cluster] ADD INDEX name expression TYPE type GRANULARITY value [FIRST|AFTER name]
  • ALTER TABLE [db].table_name [ON CLUSTER cluster] DROP INDEX name
  • ALTER TABLE [db.]table_name [ON CLUSTER cluster] MATERIALIZE INDEX name [IN PARTITION partition_name]

我們也可以透過ALTER的語句來修改指定資料表中設定的檢查條件,相關的SQL範例語法如下:

ALTER TABLE [db].name [ON CLUSTER cluster] ADD CONSTRAINT constraint_name CHECK expression;
ALTER TABLE [db].name [ON CLUSTER cluster] DROP CONSTRAINT constraint_name;

我們也可以透過ALTER語句來修改指定資料表設定TTL的敘述式,TTL指的是可以指定欄位,當超過某個時間的欄位會變成過期的資料,會將過期的資料移到指定的硬碟、儲存空間或是資料分區,相關的SQL範例語句如下:

ALTER TABLE [db.]table_name [ON CLUSTER cluster] MODIFY TTL ttl_expression;

我們也可以移除已經指定的TTL,相關的SQL範例語法如下:

ALTER TABLE [db.]table_name [ON CLUSTER cluster] REMOVE TTL

以下是一個TTL資料表建立的範例,相關的SQL語句如下:

CREATE TABLE table_with_ttl
(
    event_time DateTime,
    UserID UInt64,
    Comment String
)
ENGINE MergeTree()
ORDER BY tuple()
TTL event_time + INTERVAL 3 MONTH
SETTINGS min_bytes_for_wide_part = 0;

INSERT INTO table_with_ttl VALUES (now(), 1, 'username1');

INSERT INTO table_with_ttl VALUES (now() - INTERVAL 4 MONTH, 2, 'username2');

上述SQL執行的輸出訊息如下:

ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) CREATE TABLE table_with_ttl
                                  (
                                      event_time DateTime,
                                      UserID UInt64,
                                      Comment String
                                  )
                                  ENGINE MergeTree()
                                  ORDER BY tuple()
                                  TTL event_time + INTERVAL 3 MONTH
                                  SETTINGS min_bytes_for_wide_part = 0;

CREATE TABLE table_with_ttl
(
    `event_time` DateTime,
    `UserID` UInt64,
    `Comment` String
)
ENGINE = MergeTree
ORDER BY tuple()
TTL event_time + toIntervalMonth(3)
SETTINGS min_bytes_for_wide_part = 0

Query id: bcbae801-c8fe-44f4-8078-3b3b312807cd

Ok.

0 rows in set. Elapsed: 0.012 sec.

ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) INSERT INTO table_with_ttl VALUES (now(), 1, 'username1');

INSERT INTO table_with_ttl FORMAT Values

Query id: 5fe1f8a0-3a95-4f53-bdd8-e0d526efe3b1

Ok.

1 row in set. Elapsed: 0.004 sec.

ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) INSERT INTO table_with_ttl VALUES (now() - INTERVAL 4 MONTH, 2, 'username2');

INSERT INTO table_with_ttl FORMAT Values

Query id: 8becafd5-26f3-42d7-b2d1-33622fc3f3b3

Ok.

1 row in set. Elapsed: 0.003 sec.

ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) SELECT * FROM table_with_ttl;

SELECT *
FROM table_with_ttl

Query id: a43568e6-8046-4a31-98bf-b851a12c2ff8

┌──────────event_time─┬─UserID─┬─Comment───┐
│ 2022-05-14 11:29:22 │      2 │ username2 │
└─────────────────────┴────────┴───────────┘
┌──────────event_time─┬─UserID─┬─Comment───┐
│ 2022-09-14 11:26:49 │      1 │ username1 │
└─────────────────────┴────────┴───────────┘

2 rows in set. Elapsed: 0.002 sec.

ubuntu-s-4vcpu-8gb-amd-sgp1-01 :)

接著執行下列的SQL將TTL機制強制執行,相關的SQL語句如下:

OPTIMIZE TABLE table_with_ttl FINAL;
SELECT * FROM table_with_ttl FORMAT PrettyCompact;

執行上述的SQL語句之後,相關輸出的訊息如下:

ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) OPTIMIZE TABLE table_with_ttl FINAL;

OPTIMIZE TABLE table_with_ttl FINAL

Query id: 09f7f933-8260-4fc6-9c83-4f968e8d7dd3

Ok.

0 rows in set. Elapsed: 0.002 sec.

ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) SELECT * FROM table_with_ttl FORMAT PrettyCompact;

SELECT *
FROM table_with_ttl
FORMAT PrettyCompact

Query id: cd366d3c-6ae9-4a36-bd1d-6c156fcf14a7

┌──────────event_time─┬─UserID─┬─Comment───┐
│ 2022-09-14 11:26:49 │      1 │ username1 │
└─────────────────────┴────────┴───────────┘

1 row in set. Elapsed: 0.003 sec.

ubuntu-s-4vcpu-8gb-amd-sgp1-01 :)

則我們從上述的輸出訊息可以知道,因為強制執行TTL機制,因此超過時間的那筆資料被移除到資料表。

接著使用下列的方式將TTL移除,執行SQL與輸出的訊息如下:

ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) ALTER TABLE table_with_ttl REMOVE TTL;

ALTER TABLE table_with_ttl
    REMOVE TTL

Query id: b4933ce8-733b-47fd-969f-1de9170c6706

Ok.

0 rows in set. Elapsed: 0.011 sec.

ubuntu-s-4vcpu-8gb-amd-sgp1-01 :)

移除掉TTL條件之後,接著再新增一筆同樣的資料,因為TTL已經移除了,所以使用OPTIMIZE的語句後該資料並不會被移除,相關執行SQL與輸出的訊息如下:

ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) INSERT INTO table_with_ttl VALUES (now() - INTERVAL 4 MONTH, 2, 'username2');

INSERT INTO table_with_ttl FORMAT Values

Query id: e3165cbf-2ca9-49a5-bc4a-d287aa5e90d6

Ok.

1 row in set. Elapsed: 0.003 sec.

ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) OPTIMIZE TABLE table_with_ttl FINAL;

OPTIMIZE TABLE table_with_ttl FINAL

Query id: 36e83ccb-5619-4e44-a314-2a8a1bf095f0

Ok.

0 rows in set. Elapsed: 0.003 sec.

ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) SELECT * FROM table_with_ttl FORMAT PrettyCompact;

SELECT *
FROM table_with_ttl
FORMAT PrettyCompact

Query id: 74618447-27f5-4422-93d1-2ec7b4727943

┌──────────event_time─┬─UserID─┬─Comment───┐
│ 2022-09-14 11:26:49 │      1 │ username1 │
│ 2022-05-14 11:33:59 │      2 │ username2 │
└─────────────────────┴────────┴───────────┘

2 rows in set. Elapsed: 0.003 sec.

ubuntu-s-4vcpu-8gb-amd-sgp1-01 :)

我們也可以透過ALTER語句來修改物化的視圖(Materialized view),相關的語法範例用法如下:

CREATE TABLE src_table (`a` UInt32) ENGINE = MergeTree ORDER BY a;
CREATE MATERIALIZED VIEW mv (`a` UInt32) ENGINE = MergeTree ORDER BY a AS SELECT a FROM src_table; 
INSERT INTO src_table (a) VALUES (1), (2);
SELECT * FROM mv;

除了使用ALTER語句來修改視圖與資料表等,也可以用來修改有關於使用者權限與存去控制的地方,相關的用法與範例如下:

可以使用ALTER USER語句來修改使用者帳號,相關的語法範例用法如下:

ALTER USER [IF EXISTS] name1 [ON CLUSTER cluster_name1] [RENAME TO new_name1]
        [, name2 [ON CLUSTER cluster_name2] [RENAME TO new_name2] ...]
    [NOT IDENTIFIED | IDENTIFIED {[WITH {no_password | plaintext_password | sha256_password | sha256_hash | double_sha1_password | double_sha1_hash}] BY {'password' | 'hash'}} | {WITH ldap SERVER 'server_name'} | {WITH kerberos [REALM 'realm']}]
    [[ADD | DROP] HOST {LOCAL | NAME 'name' | REGEXP 'name_regexp' | IP 'address' | LIKE 'pattern'} [,...] | ANY | NONE]
    [DEFAULT ROLE role [,...] | ALL | ALL EXCEPT role [,...] ]
    [GRANTEES {user | role | ANY | NONE} [,...] [EXCEPT {user | role} [,...]]]
    [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY | WRITABLE] | PROFILE 'profile_name'] [,...]

有關GRANTEES的從句,有關於此從句後面可以接的選項如下:

  • user — 指定一個使既有用者的權限讓被修改的使用者與既定的使用者有一樣的存取權限。
  • role — 指定一個既有權限規則讓被修改的使用者有這個存取權限。
  • ANY — 這是預設選項,讓使用者可以有最大權限,可以有任意的存取權限。
  • NONE — 使用者任何權限都沒有。

相關的SQL語句範例如下:

ALTER USER user DEFAULT ROLE role1, role2
ALTER USER user DEFAULT ROLE ALL
ALTER USER user DEFAULT ROLE ALL EXCEPT role1, role2
ALTER USER john GRANTEES jack;

修改存取規則的語法使用如下:

ALTER ROLE [IF EXISTS] name1 [ON CLUSTER cluster_name1] [RENAME TO new_name1]
        [, name2 [ON CLUSTER cluster_name2] [RENAME TO new_name2] ...]
    [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY|WRITABLE] | PROFILE 'profile_name'] [,...]

修改ClickHouse資料庫系統的設定限制,可以用下列的SQL語句使用範例如下:

ALTER QUOTA [IF EXISTS] name [ON CLUSTER cluster_name]
    [RENAME TO new_name]
    [KEYED BY {user_name | ip_address | client_key | client_key,user_name | client_key,ip_address} | NOT KEYED]
    [FOR [RANDOMIZED] INTERVAL number {second | minute | hour | day | week | month | quarter | year}
        {MAX { {queries | query_selects | query_inserts | errors | result_rows | result_bytes | read_rows | read_bytes | execution_time} = number } [,...] |
        NO LIMITS | TRACKING ONLY} [,...]]
    [TO {role [,...] | ALL | ALL EXCEPT role [,...]}]

相關的SQL語句範例如下:

ALTER QUOTA IF EXISTS qA FOR INTERVAL 15 month MAX queries = 123 TO CURRENT_USER;

上述的範例是15個月內某個使用者最多只能執行123個查詢的數量。

ALTER QUOTA IF EXISTS qB FOR INTERVAL 30 minute MAX execution_time = 0.5, FOR INTERVAL 5 quarter MAX queries = 321, errors = 10 TO default;

上述的範例指的是設定default使用者,將最大執行查詢語句時間限制在30分鐘內執行半秒,接著將最大查詢數限制在321次,將最大錯誤數限制在75分鐘內10次。

下面的語句是指修改資料政策,相關的語法用法如下:

ALTER [ROW] POLICY [IF EXISTS] name1 [ON CLUSTER cluster_name1] ON [database1.]table1 [RENAME TO new_name1]
        [, name2 [ON CLUSTER cluster_name2] ON [database2.]table2 [RENAME TO new_name2] ...]
    [AS {PERMISSIVE | RESTRICTIVE}]
    [FOR SELECT]
    [USING {condition | NONE}][,...]
    [TO {role [,...] | ALL | ALL EXCEPT role [,...]}]

下面的語句用法是修改設定,相關的語法用法如下:

ALTER SETTINGS PROFILE [IF EXISTS] TO name1 [ON CLUSTER cluster_name1] [RENAME TO new_name1]
        [, name2 [ON CLUSTER cluster_name2] [RENAME TO new_name2] ...]
    [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY|WRITABLE] | INHERIT 'profile_name'] [,...]

我們也可以用ALTER語句來修改資料表的註解,相關的語法用法如下:

ALTER TABLE [db].name [ON CLUSTER cluster] MODIFY COMMENT 'Comment'

使用的範例如下,假設在ClickHouse資料庫建立一個資料表,相關的建立資料表SQL語句如下:

CREATE TABLE table_with_comment
(
    `k` UInt64,
    `s` String
)
ENGINE = Memory()
COMMENT 'The temporary table';

在ClickHouse客戶端執行上述的SQL語句的輸出訊息如下:

ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) CREATE TABLE table_with_comment
                                  (
                                      `k` UInt64,
                                      `s` String
                                  )
                                  ENGINE = Memory()
                                  COMMENT 'The temporary table';

CREATE TABLE table_with_comment
(
    `k` UInt64,
    `s` String
)
ENGINE = Memory
COMMENT 'The temporary table'

Query id: 00ef8642-1543-4929-a61c-7121f66f16f1

Ok.

0 rows in set. Elapsed: 0.004 sec.

ubuntu-s-4vcpu-8gb-amd-sgp1-01 :)

接著修改上述的資料表註解,相關的SQL語句如下:

ALTER TABLE table_with_comment MODIFY COMMENT 'new comment on a table';
SELECT comment FROM system.tables WHERE database = currentDatabase() AND name = 'table_with_comment';

在ClickHouse客戶端執行相關的SQL語句執行以及輸出的訊息如下:

ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) ALTER TABLE table_with_comment MODIFY COMMENT 'new comment on a table';

ALTER TABLE table_with_comment
    MODIFY COMMENT 'new comment on a table'

Query id: 06a9b1f3-1234-4eff-8504-c32d76fe6791

Ok.

0 rows in set. Elapsed: 0.004 sec.

ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) SELECT comment FROM system.tables WHERE database = currentDatabase() AND name = 'table_with_comment';

SELECT comment
FROM system.tables
WHERE (database = currentDatabase()) AND (name = 'table_with_comment')

Query id: d8e321bd-0471-4de0-b5a9-bf3d1ae14916

┌─comment────────────────┐
│ new comment on a table │
└────────────────────────┘

1 row in set. Elapsed: 0.008 sec.

ubuntu-s-4vcpu-8gb-amd-sgp1-01 :)

接著,我們可以移除上述修改的註解,相關的SQL語句如下:

ALTER TABLE table_with_comment MODIFY COMMENT '';
SELECT comment FROM system.tables WHERE database = currentDatabase() AND name = 'table_with_comment';

在資料庫客戶端執行上述的SQL語句與輸出的訊息如下:

ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) ALTER TABLE table_with_comment MODIFY COMMENT '';

ALTER TABLE table_with_comment
    MODIFY COMMENT ''

Query id: f1a15edd-34e3-45fd-86ac-59abaa343468

Ok.

0 rows in set. Elapsed: 0.004 sec.

ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) SELECT comment FROM system.tables WHERE database = currentDatabase() AND name = 'table_with_comment';

SELECT comment
FROM system.tables
WHERE (database = currentDatabase()) AND (name = 'table_with_comment')

Query id: efbdb01c-8de3-4c2c-b62c-5cddcbf816cc

┌─comment─┐
│         │
└─────────┘

1 row in set. Elapsed: 0.003 sec.

ubuntu-s-4vcpu-8gb-amd-sgp1-01 :)

從上述的執行SQL語句可以知道,currentDatabase是ClickHouse資料庫內建的函數,可以用來找到當前的資料庫是哪一個。

SYSTEM語句

SYSTEM語句主要是有兩個方式,第一個層面是在SQL語句中當作執行的語句來用,另一個指的是當作系統預設的資料表使用,執行的語句都與資料庫系統有關的,以下列幾種使用的方式:

  • 我們可以使用下列的語法將DICTIONARY進行重新載入,相關的語法如下:
SELECT name, status FROM system.dictionaries;
  • 我們可以使用下列的方式將MODELS重新載入,相關的語法如下:
SYSTEM RELOAD MODELS [ON CLUSTER cluster_name]
  • 我們可以使用下列的方式將MODELS重新載入,相關的語法如下:
SYSTEM RELOAD MODEL [ON CLUSTER cluster_name] <model_path>
  • 我們可以將使用者定義的函式進重新載入,相關的語法如下:
RELOAD FUNCTIONS [ON CLUSTER cluster_name]
RELOAD FUNCTION [ON CLUSTER cluster_name] function_name
  • 我們可以使用下列的語法將死掉的資料複製資料庫(data repliaca)進行移除,相關的語法如下:
SYSTEM DROP REPLICA 'replica_name' FROM TABLE database.table;
SYSTEM DROP REPLICA 'replica_name' FROM DATABASE database;
SYSTEM DROP REPLICA 'replica_name';
SYSTEM DROP REPLICA 'replica_name' FROM ZKPATH '/path/to/table/in/zk';

SYSTEM語句也可以管理背景程序的MergeTreeTables的資料表引擎,相關的語法與用法如下:

我們可以使用下列的語句將背景的MERGES程序進行停止,相關的語句用法如下:

SYSTEM STOP MERGES [ON VOLUME <volume_name> | [db.]merge_tree_family_table_name]

也可以將背景的MERGES程序進行啟動,相關的語句用法如下:

SYSTEM START MERGES [ON VOLUME <volume_name> | [db.]merge_tree_family_table_name]

也可以將背景程序的TTL MERGES停止,相關的語句用法如下:

SYSTEM STOP TTL MERGES [[db.]merge_tree_family_table_name]

也可以將背景程序的TTL MERGES啟動,相關的語句用法如下:

SYSTEM START TTL MERGES [[db.]merge_tree_family_table_name]

也可以停止有關於TTL敘述式語句的TO VOLUME或TO DISK從句動作之背景程序,相關的語句用法如下:

SYSTEM STOP MOVES [[db.]merge_tree_family_table_name]

也可以啟動關於TTL敘述式的TO VOLUME或TO DISK從句動作之背景程序,相關的語句用法如下:

SYSTEM START MOVES [[db.]merge_tree_family_table_name]

清除凍起來的(freezed)備份,相關的語句與用法如下:

SYSTEM UNFREEZE WITH NAME <backup_name>START FETCHES

我們也可以透過SYSTEM語句管理ReplicatedMergeTree資料表引擎,相關的語句與用法如下:

-- STOP FETCHES
SYSTEM STOP FETCHES [[db.]replicated_merge_tree_family_table_name]

-- START FETCHES
SYSTEM START FETCHES [[db.]replicated_merge_tree_family_table_name]

-- STOP REPLICATED SENDS
SYSTEM STOP REPLICATED SENDS [[db.]replicated_merge_tree_family_table_name]

-- START REPLICATED SENDS
SYSTEM START REPLICATED SENDS [[db.]replicated_merge_tree_family_table_name]

-- STOP REPLICATION QUEUES
SYSTEM STOP REPLICATION QUEUES [[db.]replicated_merge_tree_family_table_name]

-- START REPLICATION QUEUES
SYSTEM START REPLICATION QUEUES [[db.]replicated_merge_tree_family_table_name]

-- SYNC REPLICA
SYSTEM SYNC REPLICA [db.]replicated_merge_tree_family_table_name

-- RESTART REPLICA
SYSTEM RESTART REPLICA [db.]replicated_merge_tree_family_table_name

-- RESTORE REPLICA
SYSTEM RESTORE REPLICA [db.]replicated_merge_tree_family_table_name [ON CLUSTER cluster_name]
SYSTEM RESTORE REPLICA [ON CLUSTER cluster_name] [db.]replicated_merge_tree_family_table_name

-- DROP FILESYSTEM CACHE
SYSTEM DROP FILESYSTEM CACHE

SHOW語句

SHOW語句可以讓我們查看指定的資料表、資料庫、使用者與使用者權限清單等,相關的語句與用法如下:

我們可以使用下列的語句看指定的資料表的欄位綱要,相關的語法使用如下:

SHOW CREATE [TEMPORARY] [TABLE|DICTIONARY|VIEW] [db.]table|view [INTO OUTFILE filename] [FORMAT format]

我們可以使用下列的語句看ClickHouse資料庫系統裡面所有的資料庫清單,相關的語法使用如下:

SHOW DATABASES [LIKE | ILIKE | NOT LIKE '<pattern>'] [LIMIT <N>] [INTO OUTFILE filename] [FORMAT format]

同時上述的語法也可以等價於下列的SQL語法:

SELECT name FROM system.databases [WHERE name LIKE | ILIKE | NOT LIKE '<pattern>'] [LIMIT <N>] [INTO OUTFILE filename] [FORMAT format]

下面是有關於列出資料庫清單的範例,可以搭配LIKE從句將含有指定關鍵字的資料庫名稱篩選出來,相關的範例如下:

SHOW DATABASES LIKE '%de%';
SHOW DATABASES ILIKE '%DE%';
SHOW DATABASES NOT LIKE '%de%';
SHOW DATABASES LIMIT 2;

由上到下的語句的解釋分別如下:

  1. 列出資料庫清單中有關於「de」的關鍵字的資料庫名稱。
  2. 列出資料庫清單中有關於「DE」的關鍵字的資料庫名稱,而「ILIKE」是大小寫都可以,因此「d」與「e」的字也會考慮進去。
  3. 列出資料庫清單中沒有「de」的關鍵字的資料庫名稱。
  4. 列出資料庫清單中的前兩筆資料庫名稱出來。

我們可以利用下列的語句將system.processes的資料表內容顯示出來,相關的語句如下:

SHOW PROCESSLIST [INTO OUTFILE filename] [FORMAT format]

也可以利用watch指令每間隔1秒去執行上述的SQL語句達到監控,相關的指令如下:

watch -n1 "clickhouse-client --query='SHOW PROCESSLIST'"

我們也可以使用下列的語法將指定的資料庫中的資料表列出清單,相關的語法使用如下:

SHOW [TEMPORARY] TABLES [{FROM | IN} <db>] [LIKE | ILIKE | NOT LIKE '<pattern>'] [LIMIT <N>] [INTO OUTFILE <filename>] [FORMAT <format>]

語法範例如下:

SELECT name FROM system.tables [WHERE name LIKE | ILIKE | NOT LIKE '<pattern>'] [LIMIT <N>] [INTO OUTFILE <filename>] [FORMAT <format>]

我們可以參考下列的範例:

SHOW TABLES FROM system LIKE '%user%'

從上述的範例可以知道,我們可以搭配LIKE從句找到在system資料庫中有user關鍵字的資料表。

如果要讓指定的關鍵字沒有大小寫敏感性的話,則可以搭配ILIKE從句使用,相關的語法如下:

SHOW TABLES FROM system ILIKE '%USER%'`

我們也可以使用NOT LIKE從句來列出system資料庫沒有含指定關鍵字的資料表,相關的語法範例如下:

SHOW TABLES FROM system NOT LIKE '%s%'

我們也可以搭配LIMIT從句將指定的資料庫中,列出前兩筆的資料表出來,相關的語法範例如下:

SHOW TABLES FROM system LIMIT 2

我們也可以使用下列語法來列出指定的使用者所擁有的權限,相關的語法如下:

SHOW GRANTS [FOR user1 [, user2 ...]]

我們可以使用下列的語法來列出指定使用者在建立時候所執行的語法,相關的語法如下:

SHOW CREATE USER [name1 [, name2 ...] | CURRENT_USER]

我們也可以使用下列的語法列出指定的使用者在建立角色的,相關的語法如下:

SHOW CREATE ROLE name1 [, name2 ...]

我們也可以使用下列的語法指定在建立行的時候的政策,相關的語法如下:

SHOW CREATE [ROW] POLICY name ON [database1.]table1 [, [database2.]table2 ...]

我們也可以使用下列的語法指定在建立配額時候所執行的語法,相關的語法如下:

SHOW CREATE QUOTA [name1 [, name2 ...] | CURRENT]

我們也可以使用下列的語法列出在建立設定檔所執行的語法,相關的語法如下:

SHOW CREATE [SETTINGS] PROFILE name1 [, name2 ...]

我們可以使用下列的語法將CLickHouse資料庫上列出使用者的清單,相關的語法如下:

SHOW USERS

我們可以使用下列的語法將所有角色列出,相關的語法如下:

SHOW [CURRENT|ENABLED] ROLES

其他列出設定、行的政策設定、配額設定等清單的用法如下:

SHOW [SETTINGS] PROFILES
SHOW [ROW] POLICIES [ON [db.]table]
SHOW QUOTAS
SHOW [CURRENT] QUOTA

-- 列出所有的使用者、角色、政策與權限的清單
SHOW ACCESS

列出叢集的語法範例如下:

SHOW CLUSTER '<name>'
SHOW CLUSTERS [LIKE|NOT LIKE '<pattern>'] [LIMIT <N>]

執行上述的語法範例如下:

ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) show clusters;

SHOW CLUSTERS

Query id: 5624e565-1ca6-469d-b27c-90ed58e37e0a

┌─cluster─────────────────────────────────────────┐
│ test_cluster_one_shard_three_replicas_localhost │
│ test_cluster_two_shards                         │
│ test_cluster_two_shards_internal_replication    │
│ test_cluster_two_shards_localhost               │
│ test_shard_localhost                            │
│ test_shard_localhost_secure                     │
│ test_unavailable_shard                          │
└─────────────────────────────────────────────────┘

7 rows in set. Elapsed: 0.002 sec.

ubuntu-s-4vcpu-8gb-amd-sgp1-01 :)
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) SHOW CLUSTERS LIKE 'test%' LIMIT 1;

SHOW CLUSTERS LIKE 'test%' LIMIT 1

Query id: 5b9ad776-e88c-4c65-98eb-ab70e0b841a8

┌─cluster─────────────────────────────────────────┐
│ test_cluster_one_shard_three_replicas_localhost │
└─────────────────────────────────────────────────┘

1 row in set. Elapsed: 0.002 sec.

ubuntu-s-4vcpu-8gb-amd-sgp1-01 :)
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) SHOW CLUSTER 'test_shard_localhost' FORMAT Vertical;

SHOW CLUSTER test_shard_localhost
FORMAT Vertical

Query id: cf69197d-7de5-46ac-a86a-4ce82c9eac9c

Row 1:
──────
cluster:                 test_shard_localhost
shard_num:               1
shard_weight:            1
replica_num:             1
host_name:               localhost
host_address:            ::1
port:                    9000
is_local:                1
user:                    default
default_database:
errors_count:            0
slowdowns_count:         0
estimated_recovery_time: 0

1 row in set. Elapsed: 0.002 sec.

ubuntu-s-4vcpu-8gb-amd-sgp1-01 :)

我們也可以使用下列的語法將資料庫的設定列出來,相關的語法範例如下:

SHOW [CHANGED] SETTINGS LIKE|ILIKE <name>

相關的執行上述的語法範例如下:

ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) SHOW SETTINGS LIKE 'send_timeout';

SHOW SETTINGS LIKE 'send_timeout'

Query id: 4828e142-cacd-4ac1-81e0-1afb1f13c94a

┌─name─────────┬─type────┬─value─┐
│ send_timeout │ Seconds │ 300   │
└──────────────┴─────────┴───────┘

1 row in set. Elapsed: 0.002 sec.

ubuntu-s-4vcpu-8gb-amd-sgp1-01 :)
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) SHOW SETTINGS ILIKE '%CONNECT_timeout%'

SHOW SETTINGS ILIKE '%CONNECT_timeout%'

Query id: 7e18b236-5ecf-4b43-82fa-86ec834332b8

┌─name────────────────────────────────────┬─type─────────┬─value─┐
│ connect_timeout                         │ Seconds      │ 10    │
│ connect_timeout_with_failover_ms        │ Milliseconds │ 50    │
│ connect_timeout_with_failover_secure_ms │ Milliseconds │ 100   │
│ external_storage_connect_timeout_sec    │ UInt64       │ 10    │
└─────────────────────────────────────────┴──────────────┴───────┘

4 rows in set. Elapsed: 0.003 sec.

ubuntu-s-4vcpu-8gb-amd-sgp1-01 :)
ubuntu-s-4vcpu-8gb-amd-sgp1-01 :) SHOW CHANGED SETTINGS ILIKE '%MEMORY%'

SHOW CHANGED SETTINGS ILIKE '%MEMORY%'

Query id: f06ac7fa-57ad-4cf6-a812-c5bc2269ed51

Ok.

0 rows in set. Elapsed: 0.002 sec.

結論

從本章節中,我們了解了ALTERSYSTEMSHOW等語句的用法,在下一章節中,我們會介紹GRANT、REVOKE與ATTACH等語句的用法。

參考資料


上一篇
day16-SQL使用與操作方法介紹(七)
下一篇
day18-SQL使用與操作方法介紹(九)
系列文
ClickHouse:時序資料庫建置與運行30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言