Skip to main content
本节概述了 ClickHouse 中的备份与恢复。有关各种备份方法的更 详细说明,请参阅侧边栏中相应方法的 页面。

简介

虽然复制可以防范硬件故障,但它并不能 防止人为失误:误删数据、删除错误的 表,或在错误的集群上删除表,以及因软件缺陷导致的 数据处理错误或数据损坏。 很多情况下,这类失误会影响所有副本。ClickHouse 内置了 一些保护机制来防止某些类型的错误。例如,在默认情况下, 你不能直接删除使用 MergeTree 家族引擎且包含超过 50 GB 数据的表。不过,这些保护机制并不能覆盖所有可能的情况, 问题仍然可能发生。 为了有效降低人为失误可能带来的影响,你应当提前 认真制定数据备份与恢复的 策略。 每家公司可用的资源和业务需求各不相同,因此 不存在一种适用于所有场景的 ClickHouse 备份与恢复通用方案。 适用于 1 GB 数据的方法,很可能并不适用于数十 PB 的数据。可选的方法有很多,它们各有优缺点, 本文档的这一部分将对其进行介绍。比较好的做法是 组合使用多种方法,而不是只依赖一种,以弥补各自的 不足。
请记住,如果你完成了备份却从未尝试过恢复, 那么当你真正需要恢复时,很可能无法正常工作 (或者至少 恢复耗时会超出业务可接受的范围) 。因此,无论你选择哪种备份 方案,都务必同时将恢复流程自动化,并定期在备用的 ClickHouse 集群上进行演练。
以下页面详细介绍了 ClickHouse 中可用的各种备份和 恢复方法: 备份可以:

备份类型

备份可以分为全量备份和增量备份。全量备份是 数据的完整副本,而增量备份则只包含自上次全量备份以来发生变化的数据。 全量备份的优点在于恢复方式简单、独立 (不依赖其他备份) 且可靠。但它们可能需要较长时间才能完成,并且 会占用大量空间。相比之下,增量备份在时间和空间利用方面都更 高效,但恢复数据时需要所有相关 备份都可用。 根据你的需求,你可以考虑使用:
  • 全量备份,适用于较小的数据库或关键数据。
  • 增量备份,适用于较大的数据库,或需要频繁且经济高效地执行备份的场景。
  • 两者结合,例如每周执行一次全量备份,每天执行一次增量备份。

同步与异步备份

BACKUP 和 RESTORE 命令也可以标记为 ASYNC。在这种情况下, 备份命令会立即返回,备份过程则在后台运行。 如果命令未标记为 ASYNC,备份过程则会同步执行, 命令会一直阻塞,直到备份完成。

并发与非并发备份

默认情况下,ClickHouse 允许并发执行备份和恢复。这意味着你 可以同时发起多个备份或恢复操作。不过, 也可以通过 server 级别的设置来禁止这种行为。如果你将 这些设置设为 false,那么任一时刻在一个 集群 上只允许运行 一个备份或恢复操作。这有助于避免资源争用 或操作之间可能发生的冲突。 要禁止并发备份/恢复,可以分别使用以下设置:
两者的默认值均为 true,因此默认允许并发执行备份/恢复操作。 当这些设置在集群中为 false 时,任一时刻整个集群只允许运行一个备份/恢复 操作。

压缩与未压缩备份

ClickHouse 备份支持通过 compression_method 和 compression_level 设置启用压缩。 创建备份时,可指定:

使用命名集合

命名集合允许您存储可在备份/恢复操作中重复使用的键值对 (如 S3 凭据、端点和设置) 。 它们有助于:
  • 对没有管理员权限的用户隐藏凭据
  • 通过集中存储复杂配置来简化命令
  • 在各类操作中保持一致性
  • 避免凭据暴露在查询日志中
更多详情请参见”命名集合”。

备份系统表、日志表或访问管理相关表

