0.数据恢复前提

参数vnodeBak 必须打开,不然数据就无法恢复。

vnodeBak 1

数据恢复原理:

  • vnodeBak打开的情况下TDengine会将删除的数据放入dataDir/vnode_bak/ 下;
  • 数据的结构信息会存储在dataDir/mnode/wal/wal0 文件中,该文件只会追加不会进行删除。
1.搭建测试环境

TDengine学习笔记-安装

1.1.创建数据库并插入数据

taos> create database test;
Query OK, 0 of 0 row(s) in database (0.004600s)

taos> use test;
Database changed.

taos> create table t1(ts timestamp,v1 int);
Query OK, 0 of 0 row(s) in database (0.015491s)

taos> insert into t1 values(now,1);
Query OK, 1 of 1 row(s) in database (0.003718s)

taos> insert into t1 values(now,2);
Query OK, 1 of 1 row(s) in database (0.002015s)

taos> insert into t1 values(now,3);
Query OK, 1 of 1 row(s) in database (0.001326s)

taos> select * from t1;
           ts            |     v1      |
========================================
 2021-07-19 15:46:24.651 |           1 |
 2021-07-19 15:46:27.000 |           2 |
 2021-07-19 15:46:29.303 |           3 |
Query OK, 3 row(s) in set (0.006053s)

1.2.重启数据库保证数据落盘

systemctl restart taosd
[root@test1 tmp]# tree /taos/
/taos/
├── dnode
│   ├── dnodeCfg.json
│   ├── dnodeEps.json
│   └── mnodeEpSet.json
├── log
│   ├── taosdlog.0
│   └── taosinfo.0
├── mnode
│   └── wal
│       └── wal0
├── taos
├── tmp
├── vnode
│   ├── vnode2
│   │   ├── config.json
│   │   ├── tsdb
│   │   │   ├── current
│   │   │   ├── data
│   │   │   │   ├── v2f1882.data
│   │   │   │   ├── v2f1882.head
│   │   │   │   └── v2f1882.last
│   │   │   └── meta
│   │   ├── version.json
│   │   └── wal
│   │       └── wal1
│   └── vnode3
│       ├── config.json
│       ├── tsdb
│       │   ├── current
│       │   ├── data
│       │   │   ├── v3f1882.data
│       │   │   ├── v3f1882.head
│       │   │   └── v3f1882.last
│       │   └── meta
│       ├── version.json
│       └── wal
│           └── wal1
└── vnode_bak

1.2.删除数据库

taos> drop database test;
Query OK, 0 of 0 row(s) in database (0.033019s)

taos> show databases\G;
*************************** 1.row ***************************
        name: log
created_time: 2021-07-19 15:45:32.140
     ntables: 4
     vgroups: 1
     replica: 1
      quorum: 1
        days: 10
        keep: 30
   cache(MB): 1
      blocks: 3
     minrows: 100
     maxrows: 4096
    wallevel: 1
       fsync: 3000
        comp: 2
   cachelast: 1
   precision: us
      update: 0
      status: ready
Query OK, 1 row(s) in set (0.008754s)

对比文件夹结构,发现vnode3以及被移动到vnode_bak目录下

[root@test1 tmp]# tree /taos/
/taos/
├── dnode
│   ├── dnodeCfg.json
│   ├── dnodeEps.json
│   └── mnodeEpSet.json
├── log
│   ├── taosdlog.0
│   └── taosinfo.0
├── mnode
│   └── wal
│       └── wal0
├── taos
├── tmp
├── vnode
│   └── vnode2
│       ├── config.json
│       ├── tsdb
│       │   ├── current
│       │   ├── data
│       │   │   ├── v2f1882.data
│       │   │   ├── v2f1882.head
│       │   │   └── v2f1882.last
│       │   └── meta
│       ├── version.json
│       └── wal
│           └── wal1
└── vnode_bak
    └── vnode3
        ├── config.json
        ├── tsdb
        │   ├── current
        │   ├── data
        │   │   ├── v3f1882.data
        │   │   ├── v3f1882.head
        │   │   └── v3f1882.last
        │   └── meta
        ├── version.json
        └── wal

