7

有什么方法可以从 aql 或 CLI 的命名空间(Aerospike)中删除一个集合???

我的集合还包含 Ldts 。

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

4

9 回答 9

11

您可以使用删除集合

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

于 2015-02-06T13:29:13.987 回答
4

从 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 秒内写的)

详情在这里

于 2017-10-24T22:11:51.213 回答
3

从 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 并向下滚动到“截断”方法。

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

于 2017-03-30T02:36:11.640 回答
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是更好。但它对于测试/调试/设置非常方便。

于 2016-01-12T04:42:53.347 回答
1

使用 AQL:

TRUNCATE namespace_name.set_name

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

于 2020-04-19T19:31:00.573 回答
1

您不能删除集合,但您可以通过扫描所有记录并逐个删除来删除集合中存在的所有记录。可以解决问题的示例 C# 代码:

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

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

private void DeleteAllRecordsCallBack(Key key, Record record)
{
    AerospikeClient.Delete(null, key);
}
于 2016-06-15T14:12:05.393 回答
0

请注意,您需要重新启动节点(一个接一个以避免停机),因为您不会取回剩余空间的 bin。

我的意思是 Aerospike 中垃圾箱的最大限制是 32,767。如果您只是多次删除并重新创建您的集合,例如每次创建 10000 个 bin,您将无法在第四次创建超过 2,767 个 bin,因为 bin 计数器保存在 ram 中。

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

于 2015-07-03T09:46:40.923 回答
0

在我们的生产经验中,即使没有最近引入的持久删除,特殊的java 删除实用程序也能很好地工作。你从源代码构建它,放在集群附近的某个地方并以这种方式运行:

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

在我们的 prod 环境中,冷重启是非常罕见的事件,基本上是在 aerospike 崩溃时。而且数据流非常高,因此碎片整理更早开始,我们甚至没有僵尸记录问题。

顺便说一句asinfo,前面提到的方式对我们不起作用。记录在那里停留了几天,所以我们使用delete-set了可以立即工作的实用程序。

于 2016-11-23T11:23:40.133 回答
0

您不能从命名空间中动态删除集合,例如 RDMS 中的“drop table”。

以下使用 asinfo 的命令只会延迟删除集合内的数据:

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

在 aerospike 讨论网站上有一篇关于它的帖子,我还没有看到关于这个问题的进展。

于 2016-05-07T03:30:44.607 回答