在线备份数据库

请务必仔细规划您的备份,并备份您的每一个数据库,包括 system 数据库。

请注意,不允许对数据库别名进行备份,只能备份物理数据库。

命令

Neo4j 数据库可以使用 neo4j-adminbackup 命令在在线模式下进行备份。该命令必须以 neo4j 用户身份调用,以确保正确的文件权限。

最佳实践(但非强制要求)是在与数据库处于同一网络但并非集群一部分的服务器上执行备份。您应该在该机器上安装 Neo4j,以便使用 neo4j-admin 命令。这台机器被称为备份客户端。

备份制品

neo4j-admin database backup 命令每次运行时,会为每个数据库产生一个备份制品文件。备份制品文件是一个不可变文件,包含给定数据库的备份数据以及一些元数据,如数据库名称和 ID、备份时间、最小/最大事务 ID 等。

备份制品有两种类型:

  1. 全量备份 (full backup),包含整个数据库存储;或

  2. 增量备份 (differential backup),包含应用于全量备份制品中数据库存储的事务日志。

备份链

首次运行备份命令时,会为给定数据库生成一个全量备份制品。随后的运行则会产生增量备份制品。

备份链由一个全量备份和随后可选的 n 个连续增量备份序列组成。

backup chain
图 1. 备份链

用法

neo4j-admin database backup 命令可用于从运行中的 Neo4j Enterprise 服务器执行在线全量或增量备份。生成的增量备份制品包含事务日志,在恢复备份链时,这些日志可以被重放并应用于全量备份制品中包含的存储。

Neo4j 的备份服务必须预先在服务器上配置好。该命令可以本地或远程运行。但是,它会消耗大量的资源,如内存和 CPU。因此,建议在单独的专用机器上执行备份。neo4j-admin database backup 命令也支持 SSL/TLS。有关更多信息,请参阅 在线备份配置

neo4j-admin database backupNeo4j Aura 中不受支持。

语法

neo4j-admin database backup [-h] [--expand-commands] [--prefer-diff-as-parent] [--verbose]
                            [--compress[=true|false]] [--keep-failed[=true|false]]
                            [--parallel-download[=true|false]] [--parallel-recovery[=true|false]]
                            [--remote-address-resolution[=true|false]] [--skip-recovery
                            [=true|false]] [--additional-config=<file>]
                            [--include-metadata=none|all|users[=user1,user2]|roles]
                            [--inspect-path=<path>] [--pagecache=<size>] [--temp-path=<path>]
                            [--to-path=<path>] [--type=<type>] [--from=<host:port>[,<host:port>...]]... [<database>...]

描述

从运行中的 Neo4j 企业版服务器执行在线备份。Neo4j 的备份服务必须预先在服务器上配置好。

参数

表 1. neo4j-admin database backup 参数
参数 描述 默认

[<database>…​]

要备份的远程数据库名称。支持在双引号内使用 glob 通配符,例如 "data*"。(除非使用 --inspect-path,否则 <database> 是必需的。)

neo4j

如果 <database> 为 "*",则 neo4j-admin 将尝试备份 DBMS 中的所有数据库。

选项

表 2. neo4j-admin database backup 选项
选项 描述 默认

--additional-config=<file>[1]

包含额外配置的配置文件。

--compress[=true|false]

请求对备份制品进行压缩。压缩可以使备份制品体积缩小很多,但具体的缩减量取决于许多因素,包括数据库格式和存储数据的类型。如果禁用,生成的制品大小将大致等于备份数据库的大小。备份操作的速度会受到压缩的影响,但哪种方式更快取决于 CPU 和存储的相对性能。如果备份速度很重要,请考虑评估启用和禁用压缩两种选项。

true

--expand-commands

允许在配置值评估中进行命令扩展。

--from=<host:port>[,<host:port>…​]

Neo4j 实例主机名和端口的逗号分隔列表,将按顺序尝试连接每个实例。

-h, --help

显示此帮助消息并退出。

--include-metadata=none|all|users[=user1,user2]|roles