2.恢复数据

2.1.关闭数据库

systecmctl stop taosd

2.2.恢复数据文件

将vnode_bak下vnode3复制到vnode下。

[root@test1 taos]# cp -r vnode_bak/vnode3 vnode/
[root@test1 taos]# tree /taos/
/taos/
├── dnode
│   ├── dnodeCfg.json
│   ├── dnodeEps.json
│   └── mnodeEpSet.json
├── log
│   ├── taosdlog.0
│   └── taosinfo.0
├── mnode
│   └── wal
│       └── wal0
├── taos
├── tmp
├── vnode
│   ├── vnode2
│   │   ├── config.json
│   │   ├── tsdb
│   │   │   ├── current
│   │   │   ├── data
│   │   │   │   ├── v2f1882.data
│   │   │   │   ├── v2f1882.head-ver1
│   │   │   │   └── v2f1882.last
│   │   │   └── meta
│   │   ├── version.json
│   │   └── wal
│   └── vnode3
│       ├── config.json
│       ├── tsdb
│       │   ├── current
│       │   ├── data
│       │   │   ├── v3f1882.data
│       │   │   ├── v3f1882.head
│       │   │   └── v3f1882.last
│       │   └── meta
│       ├── version.json
│       └── wal
└── vnode_bak
    └── vnode3
        ├── config.json
        ├── tsdb
        │   ├── current
        │   ├── data
        │   │   ├── v3f1882.data
        │   │   ├── v3f1882.head
        │   │   └── v3f1882.last
        │   └── meta
        ├── version.json
        └── wal

2.3.修改wal日志

使用二进制编辑工具打开wal日志,文件开头是集群的ID和FQDN等系统信息。
TDengine恢复删除的数据库_数据库
将删库记录清除掉。
TDengine恢复删除的数据库_其他_02

2.4.重新启动数据库

systemctl start taosd

查看数据库,发现已经恢复。

[root@test1 ~]# taos

Welcome to the TDengine shell from Linux, Client Version:2.1.3.2
Copyright (c) 2020 by TAOS Data, Inc. All rights reserved.

taos> show databases;
              name              |      created_time       |   ntables   |   vgroups   | replica | quorum |  days  |           keep           |  cache(MB)  |   blocks    |   minrows   |   maxrows   | wallevel |    fsync    | comp | cachelast | precision | update |   status   |
====================================================================================================================================================================================================================================================================================
 test                           | 2021-07-19 15:45:50.140 |           1 |           1 |       1 |      1 |     10 | 3650                     |          16 |           6 |         100 |        4096 |        1 |        3000 |    2 |         1 | ms        |      0 | ready      |
 log                            | 2021-07-19 15:45:32.140 |           4 |           1 |       1 |      1 |     10 | 30                       |           1 |           3 |         100 |        4096 |        1 |        3000 |    2 |         1 | us        |      0 | ready      |
Query OK, 2 row(s) in set (0.009200s)

taos> use test;
Database changed.

taos> show tables;
           table_name           |      created_time       | columns |          stable_name           |          uid          |     tid     |    vgId     |
==========================================================================================================================================================
 t1                             | 2021-07-19 15:46:09.292 |       2 |                                |       844424946914211 |           1 |           3 |
Query OK, 1 row(s) in set (0.003978s)

taos> select * from t1;
           ts            |     v1      |
========================================
 2021-07-19 15:46:24.651 |           1 |
 2021-07-19 15:46:27.000 |           2 |
 2021-07-19 15:46:29.303 |           3 |
Query OK, 3 row(s) in set (0.007070s)

3.wal日志结构

大家自己去看代码吧。

typedef struct {
  int8_t   msgType;
  int8_t   sver;
  int8_t   reserved[2];
  int32_t  len;
  uint64_t version;
  uint32_t signature;
  uint32_t cksum;
  char     cont[];
} SWalHead;
以上实验仅供测试,不建议在生产环境下进行。