> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-fix-nav-issues.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> `Atomic` 引擎支持非阻塞的 `DROP TABLE` 和 `RENAME TABLE` 查询，以及原子性的 `EXCHANGE TABLES` 查询。开源 ClickHouse 默认使用 `Atomic` 数据库引擎。

# Atomic

`Atomic` 引擎支持非阻塞的 [`DROP TABLE`](#drop-detach-table) 和 [`RENAME TABLE`](#rename-table) 查询，以及原子性的 [`EXCHANGE TABLES`](#exchange-tables) 查询。开源 ClickHouse 默认使用 `Atomic` 数据库引擎。

<Note>
  在 ClickHouse Cloud 中，默认使用的是 [`Shared` 数据库引擎](/zh/products/cloud/features/infrastructure/shared-catalog#shared-database-engine)，它也支持上述操作。
</Note>

<div id="creating-a-database">
  ## 创建数据库
</div>

```sql theme={null}
CREATE DATABASE test [ENGINE = Atomic] [SETTINGS disk=...];
```

<div id="specifics-and-recommendations">
  ## 具体事项和建议
</div>

<div id="table-uuid">
  ### 表 UUID
</div>

`Atomic` 数据库中的每个表都有一个持久的 [UUID](/zh/reference/data-types/uuid)，其数据存储在以下目录中：

```text theme={null}
/clickhouse_path/store/xxx/xxxyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy/
```

其中，`xxxyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy` 是该表的 UUID。

默认情况下，UUID 会自动生成。不过，用户也可以在创建表时明确指定 UUID，但不建议这样做。

例如：

```sql theme={null}
CREATE TABLE name UUID '28f1c61c-2970-457a-bffe-454156ddcfef' (n UInt64) ENGINE = ...;
```

<Note>
  你可以使用 [show\_table\_uuid\_in\_table\_create\_query\_if\_not\_nil](/zh/reference/settings/session-settings#show_table_uuid_in_table_create_query_if_not_nil) 设置，以便在 `SHOW CREATE` 查询中显示 UUID。
</Note>

<div id="rename-table">
  ### RENAME TABLE
</div>

[`RENAME`](/zh/reference/statements/rename) 查询不会修改 UUID，也不会移动表中的数据。这些查询会立即执行，不会等待其他正在使用该表的查询结束。

<div id="drop-detach-table">
  ### DROP/DETACH TABLE
</div>

使用 `DROP TABLE` 时，不会删除任何数据。`Atomic` 引擎只是将该表的元数据移动到 `/clickhouse_path/metadata_dropped/`，以此将其标记为已删除，并通知后台线程。最终删除表数据前的延迟由 [`database_atomic_delay_before_drop_table_sec`](/zh/reference/settings/server-settings/settings#database_atomic_delay_before_drop_table_sec) 设置指定。
您可以使用 `SYNC` 修饰符来指定同步模式。为此，请使用 [`database_atomic_wait_for_drop_and_detach_synchronously`](/zh/reference/settings/session-settings#database_atomic_wait_for_drop_and_detach_synchronously) 设置。在这种情况下，`DROP` 会等待正在使用该表的 `SELECT`、`INSERT` 及其他查询完成。该表会在不再被使用时被移除。

<div id="exchange-tables">
  ### EXCHANGE TABLES/DICTIONARIES
</div>

[`EXCHANGE`](/zh/reference/statements/exchange) 查询可原子地交换表或字典。例如，可替代下面这种非原子操作：

```sql title="Non-atomic" theme={null}
RENAME TABLE new_table TO tmp, old_table TO new_table, tmp TO old_table;
```

你也可以使用 Atomic 数据库：

```sql title="Atomic" theme={null}
EXCHANGE TABLES new_table AND old_table;
```

<div id="replicatedmergetree-in-atomic-database">
  ### 原子数据库中的 ReplicatedMergeTree
</div>

对于 [`ReplicatedMergeTree`](/zh/reference/engines/table-engines/mergetree-family/replication) 表，建议不要指定 ZooKeeper 中的路径和副本名称这两个引擎参数。在这种情况下，将使用配置参数 [`default_replica_path`](/zh/reference/settings/server-settings/settings#default_replica_path) 和 [`default_replica_name`](/zh/reference/settings/server-settings/settings#default_replica_name)。如果想显式指定引擎参数，建议使用 `{uuid}` 宏。这样可以确保在 ZooKeeper 中为每个表自动生成唯一的路径。

<div id="metadata-disk">
  ### 元数据磁盘
</div>

当在 `SETTINGS` 中指定 `disk` 时，该磁盘将用于存储表的元数据文件。
例如：

```sql theme={null}
CREATE TABLE db (n UInt64) ENGINE = Atomic SETTINGS disk=disk(type='local', path='/var/lib/clickhouse-disks/db_disk');
```

若未指定，默认使用 `database_disk.disk` 中定义的磁盘。

<div id="see-also">
  ## 另请参见
</div>

* [system.databases](/zh/reference/system-tables/databases) 系统表