2025.10 变更 在文件中包含元数据。这不能用于备份 system 数据库。可选值包括:

  • roles - 包含创建角色和权限(数据库和图)的命令,这些命令会影响数据库的使用。

  • users - 包含创建用户及其角色分配的命令。如果指定了用户列表(例如 users=alice,bob,charlie),则只有这些用户会被包含在备份中。

  • all - 同时包含 rolesusers

  • none - 不包含任何元数据。

    特定于 DBMS 而非所备份数据库的权限不会包含在备份中。例如,GRANT ROLE MANAGEMENT ON DBMS TO $role 将不会被备份。

因此,不具备数据库相关权限的 rolesusers 也不会被包含在备份中(例如仅具备 DBMS 权限或无权限的用户/角色)。

在这种情况下,建议使用 SHOW USERSSHOW ROLESSHOW ROLE $role PRIVILEGES AS COMMANDS 来获取用户、角色和权限的完整列表。

all

--inspect-path=<path>

列出并显示备份制品的元数据。接受文件夹或文件路径。

--keep-failed[=true|false]

请求保留失败的备份以供后续分析。如果启用,将保留包含失败备份数据库的目录。

false

--pagecache=<size>

备份过程中使用的页缓存大小。

--parallel-download[=true|false]

2025.11 引入 从多个 Neo4j 实例并行下载备份数据。

false

--parallel-recovery[=true|false]

允许多个线程并行地将拉取的事务应用于备份。对于某些数据库和工作负载,这可以显著减少备份时间。注意:这是一个实验性选项。使用前请咨询 Neo4j 支持部门。

false

--prefer-diff-as-parent

2025.04 引入 在执行增量备份时,优先选择最新的非空增量备份作为父项,而不是最近的备份。

false

--remote-address-resolution[=true|false]

2025.09 引入 允许 DBMS 自动确定哪些服务器有资格作为备份源,无需手动选择。

false

--skip-recovery[=true|false]

2025.11 引入 跳过全量备份过程中的恢复步骤。跳过恢复可能会缩短备份时间,但需要在还原时进行恢复。

false

--temp-path=<path>

提供一个临时空目录的路径,用于在命令完成前存储备份文件。命令完成后,这些文件将被删除。

--to-path=<path>

放置备份的目录(除非使用 --inspect-path,否则是必需的)。可以使用相应的 URI 作为路径,将数据库备份到 AWS S3 存储桶、Google Cloud 存储桶和 Azure 中。

--type=<type>

要执行的备份类型。可选值:FULL, DIFF, AUTO。如果未指定,类型将根据现有备份自动确定。如果您想强制进行全量备份,请使用 FULL

AUTO

--verbose

启用详细输出。

1. 有关详细信息,请参阅 Neo4j Admin 和 Neo4j CLI → 配置

--to-path=<path> 选项还可以将数据库备份到 AWS S3 存储桶、Google Cloud 存储桶和 Azure 存储桶。有关更多信息,请参阅 将数据库备份到云存储

--temp-path 选项可以解决执行备份相关命令时与磁盘空间相关的问题,特别是在涉及云存储时。

如果未设置 --temp-path,则会在 --path 选项指定的目录中创建一个临时目录。

如果您没有提供 --path 选项,或者您提供的路径指向一个云存储桶,则会在 Neo4j 的当前工作目录中创建一个临时文件夹。这种回退选项可能会导致问题,因为本地文件系统(或安装 Neo4j 的分区)可能没有足够的可用磁盘空间来容纳中间计算。

因此,强烈建议在执行备份相关命令时提供 --temp-path 选项,特别是当 --path 选项中提供的文件夹指向云存储桶时。

退出代码

根据备份是否成功,neo4j-admin database backup 会以不同的代码退出。错误代码包含所遇到错误的详细信息。

表 3. 备份单个数据库时 Neo4j Admin 备份的退出代码
代码 描述

0

成功。

1

备份失败,或备份成功但遇到问题(例如某些服务器无法连接)。详情请参阅日志。

表 4. 备份多个数据库时 Neo4j Admin 备份的退出代码
代码 描述

0

所有数据库均备份成功。

1

一个或多个备份失败,或在处理过程中出现问题。

在线备份配置

检查点 (Checkpointing)

当请求全量备份时,它总是会触发一个检查点。在检查点完成之前,备份无法进行。

