简体中文
Appearance
简体中文
Appearance
数据库备份与恢复用于保护数据安全,防止数据丢失或损坏。通过定期备份,可以在系统故障、硬件损坏或人为误操作后,将数据库恢复到最近的可用状态,确保业务连续性和数据完整性。本文介绍如何使用 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 号节点:
datalayers standalone -c datalayers.toml使用 dlsql 工具创建数据库 test、表 device、以及往 device 表写入一些数据,对应的 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)执行数据备份:
dldump -h localhost -P 8360 -d test -o /tmp/datalayers/backup该命令会将 1 号节点的数据导出到指定的 /tmp/datalayers/backup 目录。
备份完成后,/tmp/datalayers/backup 目录结构如下:
backup
- test
- create.sql
- device_0.parquetdldump 会为每个数据库创建独立的备份目录,并使用数据库名称作为目录名。例如,test 数据库对应同名目录 test。该目录中的 create.sql 文件包含建库语句以及各表的建表语句,其他文件则为表数据文件。表数据文件的命名规则为 <table_name>_<sequence>.parquet:其中 table_name 表示表名,如示例中的 device;sequence 表示该文件是该表导出的第几个数据文件,dldump 会按导出顺序为其编号。
注:如果您开启了文件系统的“显示隐藏文件和目录”选项,还会在
test目录下看到.schema文件。为保证恢复时的 schema 与备份时保持一致,dldump会在备份阶段将所有表的 schema 统一编码到.schema文件中,并在恢复阶段从中解码。
启动 2 号节点:
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 参数替换为实际端口。
dldump -h localhost -P 8360 -i /tmp/datalayers/backup该命令会从 /tmp/datalayers/backup 路径加载备份文件,并将数据写入 2 号节点。命令执行完成后,数据恢复即完成。
使用 dlsql 对 2 号节点执行查询,以验证恢复结果的完整性。
验证 test 数据库被成功恢复:
> 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 表被成功恢复:
> 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 表的所有数据被成功恢复:
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)