Skip to content

数据备份与恢复

概述

数据库备份与恢复用于保护数据安全,防止数据丢失或损坏。通过定期备份,可以在系统故障、硬件损坏或人为误操作后,将数据库恢复到最近的可用状态,确保业务连续性和数据完整性。本文介绍如何使用 Datalayers 提供的工具完成数据备份与恢复。

dldump 是 Datalayers 提供的数据导出与导入工具,适合用于单库、单表或全库级别的备份恢复操作。

工具使用说明

dldump 提供了丰富的命令行选项。您可以执行 dldump --help 查看全部子命令和选项。下面对几个常用参数进行说明:

参数简写描述
--host-h指定 Datalayers 实例的地址,默认为:127.0.0.1
--port-P指定 Datalayers 实例的 SQL 服务端口,默认为:8360
--username-u指定用于鉴权的用户名,默认为:admin
--password-p指定用于鉴权的密码,默认为:public
--output-o指定备份时数据的存储路径。为了避免用户无意间覆盖之前的备份,要求导出时指定的目录为空
--input-i指定恢复时数据的加载路径。如果指定的目录为空,则会中止恢复操作
--meta-指定备份时是否要包含元信息(如:建库和建表语句),默认包含元信息。如果不备份元信息,您可以传入 --meta false
--data-指定备份时是否要包含表数据,默认包含表数据。如果要求不备份表数据,您可以传入 --data false
--database-d导出时:-d 用于选择备份 指定的数据库 。如果不指定,默认备份所有数据库。
导入时:-d 用于从备份目录中选择 哪个数据库 进行导入。注意:-d 不是用来指定将数据导入到目标数据库的名称。即导入时的目标数据库名就是备份时的原数据库名,不可通过 -d 更改。
--table-t导出时:-t 用于选择备份指定数据库下的 某张表 。指定 -t 时必须同时指定 -d
导入时:-t 用于从备份目录中选择 哪张表 进行导入。注意:-t 不是用来指定将数据导入到目标表的名称。即导入时的目标表名就是备份时的原表名,不可通过 -t 更改。
--max-file-size-s指定一个数据文件大小的最大值,默认为 8GiB。只支持整型作为合法的输入。单位为:GiB
--start-指定一个时间戳,时间戳大于或等于 start 的表数据才会被备份。合法的日期格式和整型均认为是合法的时间戳
--end-指定一个时间戳,时间戳小于或等于 end 的表数据才会被备份。合法的日期格式和整型均认为是合法的时间戳
--tls-通过 TLS 加密方式与数据库进行交互。自签证书则需指定 root ca,如:--tls /etc/datalayers/datalayers.crt
--help-show this help, then exit

备份与恢复

下面通过一个示例介绍 dldump 的使用方法。示例中会先向单机版 Datalayers 写入一些数据,再使用 dldump 将数据导出到备份目录;随后创建一个新的 Datalayers 实例,并从备份目录恢复数据;最后使用 dlsql 查询新实例中的数据,以验证备份与恢复是否成功。

为方便叙述,本文将被备份的 Datalayers 实例称为 1 号节点,将被恢复的 Datalayers 实例称为 2 号节点。

准备工作

启动 1 号节点:

shell
datalayers standalone -c datalayers.toml

使用 dlsql 工具创建数据库 test、表 device、以及往 device 表写入一些数据,对应的 SQL 及输出如下:

sql
> CREATE DATABASE test; 
Query OK, 0 rows affected. (0.001 sec)

> CREATE TABLE test.device (
    ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    sid INT32,
    value REAL,
    flag INT8,
    timestamp key(ts),
    )
PARTITION BY HASH(sid) PARTITIONS 2
ENGINE=TimeSeries;
Query OK, 0 rows affected. (0.002 sec)

> INSERT INTO test.device (ts, sid, value, flag) VALUES
('2024-09-01 10:00:00', 1, 12.5, 0),
('2024-09-01 10:05:00', 2, 15.3, 1),
('2024-09-01 10:10:00', 3, 9.8, 0),
('2024-09-01 10:15:00', 4, 22.1, 1),
('2024-09-01 10:20:00', 5, 30.0, 0),
('2024-09-02 10:00:00', 6, 12.7, 0),
('2024-09-02 10:05:00', 7, 18.2, 1),
('2024-09-02 10:10:00', 8, 5.6, 0),
('2024-09-02 10:15:00', 9, 20.3, 1),
('2024-09-02 10:20:00', 10, 33.5, 0);
Query OK, 10 rows affected. (0.002 sec)