在服务器执行检查点时,备份作业不会接收到任何数据,这可能导致备份超时。要延长备份超时,请修改 dbms.cluster.network.client_inactivity_timeout 设置,该设置限制了网络不活动状态。它控制了 catchup 协议的超时持续时间,该协议是包括备份在内的多个 catchup 进程的底层协议。

您还可以调整检查点设置或检查磁盘性能是否足以处理负载。有关更多信息,请参阅 检查点 IOPS 限制

要了解更多关于检查点的信息,请参阅 数据库内部原理 → 检查点和日志修剪

服务器配置

下表列出了与备份相关的基本服务器参数。请注意,默认情况下,备份服务已启用,但仅在 localhost (127.0.0.1) 上侦听。如果要从另一台机器进行备份,则需要更改此设置。

表 5. 备份服务器参数
参数名称 默认值 描述

server.backup.enabled

true

启用在线备份支持。

server.backup.listen_address

127.0.0.1:6362

用于在线备份的侦听服务器。

内存配置

您可以通过多种方式配置分配给备份客户端的内存:

  • 配置堆内存大小

    HEAP_SIZE 配置备份进程分配的最大堆大小。在开始操作之前定义 HEAP_SIZE 变量。如果未指定,Java 虚拟机将根据服务器资源选择一个值。

  • 配置页缓存

    使用 neo4j-admin database backup 命令的 --pagecache 选项设置页缓存大小。

  • 覆盖内存设置

    使用 neo4j-admin database backup 命令的 --additional-config 选项来覆盖 neo4j.conf 文件中的内存配置。

在满足以下约束的前提下,您应尽可能多地为 Neo4j 页缓存分配内存:

Neo4j 页缓存 + OS 页缓存 < 可用 RAM,其中应预留 2 到 4GB 给操作系统页缓存。

例如,如果根据 debug.log,您当前的数据库 Total mapped size128GB,且您有足够的可用空间(意味着您预留了 2 到 4 GB 给 OS),那么您可以将 --pagecache 设置为 128GB

计算资源配置

事务日志文件

事务日志文件用于跟踪最近的更改,它们会根据提供的配置进行轮转和修剪。例如,设置 db.tx_log.rotation.retention_policy=3 将在备份中保留 3 个事务日志文件。由于恢复后的服务器不需要所有已应用的事务日志文件,因此可以通过将文件大小减小到最低限度来进一步减少存储空间。这可以通过设置 db.tx_log.rotation.size=1Mdb.tx_log.rotation.retention_policy=3 文件来实现。您可以使用 --additional-config 参数来覆盖 neo4j.conf 文件中的配置。

手动删除事务日志可能会导致备份损坏。

安全配置

使用 SSL 策略和防火墙保护您的备份网络通信,可以防止数据被非法入侵和泄露。使用 neo4j-admin database backup 命令时,您可以配置备份服务器要求 SSL/TLS,并使备份客户端使用兼容的策略。有关如何在 Neo4j 中配置 SSL 的更多信息,请参阅 SSL 框架

备份服务器的配置应添加到 neo4j.conf 文件中,备份客户端的配置应添加到 neo4j-admin.conf 文件中。确保兼容性的最简单方法是对服务器和客户端使用相同的 SSL 策略配置。对于生产环境,建议使用证书颁发机构 (CA) 签署证书,而不是使用自签名证书。

默认备份端口为 6362,由键 server.backup.listen_address 配置。SSL 配置策略的键为 dbms.ssl.policy.backup

例如,将以下内容添加到您的 neo4j.confneo4j-admin.conf 文件中:

neo4j.conf 中的服务器配置
dbms.ssl.policy.backup.enabled=true
dbms.ssl.policy.backup.client_auth=REQUIRE
dbms.ssl.policy.backup.tls_versions=TLSv1.2,TLSv1.3
dbms.ssl.policy.backup.ciphers=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
neo4j-admin.conf 中的客户端配置
dbms.ssl.policy.backup.enabled=true
dbms.ssl.policy.backup.client_auth=REQUIRE
dbms.ssl.policy.backup.tls_versions=TLSv1.2,TLSv1.3
dbms.ssl.policy.backup.ciphers=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

Neo4j 也支持 TLSv1.3。要同时使用 TLSv1.2 和 TLSv1.3 版本,必须为每个版本指定要强制执行的密码套件。否则,Neo4j 可能会使用 JVM 中所有可能的密码,从而导致安全性降低。

