GBase 8a通过Rsync快速删除加载日志loader_logs下的大量目录和文件的方法

GBase 8a通过LOAD方式加载时,如果有报错或者加载错误数据,会将加载日志和数据记录到连接节点的load_logs目录下。因为是用户数据,当前版本尚没有配置自动删除功能,而是建议用户在LOAD语句里将错误数据导出到用户自己指定的ftp/sftp目标服务器,自行管理。本文介绍在默认情况下,如何通过rsync命令快速清理这些日志。

GBase 8a集群加载的错误数据导出到指定ftp/sftp/服务器目录下
GBase 8a 集群加载数据LOAD的方法

环境

构造加载错误日志

弄了一个表结构和数据不一致的情况。

gbase> load data infile 'sftp://gbase:gbase1234@10.0.2.101/home/gbase/aggr_loc_peersigip_srvapp_hour_week_202211.csv' into table t1  fields terminated by '\t';
Query OK, 0 rows affected (Elapsed: 00:00:04.86)
Task 14 finished, Loaded 0 records, Skipped 276008 records

gbase> load data infile 'sftp://gbase:gbase1234@10.0.2.101/home/gbase/aggr_loc_peersigip_srvapp_hour_week_202210.csv' into table t1  fields terminated by '\t';
Query OK, 0 rows affected (Elapsed: 00:00:01.25)
Task 15 finished, Loaded 0 records, Skipped 559 records

gbase> load data infile 'sftp://gbase:gbase1234@10.0.2.101/home/gbase/aggr_loc_peersigip_srvapp_hour_week_202210.csv' into table t1  fields terminated by '\t';
Query OK, 0 rows affected (Elapsed: 00:00:01.31)
Task 16 finished, Loaded 0 records, Skipped 559 records

gbase> load data infile 'sftp://gbase:gbase1234@10.0.2.101/home/gbase/aggr_loc_peersigip_srvapp_hour_week_202210.csv' into table t1  fields terminated by '\t';
Query OK, 0 rows affected (Elapsed: 00:00:01.27)
Task 17 finished, Loaded 0 records, Skipped 559 records

gbase>

查看加载日志

加载日志(有错误数据时产生)默认放在加载连接节点的gcluster/log/gcluster/loader_logs下面。按照加载load的taskid号创建目录,内部是1个加载结果和有错误的各个分片的错误日志和对应错误数据。

[gbase@gbase_rh7_001 loader_logs]$ pwd
/opt/gbase/gcluster/log/gcluster/loader_logs
[gbase@gbase_rh7_001 loader_logs]$ ll
total 0
drwx------. 2 gbase gbase 140 Apr  1 10:30 14
drwx------. 2 gbase gbase 140 Apr  1 10:30 15
drwx------. 2 gbase gbase 140 Apr  1 10:30 16
drwx------. 2 gbase gbase 140 Apr  1 10:30 17
[gbase@gbase_rh7_001 loader_logs]$ ll 14
total 58988
-rw-------. 1 gbase gbase      272 Apr  1 10:30 14_loader_result.log
-rw-------. 1 gbase gbase 26264424 Apr  1 10:30 14_testdb_t1_n1_10.0.2.101_20220401103041.err
-rw-------. 1 gbase gbase 34128469 Apr  1 10:30 14_testdb_t1_n1_10.0.2.101_20220401103041.trc
[gbase@gbase_rh7_001 loader_logs]$ ll 15
total 124
-rw-------. 1 gbase gbase   264 Apr  1 10:30 15_loader_result.log
-rw-------. 1 gbase gbase 51650 Apr  1 10:30 15_testdb_t1_n1_10.0.2.101_20220401103051.err
-rw-------. 1 gbase gbase 67596 Apr  1 10:30 15_testdb_t1_n1_10.0.2.101_20220401103051.trc
[gbase@gbase_rh7_001 loader_logs]$

通过Rsync清理日志

一般如果文件不多,可以用

rm -fr *

来清理,如果再多,可以用

ls | xargs rm -fr

来清理,如果极多,或者如上的方法耗时很长,可以考虑用rsync的方法清理大量的目录和文件

语法

rsync --delete-before -d -a -H -v --progress --stats SOURCE  TARGET

其中有关参数

  • -delete-before 传输前进行删除操作,而不是传输中(--delete-during)
  • -d 不递归的传输目录
  • -a 归档,表示以递归方式传输文件
  • -H 保持硬链接的文件
  • -v 详细模式,输出些日志
  • --progress 同步的过程中可以看到同步的过程状态,比如统计要同步的文件数量、 同步的文件传输速度等
  • --stats 每个文件的传输状态
  • SOURCE 源文件
  • TARGET 目标文件

因为本文是介绍删除,那么源文件就是个空目录

创建空目录

如下在/tmp目录创建一个空目录,名字随意。

mkdir /tmp/BLANK

Rsync删除loader_log目录

因为是删除,所以不需要那些过程之类的参数,只使用--delete-before。同时是否递归目录,需要指定-d不递归,我们只有1级目录

注意,SOURCE使用的是/tmo/BLANK/ 代表是这个目录下的内容, 如果不带最后的/,会导致将BLANK目录同步到目标,而不是BLANK目录下的内容。

[gbase@gbase_rh7_001 gcluster]$ rsync --delete-before -d -v /tmp/BLANK/  /opt/gbase/gcluster/log/gcluster/loader_logs
building file list ... done
deleting 17/17_testdb_t1_n1_10.0.2.101_20220401103055.trc
deleting 17/17_testdb_t1_n1_10.0.2.101_20220401103055.err
deleting 17/17_loader_result.log
deleting 17/
deleting 16/16_testdb_t1_n1_10.0.2.101_20220401103053.trc
deleting 16/16_testdb_t1_n1_10.0.2.101_20220401103053.err
deleting 16/16_loader_result.log
deleting 16/
deleting 15/15_testdb_t1_n1_10.0.2.101_20220401103051.trc
deleting 15/15_testdb_t1_n1_10.0.2.101_20220401103051.err
deleting 15/15_loader_result.log
deleting 15/
deleting 14/14_testdb_t1_n1_10.0.2.101_20220401103041.trc
deleting 14/14_testdb_t1_n1_10.0.2.101_20220401103041.err
deleting 14/14_loader_result.log
deleting 14/

sent 22 bytes  received 12 bytes  68.00 bytes/sec
total size is 0  speedup is 0.00
[gbase@gbase_rh7_001 gcluster]$ ll loader_logs/
total 0
[gbase@gbase_rh7_001 gcluster]$

总结

实际测试,通过rsync删除目录的速度,远高于rm的方式。网上找到的资料,是rsync是多线程处理,而rm是单线程的。其中rm耗时40分钟的场景,用rsync只需要 18秒。

参考

Rsync同步时删除多余文件 [附:删除大量文件方法的效率对比]