ATTACH 语句
附加表或字典,例如,当将数据库移动到另一台服务器时。
语法
ATTACH TABLE|DICTIONARY|DATABASE [IF NOT EXISTS] [db.]name [ON CLUSTER cluster] ...
该查询不会在磁盘上创建数据,而是假定数据已在适当的位置,并且仅将有关指定表、字典或数据库的信息添加到服务器。执行 ATTACH
查询后,服务器将知道表、字典或数据库的存在。
如果表先前已分离 (DETACH 查询),这意味着其结构是已知的,则可以使用简写形式,而无需定义结构。
附加现有表
语法
ATTACH TABLE [IF NOT EXISTS] [db.]name [ON CLUSTER cluster]
此查询在启动服务器时使用。服务器将表元数据存储为带有 ATTACH
查询的文件,服务器在启动时简单地运行这些查询 (除了服务器上显式创建的一些系统表)。
如果表已永久分离,则在服务器启动时不会重新附加,因此您需要显式使用 ATTACH
查询。
创建新表并附加数据
使用指定的表数据路径
该查询使用提供的结构创建一个新表,并将表数据从 user_files
中提供的目录附加。
语法
ATTACH TABLE name FROM 'path/to/data/' (col1 Type1, ...)
示例
查询
DROP TABLE IF EXISTS test;
INSERT INTO TABLE FUNCTION file('01188_attach/test/data.TSV', 'TSV', 's String, n UInt8') VALUES ('test', 42);
ATTACH TABLE test FROM '01188_attach/test' (s String, n UInt8) ENGINE = File(TSV);
SELECT * FROM test;
结果
┌─s────┬──n─┐
│ test │ 42 │
└──────┴────┘
使用指定的表 UUID
此查询使用提供的结构创建一个新表,并从具有指定 UUID 的表附加数据。 Atomic 数据库引擎支持它。
语法
ATTACH TABLE name UUID '<uuid>' (col1 Type1, ...)
将 MergeTree 表附加为 ReplicatedMergeTree
允许将非复制的 MergeTree 表附加为 ReplicatedMergeTree。 ReplicatedMergeTree 表将使用 default_replica_path
和 default_replica_name
设置的值创建。也可以将复制表附加为常规 MergeTree。
请注意,此查询中表在 ZooKeeper 中的数据不受影响。这意味着您必须在使用 SYSTEM RESTORE REPLICA
在 ZooKeeper 中添加元数据,或在使用 attach 后使用 SYSTEM DROP REPLICA ... FROM ZKPATH ...
清除它。
如果您尝试向现有 ReplicatedMergeTree 表添加副本,请记住,转换后的 MergeTree 表中的所有本地数据都将被分离。
语法
ATTACH TABLE [db.]name AS [NOT] REPLICATED
将表转换为复制表
DETACH TABLE test;
ATTACH TABLE test AS REPLICATED;
SYSTEM RESTORE REPLICA test;
将表转换为非复制表
获取表的 ZooKeeper 路径和副本名称
SELECT replica_name, zookeeper_path FROM system.replicas WHERE table='test';
结果
┌─replica_name─┬─zookeeper_path─────────────────────────────────────────────┐
│ r1 │ /clickhouse/tables/401e6a1f-9bf2-41a3-a900-abb7e94dff98/s1 │
└──────────────┴────────────────────────────────────────────────────────────┘
将表附加为非复制表,并从 ZooKeeper 中删除副本的数据
DETACH TABLE test;
ATTACH TABLE test AS NOT REPLICATED;
SYSTEM DROP REPLICA 'r1' FROM ZKPATH '/clickhouse/tables/401e6a1f-9bf2-41a3-a900-abb7e94dff98/s1';
附加现有字典
附加先前分离的字典。
语法
ATTACH DICTIONARY [IF NOT EXISTS] [db.]name [ON CLUSTER cluster]
附加现有数据库
附加先前分离的数据库。
语法
ATTACH DATABASE [IF NOT EXISTS] name [ENGINE=<database engine>] [ON CLUSTER cluster]