如何从Aerospike命名空间中删除整套?

时间:2015-02-06 12:38:34

标签: aerospike

有没有办法从aql或CLI中删除命名空间(Aerospike)中的一个集合?

我的设置还包含Ldts。

请建议我从LDT中删除整个Set的方法

9 个答案:

答案 0 :(得分:9)

您可以使用

删除一组
asinfo -v "set-config:context=namespace;id=namespace_name;set=set_name;set-delete=true;"

此链接详细说明了如何删除该集

http://www.aerospike.com/docs/operations/manage/sets/#deleting-a-set-in-a-namespace

答案 1 :(得分:3)

2017年3月发布的Aerospike Server版本3.12.0有一种新的更好的方法:

asinfo -v "truncate:namespace=namespace_name;set=set_name"

此前命令已被弃用,仅适用于2017年4月发布的Aerospike 3.12.1:

asinfo -v "set-config:context=namespace;id=namespace_name;set=set_name;set-delete=true;"

新命令在几个方面更好:

  • 可以在迁移期间发布
  • 可以在将数据写入集合
  • 时发出
  • 仅在群集的一个节点上运行它就足够了

我在这些条件下使用它(在迁移期间,在1节点上写入数据时)它运行得非常快。拥有3000万条记录的集合在大约6秒内减少到1000条记录。 (那些1000条记录可能是那些在6秒内写的)

详情here

答案 2 :(得分:2)

您也可以使用Java客户端删除集合,如下所示:

(1)使用客户端"执行"方法,在所有查询的行上应用UDF

AerospikeClient.execute(WritePolicy policy, Statement statement, String packageName, String functionName, Value... functionArgs) throws AerospikeException

(2)定义语句以包括给定集合的所有行:

Statement statement = new Statement();
statement.setNamespace("my_namespace");
statement.setSetName("my_set");

(3)指定删除给定记录的UDF:

function delete_rec(rec)
    aerospike:remove(rec)
end

(4)调用方法:

ExecuteTask task = AerospikeClient.execute(null, statement, "myUdf", "delete_rec")
task.waitTillComplete(timeout);

性能如何?不清楚,但我猜是asinfo更好。但它对测试/调试/设置非常方便。

答案 3 :(得分:1)

您无法删除集,但可以通过扫描所有记录并逐个删除来删除集中存在的所有记录。样本C#代码可以解决这个问题:

AerospikeClient.ScanAll(null, AerospikeNameSpace, category, DeleteAllRecordsCallBack);

此处DeleteAllRecordsCallBack是一个回调函数,您可以逐个删除记录。为所有记录调用此回调函数。

private void DeleteAllRecordsCallBack(Key key, Record record)
{
    AerospikeClient.Delete(null, key);
}

答案 4 :(得分:1)

自2017年3月发布的Aerospike 3.12起,数据库现在支持删除集合或命名空间中的所有数据的功能。

请参阅以下文档: http://www.aerospike.com/docs/reference/info#truncate

它提供了如下命令行命令: asinfo truncate:namespace =; set =; lut =

它也可以从客户端API中截断,这里是java文档: http://www.aerospike.com/apidocs/java/com/aerospike/client/AerospikeClient.html 并向下滚动到"截断"方法

请注意,此功能可以选择采用时间规范。这允许您删除记录,然后开始插入新记录。使用时间戳时,请确保您的服务器时钟同步良好。

答案 5 :(得分:0)

请注意,您需要重新启动节点(一个接一个以避免停机),因为您不会检索垃圾箱剩余空间。

我的意思是Aerospike的最高限额是32,767。如果你只删除并重新设置几次你的设置,如果它每次创建10000个垃圾箱,你将无法在第四次创建超过2,767个垃圾箱,因为垃圾箱计数器保留在ram中。

如果您重新启动群集,它将被释放。

答案 6 :(得分:0)

您无法动态删除RDMS中“drop table”等名称空间中的集合。

以下使用asinfo的命令只是懒惰地删除集合中的数据:

asinfo -v "set-config:context=namespace;id=namespace_name;set=set_name;set-delete=true;"

在airospike讨论网站上有一个post,我还没有看到关于这个问题的进展。

答案 7 :(得分:0)

在我们的制作体验中,即使最近没有引入java deletion utility,特殊durable deletes也能很好地发挥作用。您从源代码构建它,放在集群附近并以这种方式运行:

java -jar delete-set-1.0.0-jar-with-dependencies.jar -h <aerospike_host> -p 3000 -s <set_to_delete> -n <namespace_name>

在我们的生产环境中,冷启动是非常罕见的事件,基本上是在空气动力学崩溃时。并且数据流量非常高,因此碎片整理早期开始,我们甚至没有僵尸记录问题。

前面提到的BTW asinfo方式对我们不起作用。记录在那里停留了几天,所以我们使用delete-set实用工具立即工作。

答案 8 :(得分:0)

使用AQL:

from django.db import connection
with connection.cursor() as cursor:
    cursor.execute(insert_query)

https://www.aerospike.com/docs/tools/aql/aql-help.html