适用范围与对象身份
本文面向自建 ClickHouse 的 ReplicatedMergeTree 家族、ClickHouse Keeper 协调及原生 BACKUP/RESTORE。Cloud 的共享存储和托管备份使用相应产品流程,不能把自建副本拓扑直接套入。原生备份能力和设置随版本变化,例如 BACKUP ALL 在 23.4 前不适用;本文以单表范围展示基础语法,不使用全库备份捷径。
先建立数据库、分片、本地表、副本名、Keeper 路径和 Distributed 入口的对应关系,记录版本、业务写入入口及备份目的端。所有 SQL 都是待现场验证的示例,本文未访问集群或执行备份恢复,验证等级为 PENDING。
分片、副本与协调服务的边界
分片划分数据集合,副本复制同一分片的数据。ReplicatedMergeTree 复制通常是异步多写入口,默认一次 INSERT 等待当前副本的确认,不代表所有副本已经可读。quorum 写入能改变确认条件,但不能据此推导任意副本读取始终最新或所有系统操作拥有跨分片事务。
Keeper 负责复制协调元数据,不保存表中的全部业务数据。复制引擎按表工作,普通建表语句也不会因此自动在所有服务器创建同名表;数据库引擎和分布式 DDL 有各自职责。Distributed 提供跨节点查询与路由,不是自动补齐全部分片备份的数据副本。复制机制
读取一张表的副本状态
SELECT database, table, replica_name,
is_readonly, is_session_expired,
queue_size, absolute_delay, lost_part_count
FROM system.replicas
WHERE database = 'REPLACE_WITH_DATABASE'
AND table = 'REPLACE_WITH_LOCAL_TABLE'
LIMIT 10
SETTINGS max_execution_time = 5, max_threads = 2;该查询只反映当前节点;在确认的同分片副本上分别取证并对齐时间。只读状态和会话过期优先关联 Keeper 连接与日志;队列和延迟应看趋势,不能只靠一个时刻决定健康。lost_part_count 是累计丢失 part 计数,应关注新增长及对应历史,不能要求它在修复后自动归零。system.replicas
将复制积压定位到队列任务
SELECT type, create_time, source_replica,
num_tries, num_postponed,
last_exception, postpone_reason
FROM system.replication_queue
WHERE database = 'REPLACE_WITH_DATABASE'
AND table = 'REPLACE_WITH_LOCAL_TABLE'
ORDER BY create_time
LIMIT 20
SETTINGS max_execution_time = 5, max_threads = 2;区分拉取 part、合并和 mutation 等任务。失败次数与推迟次数代表不同原因:磁盘不足、源副本无法访问、已有相关任务执行等需要分别调查。错误文本可能包含内部地址和路径,交接前脱敏。对照两个时间点的最老任务和重试情况,判断队列是正常周转还是停滞,不能因数量大就删除 Keeper 队列节点。system.replication_queue
副本不能替代历史备份
误写、删除和部分结构变更可能传播到副本。副本提高可用性,历史恢复仍依赖独立保存且可取回的备份。单节点备份一个本地表只覆盖该节点拥有的数据,整个分片集需要明确覆盖清单;只保存 Distributed 定义无法恢复其指向的所有明细。
备份清单还应包含表结构、物化视图依赖、字典外部来源、访问控制、配置引用及密钥保存责任。多个表或跨系统结果若需要同一业务切点,应记录停写、输入位置或其他一致性方案,不能因同一命令包含多张表就假定得到业务全局事务快照。备份与恢复概述
原生备份的有限示例
以下语句仅为独立演练环境准备:sandbox.events_design_demo 是已有有限样本表,backups 是已配置并允许使用的备份磁盘,路径必须是本次演练唯一名称。BACKUP 会写入备份存储,不属于只读诊断。
BACKUP TABLE sandbox.events_design_demo
TO Disk('backups', 'REPLACE_WITH_UNIQUE_DRILL_PATH.zip')
ASYNC;ASYNC 返回只表明操作已受理;保存返回 ID,再查询状态。不能用查询执行超时作为备份任务一定停止的依据。若使用增量备份,须保留被引用的基础备份及完整依赖链,不能按日期分别清理仍被依赖的对象。单机本地磁盘备份也要评估主机丢失时的取回路径。磁盘备份语法
验证状态并规划隔离恢复
SELECT id, status, start_time, end_time, error
FROM system.backups
WHERE id = 'REPLACE_WITH_OPERATION_ID'
LIMIT 1
SETTINGS max_execution_time = 5;system.backups 保存当前服务启动以来的操作信息,重启后空结果不证明备份不存在;长期审计要保存独立记录并核查备份存储。BACKUP_CREATED 证明该任务完成,不能替代实际恢复演练。恢复前确认目标表不存在或为空,核对版本、目标磁盘、Keeper 路径和外部连接,复制表不得重新加入生产协调路径。system.backups
恢复演练与部分失败
在完全隔离的服务器上准备同名备份磁盘和独立 restore_drill 数据库,将备份取回后,才可评审以下恢复语句。示例源表是普通 MergeTree;复制表的 DDL 和 Keeper 隔离需要另外核验。
RESTORE TABLE sandbox.events_design_demo
AS restore_drill.events_design_demo
FROM Disk('backups', 'REPLACE_WITH_UNIQUE_DRILL_PATH.zip');不要为了绕过非空检查启用 allow_non_empty_tables,该选项可能把既有数据与备份数据混合。RESTORE 不是失败后自动整体回滚的事务,已完成的表或 attach 阶段已经可见的部分数据可能保留。出现失败应记录目标实际状态并评审新的隔离目标,不能原样连续重试后声称没有重复。恢复语法与非空目标、恢复原子性边界
验收、误区与停止回退
副本处置验收包括会话和只读状态符合预期、队列最老任务持续推进、没有新的丢 part 证据,以及指定业务样本在预期副本可读。备份验收则核对分片覆盖、已知时间范围与业务键、表结构和代表性查询,分别记录取回、恢复和对账耗时。两类验收不能互相替代。
常见误区是把副本 leader 当成唯一写主、把备份成功当成恢复成功,以及通过清空 Keeper 或删除本地 part 修复任何复制问题。若出现多副本异常、新丢 part、备份链缺失或恢复目标仍连生产入口,停止重建与推广并保护剩余材料。只读诊断无需数据回滚;恢复后的业务接管应明确新写入归属,改回入口无法合并两边已经产生的数据。
相关阅读:MergeTree 数据设计、查询与内存诊断。