有关 Neo4j 安全性建议的详细列表,请参阅 安全检查清单

确保没有外部访问 server.backup.listen_address 设置指定的端口非常重要。未能保护此端口可能会留下安全漏洞,导致未经授权的用户将数据库复制到其他机器上。在生产环境中,应通过防火墙阻止对备份端口的外部访问。

集群配置

在集群拓扑中,可以从托管目标数据库的任何服务器进行备份,每台服务器有两个可配置的端口用于服务备份。这些端口分别由 server.backup.listen_addressserver.cluster.listen_address 配置。在功能上,它们对备份是等效的,但分离它们可以提供一些操作灵活性,而使用单个端口则可以简化配置。

通常建议选择从库 (secondary copies) 作为备份资源,因为在典型的集群部署中,它们比主库 (primary copies) 数量更多。此外,大型备份可能导致的从库性能问题不会影响主库的性能或冗余。如果无法使用从库,则可以基于物理邻近度、带宽、性能和存活性等因素选择主库。

使用 SHOW DATABASES 命令了解哪个数据库托管在哪个服务器上。

为了避免从滞后的集群成员进行备份,您可以通过公开 Neo4j 指标或通过 Neo4j Browser 查看事务 ID。要在 Neo4j Browser 中查看最新的已处理事务 ID(及其他指标),请在提示符下输入 :sysinfo

针对多台服务器

建议在从集群进行备份时提供多个目标服务器列表,因为这可以允许备份在某些服务器宕机或并非所有数据库都托管在同一台服务器上的情况下成功完成。如果命令发现一个或多个服务器无响应,它将继续尝试从其他服务器备份并继续备份其他请求的数据库,但命令的退出代码将是非零值,以提醒用户存在问题。如果结合多个目标服务器使用数据库名称模式,则所有服务器都会对匹配的数据库列表做出贡献。

使用 --remote-address-resolution

从 2025.09 开始,可以使用 --remote-address-resolution 选项。启用后,DBMS 会自动选择最合适的服务器作为给定数据库的备份源。

默认情况下,在线备份命令要求用户确定哪些服务器托管了目标数据库,并将命令导向其中之一。启用远程地址解析后,DBMS 会自动执行此映射,无需手动选择服务器。

服务器选择按以下顺序发生:

  • DBMS 首先选择所有以从库模式托管该数据库的服务器。

  • 如果无法从从库进行备份,DBMS 将尝试从主跟随者 (primary followers) 进行备份,最后再尝试数据库主写入器 (database primary writer)。

使用 --parallel-download

从 2025.11 开始,可以使用 --parallel-download 选项。启用后,备份进程会从 --from 选项定义或通过 --remote-address-resolution 确定的多个服务器并行拉取数据。

请注意,如果备份进程和数据源服务器都配置了足够的吞吐量,这将加快备份过程。

示例

以下是如何备份单个数据库和多个数据库的示例。目标目录 /mnt/backups/neo4j 必须在调用命令前存在,且数据库必须处于在线状态。

备份单个数据库

您不需要使用 --type 选项来指定备份类型。默认情况下,类型会根据现有备份自动确定。

bin/neo4j-admin database backup --to-path=/path/to/backups/neo4j neo4j

强制备份单个数据库的全量备份

如果您想在多次增量备份后强制进行全量备份,可以使用 --type=full 选项。

bin/neo4j-admin database backup --type=full --to-path=/path/to/backups/neo4j neo4j

备份多个数据库

要备份匹配特定模式的多个数据库,可以使用名称通配符。例如,要备份三服务器集群中所有以 n 开头的数据库,请运行:

bin/neo4j-admin database backup --from=192.168.1.34:6362,192.168.1.35:6362,192.168.1.36:6362 --to-path=/mnt/backups/neo4j --pagecache=4G "n*"

备份数据库列表

要按名称备份多个数据库,可以提供数据库名称列表。

neo4j-admin database backup --from=192.168.1.34:6362,192.168.1.35:6362,192.168.1.36:6362 --to-path=/mnt/backups/neo4j --pagecache=4G "test*" "neo4j"

将数据库备份到云存储

在 Neo4j 2025.03 中,引入了新的云集成设置,为云生态系统中的部署和管理提供更好的支持。详情请参阅 配置设置 → 云存储集成设置

