如何从TP日志文件中删除数据?

时间:2018-12-10 18:54:39

标签: kdb

我的一个rtdb崩溃了,因为TP日志文件非常大,并且主机没有足够的内存来恢复该进程。罪魁祸首是其中发送伪造数据的表之一。有没有一种方法可以从TP日志文件中删除此特定表格的数据,从而使eod roll不受影响? 我没有在其中运行的wdb,并且想保留其他表的数据。

谢谢!

2 个答案:

答案 0 :(得分:1)

如果您手动覆盖upd函数,则可以遍历问题表 参见下面的示例

q)//create a sample tplog 
q)`:tplog set ()
`:tplog
q)hopen `:tplog
3i
q)3 enlist (`upd;`t;([]1 2 3;10 20 30;`a`b`c))
3
q)3 enlist (`upd;`t;([]1 2 3;10 20 30;`a`b`c))
3
q)3 enlist (`upd;`badTable;([]1 2 3;10 20 30;`a`b`c))
3
q)3 enlist (`upd;`t;([]1 2 3;10 20 30;`a`b`c))
3

正常重放

q)upd:upsert
q)-11!`:tplog
4
q)t
x x1 x2
-------
1 10 a
2 20 b
3 30 c
1 10 a
2 20 b
3 30 c
1 10 a
2 20 b
3 30 c
q)badTable
x x1 x2
-------
1 10 a
2 20 b
3 30 c
q)delete from `. //clear everything
`.

扔掉badTable

q)upd:{$[x=`badTable;(::);x upsert y]}
q)-11!`:tplog
4
q)t
x x1 x2
-------
1 10 a
2 20 b
3 30 c
1 10 a
2 20 b
3 30 c
1 10 a
2 20 b
3 30 c
q)badTable //badTable no longer exists 
'badTable
  [0]  badTable
       ^

答案 1 :(得分:0)

正如emc211所提到的(尽管在示例中未完全显示),RDB中的方法是拥有一个自定义的upd函数,该函数可以滤除不良数据。

如果错误数据被隔离到特定表中,则:

upd:{if[x<>`badTableName;x insert y]};

如果不良数据包含在“良好”表中:

upd:{$[x=`goodTable;x insert select from ($[1<count first y;flip;enlist][cols[x]!y]) where notBadData;x insert y]};

然后使用-11!重播并保存。

最终,您可能还希望保存一个清理后的日志文件,以防将来将来需要重播该日志文件。为此,您可以使用与上述类似的upd函数,除了不用将数据插入内存中,您可以将良好的记录沿着

行写回到新的日志文件中。
q)L:`:/path/to/cleansedLogFile;
q).[L;();:;()];
q)lh:hopen L;

upd:{if[x<>`badTableName;lh enlist (`upd;x;y)]};
upd:{$[x=`goodTable;lh enlist (`upd;x;value flip select from ($[1<count first y;flip;enlist][cols[x]!y]) where notBadData);lh enlist (`upd;x;y)]};

然后再次使用-11!和完成的hclose lh进行重放。