简体中文
Appearance
简体中文
Appearance
数据库备份和恢复的目的是为了保护数据安全,防止数据丢失或损坏。通过定期备份,能够在系统故障、硬件损坏或人为错误时,将数据库恢复到最近的可用状态,确保业务连续性和数据完整性。本章节主要介绍数据备份与恢复功能。
dldump
工具提供了丰富的选项以供配置,您可以通过执行 dldump --help
以查看 dldump
的所有子命令和选项。此处对一些重要的选项进行说明:
参数 | 简写 | 描述 |
---|---|---|
--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 | 指定备份或恢复的数据库。如果不显式设定该选项,则默认转储所有数据库 |
--table | -t | 指定备份或恢复的表。如果指定了 table,则必须指定 database。如果不显式设定该选项,则默认备份 database 下所有表 |
--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 实例,从备份目录加载数据并写入到新的 Datalayers 实例;最后使用 dlsql 工具查询新的 Datalayers 实例,以验证成功执行了备份与恢复。
为方便叙述,本文将被备份的 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.parquet
根据 dldump
工具的设计,每个数据库会有一个独立的备份目录,这个目录会以数据库的名称命名。例如,test
数据库对应一个同名的 test
目录。数据库目录下存在一个 create.sql
文件,它里面包含了这个数据库的建库语句和每个表的建表语句。数据库目录下的其他文件则为表数据文件。表数据文件的命名规则是 <table_name>_<sequence>.parquet
,table_name
为表名,如示例中的 device
表;sequence
表示该数据文件为这张表的第几个数据文件,dldump
会根据数据导出时的顺序对数据文件进行排序。
注:如果您开启了文件系统的“显示隐藏文件和目录”的选项,那么您还会在
test
目录下发现.schema
文件。为了保证数据恢复时的 schema 与备份时的一致,dldump
在备份时会将所有表的 schema 统一编码到.schema
文件中,在恢复时再从中解码出 schema。
启动 2 号节点:
datalayers standalone -c datalayers.toml
请注意,您需要对配置文件 datalayers.toml
做必要的修改。一方面,2 号节点使用的数据目录 storage.local.path
必须与 1 号节点不同,否则会导致恢复失败。另一方面,如果 1 号节点没有关闭,那么您需要改动 2 号节点使用的 SQL 服务端口 server.port
和 HTTP 服务端口 server.http_port
,以确保其能够成功启动。
执行数据恢复:
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)