以下示例展示了如何使用 --to-path 选项将数据库备份到云存储桶。

Neo4j 使用 AWS SDK v2 通过 AWS URL 调用 AWS 上的 API。或者,您可以使用系统变量 aws.endpointUrls3aws.endpointUrlS3aws.endpointUrl,或环境变量 AWS_ENDPOINT_URL_S3AWS_ENDPOINT_URL 来覆盖端点,以便 AWS SDK 可以与 Ceph、Minio 或 LocalStack 等替代存储系统通信。

  1. 按照 AWS 官方文档中的说明安装 AWS CLI — 安装 AWS CLI 版本 2

  2. 使用 AWS CLI 创建 S3 存储桶和用于存储备份文件的目录:

    aws s3 mb --region=us-east-1 s3://myBucket
    aws s3api put-object --bucket myBucket --key myDirectory/

    有关如何创建存储桶和使用 AWS CLI 的更多信息,请参阅 AWS 官方文档 — 使用 AWS CLI 使用 Amazon S3使用 AWS CLI 的高级 (s3) 命令

  3. 通过运行以下命令验证 ~/.aws/config 文件是否正确:

    cat ~/.aws/config

    输出应如下所示:

    [default]
    region=us-east-1
  4. 通过在 ~/.aws/credentials 文件中设置 aws_access_key_idaws_secret_access_key 并根据需要使用存储桶策略,来配置对 AWS S3 存储桶的访问。例如:

    1. 使用 aws configure set aws_access_key_id aws_secret_access_key 命令设置您的 IAM 凭据,并验证 ~/.aws/credentials 是否正确:

      cat ~/.aws/credentials

      输出应如下所示:

      [default]
      aws_access_key_id=this.is.secret
      aws_secret_access_key=this.is.super.secret
    2. 此外,您可以使用基于资源的策略向您的 S3 存储桶及其中的对象授予访问权限。创建包含以下内容的策略文档并将其附加到存储桶。请注意,为了能够下载和上传文件,两个资源条目都很重要。

      {
          "Version": "2012-10-17",
          "Id": "Neo4jBackupAggregatePolicy",
          "Statement": [
              {
                  "Sid": "Neo4jBackupAggregateStatement",
                  "Effect": "Allow",
                  "Action": [
                      "s3:ListBucket",
                      "s3:GetObject",
                      "s3:PutObject",
                      "s3:DeleteObject"
                  ],
                  "Resource": [
                      "arn:aws:s3:::myBucket/*",
                      "arn:aws:s3:::myBucket"
                  ]
              }
          ]
      }
  5. 运行 neo4j-admin database backup 命令将数据库备份到 AWS S3 存储桶:

    bin/neo4j-admin database backup --to-path=s3://myBucket/myDirectory/ mydatabase
  1. 确保您拥有 Google 帐户,并在 Google Cloud Platform (GCP) 中创建了项目。

    1. 按照 Google 官方文档中的说明安装 gcloud CLI — 安装 gcloud CLI

    2. 根据 Google 官方文档创建服务帐户和服务帐户密钥 — 创建服务帐户创建和管理服务帐户密钥

    3. 下载服务帐户的 JSON 密钥文件。

    4. GOOGLE_APPLICATION_CREDENTIALSGOOGLE_CLOUD_PROJECT 环境变量分别设置为 JSON 密钥文件的路径和项目 ID:

      export GOOGLE_APPLICATION_CREDENTIALS="/path/to/keyfile.json"
      export GOOGLE_CLOUD_PROJECT=YOUR_PROJECT_ID
    5. 使用您创建的服务帐户的电子邮件地址、JSON 密钥文件的路径和项目 ID 对 gcloud CLI 进行身份验证:

      gcloud auth activate-service-account service-account@example.com --key-file=$GOOGLE_APPLICATION_CREDENTIALS --project=$GOOGLE_CLOUD_PROJECT

      有关更多信息,请参阅 Google 官方文档 — gcloud auth activate-service-account

    6. 按照 Google 官方文档在 Google Cloud Storage 中创建存储桶 — 创建存储桶

    7. 运行以下命令验证存储桶已创建:

      gcloud storage ls

      输出应列出创建的存储桶。

  2. 运行 neo4j-admin database backup 命令将数据库备份到 Google 存储桶:

    bin/neo4j-admin database backup --to-path=gs://myBucket/myDirectory/ mydatabase
  1. 确保您拥有 Azure 帐户、Azure 存储帐户和 blob 容器。

    1. 您可以使用 Azure 门户创建存储帐户。
      有关详细信息,请参阅 Azure 官方文档 创建存储帐户

    2. 在 Azure 门户中创建 blob 容器。
      有关详细信息,请参阅 Azure 官方文档 快速入门:使用 Azure 门户上传、下载和列出 blob

  2. 按照 Azure 官方文档中的说明安装 Azure CLI — Azure 官方文档

  3. 使用默认 Azure 凭据针对 Azure 对 neo4j 或 neo4j-admin 进程进行身份验证。
    有关详细信息,请参阅 Azure 官方文档 默认 Azure 凭据

    az login

    完成后,您应该可以在 neo4j 或 neo4j-admin 中使用 Azure URL。

  4. 要验证您是否可以使用登录凭据访问容器,请运行以下命令:

    # Upload a file:
    az storage blob upload --file someLocalFile  --account-name accountName - --container someContainer --name remoteFileName  --auth-mode login
    
    # Download the file
    az storage blob download  --account-name accountName --container someContainer --name remoteFileName --file downloadedFile --auth-mode login
    
    # List container files
    az storage blob list  --account-name someContainer --container someContainer  --auth-mode login
  5. 运行 neo4j-admin database backup 命令将数据库备份到 Azure 容器:

    bin/neo4j-admin database backup --to-path=azb://myStorageAccount/myContainer/myDirectory/ mydatabase