系统表也可以纳入备份和恢复工作流中,但是否纳入取决于你的具体使用场景。 存储历史数据的系统表,例如带有 _log 后缀的表 (如 query_log、part_log) ,可以像其他任何表一样进行备份和恢复。 如果你的使用场景依赖于分析历史数据——例如,使用 query_log 跟踪查询性能或排查问题——建议将这些表纳入备份策略。不过,如果不需要这些表中的历史数据, 则可以将其排除,以节省备份存储空间。 与访问管理相关的系统表,例如 users、roles、row_policies、 settings_profiles 和 quotas,在备份和恢复操作期间会进行特殊处理。 当这些表被包含在备份中时,其内容会被导出到一个特殊的 accessXX.txt 文件中,该文件包含了用于创建 和配置这些访问实体的等效 SQL 语句。在恢复时,恢复过程 会解析这些文件,并重新执行 SQL 命令以重建用户、 角色及其他配置。此功能确保 ClickHouse 集群的访问控制 配置可以作为集群整体配置的一部分进行备份和恢复。 此功能仅适用于通过 SQL 命令管理的配置 (即“SQL 驱动的访问控制与账户管理”) 。 在 ClickHouse server 配置文件 (如 users.xml) 中定义的访问配置不会包含在备份中,也无法通过此方法恢复。

常规语法

有关各命令的详细信息,请参见”命令摘要”。

命令概览

上述各命令的详细说明如下:

仅备份表结构,不备份数据

EXCEPT DATA FROM {TABLE|TABLES} 只将表定义写入备份,不备份表中的行。适用于 恢复后可以重新生成数据的表,例如物化视图的目标端表。 该子句决定 BACKUP 写入哪些内容,但不影响 RESTORE 能否从备份中恢复表。对于 RESTORE 能够重新创建的表,不含行的表定义会被恢复为空表。它不会让原本无法恢复的 表变得可以恢复——能否根据备份中的表定义重新创建表取决于引擎,有些引擎会直接拒绝。参见 RESTORE 无法重建的引擎。 该子句仅对其所在的元素生效:
  • 用于 DATABASE 或 ALL 元素时,可以指定该元素所备份的任意表:
在此列表中,如果表或数据库的名称为 table、dictionary、view、database 或 all,请用反引号将其括起来:在逗号之后,未加引号的此类名称会被解析为下一个元素的开头。
  • 对于单对象元素 (TABLE、DICTIONARY、VIEW、TEMPORARY TABLE) ,作用域内只有该元素自身的对象, 因此该子句只能指定这一个对象,不能指定其他对象。请为每个表分别编写独立的元素和 子句:
如果某个表既由其自身的元素指定,又出现在某个范围更宽的元素的 EXCEPT DATA FROM 子句中, 则其数据会被备份:指定某个表的元素,也就意味着要备份该表的数据。这与 EXCEPT TABLES 的行为一致: 显式指定的表即使被范围更宽的元素排除,仍会被备份。 materialized view 的内部表 (或 TimeSeries 表的内部表) 的数据需通过外部对象的名称来排除; 该子句不接受内部表名。 EXCEPT DATA FROM {TABLE|TABLES} 仅适用于 BACKUP。RESTORE 会直接拒绝该子句,而不是将其视为空操作 予以接受。

RESTORE 无法重建的引擎

有少数引擎完全无法通过 RESTORE 重建,无论是否使用 EXCEPT DATA FROM {TABLE|TABLES}。对于 这些表,该子句仍会影响备份的大小,但你并不会得到一个恢复后为空的表——原位置上什么都不会恢复,因为 RESTORE 会拒绝创建该表。 需要特别注意的是独立的 MaterializedPostgreSQL 表。该表一旦创建,就会立即开始从 正在运行的 PostgreSQL 源复制数据,导致备份快照与远程的当前状态混杂在一起。因此, RESTORE 会在存储工厂中 (即在创建表之前) 以 NOT_IMPLEMENTED 错误拒绝该表。这是 该引擎本身的特性,对普通的全量备份同样适用。 受支持的做法是以不同的名称进行恢复,将其恢复到一个预先创建好的 ReplacingMergeTree 表中,该表需具有与嵌套表相同的结构 (包括 _sign 和 _version 列) :
必须指定 allow_different_table_def,因为备份中的表定义使用的是 MaterializedPostgreSQL 引擎,而这里要将其恢复为普通的 ReplacingMergeTree 表。 如果不指定 EXCEPT DATA FROM TABLE,同一条 RESTORE 语句还会恢复表中的数据行。

设置

通用备份/恢复设置 S3 专用设置 Azure 专用设置

管理与故障排查

backup 命令会返回一个 id 和 status,并且可以使用该 id 查询备份状态。这对于检查长时间运行的 ASYNC 备份进度非常有用。下面的示例展示了尝试覆盖现有备份文件时 发生的失败:
除了 system.backups 表外,所有备份和恢复操作也会记录在系统日志表 system.backup_log 中: