这里写目录标题
参数vnodeBak 必须打开,不然数据就无法恢复。
vnodeBak 1
数据恢复原理:
- vnodeBak打开的情况下TDengine会将删除的数据放入dataDir/vnode_bak/ 下;
- 数据的结构信息会存储在dataDir/mnode/wal/wal0 文件中,该文件只会追加不会进行删除。
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等系统信息。
将删库记录清除掉。
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;
以上实验仅供测试,不建议在生产环境下进行。