使用 --prefer-diff-as-parent 选项执行增量备份

默认情况下,增量备份 (--type=DIFF) 使用目录中最近的非空备份(无论是全量还是增量备份)作为其父项。

--prefer-diff-as-parent 选项改变了此行为,强制备份作业使用最新的增量备份作为父项,即使存在更新的全量备份。

这种方法允许您为所有事务维护一个增量备份链,并恢复到任何时间点。如果没有此选项,最后一次全量备份和之前增量备份之间的事务将无法作为独立事务进行备份。

要使用 --prefer-diff-as-parent 选项,请将其设置为 true

以下示例涵盖了使用 --prefer-diff-as-parent 选项的不同场景。

假设您每小时向 neo4j 数据库写入 10 个事务,12:30 到 13:30 期间除外,此时没有写入任何事务。

有一个每小时执行一次备份、每四小时执行一次全量备份的备份作业。空备份没有事务,意味着最小事务 ID 和最大事务 ID 均为零。

设想您拥有以下备份链:

时间戳 备份名称 备份类型 最小事务 ID 最大事务 ID

10:30

backup1

全量

1

10

11:30

backup2

增量

11

20

12:30

backup3

增量

21

30

13:30

backup4

增量

0

0

14:30

backup5

全量

1

40

在 15:30,您执行以下备份命令:

neo4j-admin database backup --from=<address:port> --to-path=<targetPath> --type=DIFF neo4j

结果将是:

15:30

backup6

增量

41

50

该结果意味着您选择了 backup5 作为增量 backup6 的父项,因为 backup5最新的非空备份。

但是,如果您使用 --prefer-diff-as-parent 选项执行以下命令:

neo4j-admin database backup --from=<address:port> --to-path=<targetPath> --type=DIFF --prefer-diff-as-parent neo4j

结果将是:

15:30

backup6

增量

31

50

在这种情况下,backup3 被选为父项,因为它是最新的非空增量备份。

假设您每小时向 neo4j 数据库写入 10 个事务,并触发每小时一次的全量备份。

时间戳 备份名称 备份类型 最小事务 ID 最大事务 ID

10:30

backup1

全量

1

10

11:30

backup2

全量

11

20

在这种情况下,没有增量备份。因此,--prefer-diff-as-parent 选项无效,行为与默认行为相同。

neo4j-admin database backup \
--from=<address:port> --to-path=<targetPath> \
--type=DIFF --prefer-diff-as-parent \
neo4j

结果将是(无论是否使用 --prefer-diff-as-parent 选项):

12:30

backup3

增量

21

30