有没有办法从aql或CLI中删除命名空间(Aerospike)中的一个集合?
我的设置还包含Ldts。
请建议我从LDT中删除整个Set的方法
答案 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>
在我们的生产环境中,冷启动是非常罕见的事件,基本上是在空气动力学崩溃时。并且数据流量非常高,因此碎片整理早期开始,我们甚至没有僵尸记录问题。
前面提到的BTWasinfo
方式对我们不起作用。记录在那里停留了几天,所以我们使用delete-set
实用工具立即工作。
答案 8 :(得分:0)
使用AQL:
from django.db import connection
with connection.cursor() as cursor:
cursor.execute(insert_query)