数据备份

执行数据备份:

shell
dldump -h localhost -P 8360 -d test -o /tmp/datalayers/backup

该命令会将 1 号节点的数据导出到指定的 /tmp/datalayers/backup 目录。

备份完成后,/tmp/datalayers/backup 目录结构如下:

text
backup
  - test
    - create.sql
    - device_0.parquet

dldump 会为每个数据库创建独立的备份目录,并使用数据库名称作为目录名。例如,test 数据库对应同名目录 test。该目录中的 create.sql 文件包含建库语句以及各表的建表语句,其他文件则为表数据文件。表数据文件的命名规则为 <table_name>_<sequence>.parquet:其中 table_name 表示表名,如示例中的 devicesequence 表示该文件是该表导出的第几个数据文件,dldump 会按导出顺序为其编号。

:如果您开启了文件系统的“显示隐藏文件和目录”选项,还会在 test 目录下看到 .schema 文件。为保证恢复时的 schema 与备份时保持一致,dldump 会在备份阶段将所有表的 schema 统一编码到 .schema 文件中,并在恢复阶段从中解码。

数据恢复

启动 2 号节点:

shell
datalayers standalone -c datalayers.toml

请注意,您需要对配置文件 datalayers.toml 做必要调整。一方面,2 号节点使用的数据目录 storage.local.path 必须与 1 号节点不同,否则会导致恢复失败。另一方面,如果 1 号节点仍在运行,则还需要修改 2 号节点的 SQL 服务端口 server.port 和 HTTP 服务端口 server.http_port,以确保其能够成功启动。

执行数据恢复:

以下命令假设 2 号节点的 SQL 服务端口为 8360。如果您在前一步调整了端口,请将命令中的 -P 参数替换为实际端口。

shell
dldump -h localhost -P 8360 -i /tmp/datalayers/backup

该命令会从 /tmp/datalayers/backup 路径加载备份文件,并将数据写入 2 号节点。命令执行完成后,数据恢复即完成。

验证数据

使用 dlsql 对 2 号节点执行查询,以验证恢复结果的完整性。

验证 test 数据库被成功恢复:

sql
> SHOW DATABASES;
+--------------------+---------------------------+
| database           | created_time              |
+--------------------+---------------------------+
| information_schema |                           |
| test               | 2024-09-12T23:47:45+08:00 |
+--------------------+---------------------------+
2 rows in set (0.003 sec)

information_schema 是每个 Datalayers 实例自动生成的系统表组成的数据库,默认不会备份和恢复它。

验证 test 数据库的 device 表被成功恢复:

sql
> USE test;
Database changed to `test`

test> SHOW TABLES;
+----------+-----------+------------+---------------------------+---------------------------+
| database | table     | engine     | created_time              | updated_time              |
+----------+-----------+------------+---------------------------+---------------------------+
| test     | device    | TimeSeries | 2024-09-12T23:48:21+08:00 | 2024-09-12T23:48:21+08:00 |
+----------+-----------+------------+---------------------------+---------------------------+
1 row in set (0.001 sec)

验证 device 表的所有数据被成功恢复:

sql
test> SELECT * FROM device; 
+---------------------------+-----+-------+------+
| ts                        | sid | value | flag |
+---------------------------+-----+-------+------+
| 2024-09-01T18:10:00+08:00 | 3   | 9.8   | 0    |
| 2024-09-01T18:00:00+08:00 | 1   | 12.5  | 0    |
| 2024-09-02T18:20:00+08:00 | 10  | 33.5  | 0    |
| 2024-09-01T18:05:00+08:00 | 2   | 15.3  | 1    |
| 2024-09-01T18:15:00+08:00 | 4   | 22.1  | 1    |
| 2024-09-01T18:20:00+08:00 | 5   | 30.0  | 0    |
| 2024-09-02T18:00:00+08:00 | 6   | 12.7  | 0    |
| 2024-09-02T18:05:00+08:00 | 7   | 18.2  | 1    |
| 2024-09-02T18:10:00+08:00 | 8   | 5.6   | 0    |
| 2024-09-02T18:15:00+08:00 | 9   | 20.3  | 1    |
+---------------------------+-----+-------+------+
10 rows in set (0.002 sec)

相关文档