【问题标题】:Delete all the queues from RabbitMQ?从 RabbitMQ 中删除所有队列?
【发布时间】:2012-07-12 15:59:15
【问题描述】:

我安装了rabbitmqadmin 并且能够列出所有的交换和队列。如何使用rabbitmqadminrabbitmqctl 删除所有队列。

【问题讨论】:

    标签: rabbitmq rabbitmqctl


    【解决方案1】:

    首先,列出你的队列:

    rabbitmqadmin list queues name

    然后从列表中,你需要手动将它们一一删除:

    rabbitmqadmin delete queue name='queuename'

    由于输出格式的原因,您可以 grep 来自list queues 的响应。或者,如果您只是想清除所有内容(阅读:重置所有设置,将安装恢复到默认状态),请使用:

    rabbitmqctl stop_app
    rabbitmqctl reset    # Be sure you really want to do this!
    rabbitmqctl start_app
    

    【讨论】:

    • 查看rabbitmq中所有待处理的任务:rabbitmqctl list_queues name messages messages_ready \ messages_unacknowledged
    • 请注意,“rabbitmqctl reset”会将一切重置为“出厂设置”。您创建的任何 RabbitMQ 用户、虚拟主机等都会被吹走。
    • 道歉@smartnut007,我已经用免责声明澄清了答案的第二部分。
    • 只是抓取空队列。 rabbitmqctl list_queues | grep 0 | awk '{print $1}' | xargs -I qn rabbitmqadmin delete queue name=qn
    • @au_stan 这将删除名称或计数中包含 0 的所有队列。可能想做grep $'\t0' 什么的。
    【解决方案2】:

    使用management plugin 和策略实际上超级简单:

    • 转到 管理控制台 (localhost:15672)

    • 转到管理标签

    • 转到政策标签(在右侧)

    • 添加政策

    • 填写字段

      • 虚拟主机:选择
      • 名称: 使所有策略失效(稍后删除)
      • 模式: .*
      • 适用于:队列
      • 定义: expires 值为 1(将类型从字符串更改为数字)
    • 保存

    • 再次结帐队列标签

    • 必须删除所有队列

    • 别忘了删除政策!!!!!!

    【讨论】:

    • 在定义中选择“数字”。不适用于默认(“字符串”)
    • 很好的答案,实际上弥补了我的一天。如果您从列表中选择“Exchanges and Queues”,您可以轻松删除 Queues 和 Exchanges。我希望这可能是公认的答案。
    • 非常干净的解决方案,无需在实例 SSH 周围玩耍。
    • 可惜没有人解释如何安装管理插件和策略
    • @MesutA。非常感谢。我认为在这篇文章中有这个链接很好。将它添加到答案中可能会更好,因为可能会清除 cmets。但我现在至少有这个信息
    【解决方案3】:

    使用rabbitmqadmin,您可以使用此单线删除它们:

    rabbitmqadmin -f tsv -q list queues name | while read queue; do rabbitmqadmin -q delete queue name=${queue}; done
    

    【讨论】:

    • 在我的情况下,队列以关键字为前缀,我可以简单地使用egrep,所以我的命令将如下所示:rabbitmqadmin -f tsv -q list queues name | egrep "%search word%" | while read queue; do rabbitmqadmin -q delete queue name=${queue}; done
    【解决方案4】:

    试试这个:

     rabbitmqadmin list queues name | awk '{print $2}' | xargs -I qn rabbitmqadmin delete queue name=qn
    

    【讨论】:

    • 这对我有用,但也显示了*** Not found: /api/queues/%2F/name,因为输出是一个带有“名称”列的 ASCII 表。我将命令调整为 rabbitmqadmin list queues name | awk '!/--|name/ {print $2}' | xargs -I qn rabbitmqadmin delete queue name=qn 来修复它。
    • rabbitmqadmin list queues name | awk {'print$2'} | egrep [^name] | xargs -I qname rabbitmqadmin delete queue name=qname
    【解决方案5】:

    在 Rabbit 3.7.10 版本中,您可以使用 root 权限运行以下命令:

    rabbitmqctl list_queues | awk '{ print $1 }' | xargs -L1 rabbitmqctl delete_queue
    

    【讨论】:

    • 嗯,我已经在基于 Unix 的操作系统上运行了它,它运行成功,只要确保传递给 xargs 命令的结果是好的。
    【解决方案6】:

    如果您没有安装 rabbitmqadmin,请尝试使用 rabbitmqctl 清除队列:

    rabbitmqctl list_queues | awk '{ print $1 }' | xargs -L1 rabbitmqctl purge_queue

    【讨论】:

    • rabbitmqctl 中没有 delete_queuepurge_queue 命令。我想清除很多似乎是自动生成的队列,我不想安装额外的软件,比如rabbitmqadmin...
    • rabbitmqctl purge_queue 在这里手动工作。我只需要添加 -p
    • 与上面@Rolice 所说的相反,delete_queuepurge_queue 都在rabbitmqctl 中可用,我刚刚成功运行它们。也许您使用的是旧版本。
    • 很高兴听到这个消息,这些可能是最近添加的。
    【解决方案7】:

    如果您尝试删除队列,因为它们未使用并且您不想重置,一种选择是通过策略将队列 TTL 设置为非常低,等待队列自动删除TTL 已通过,然后删除策略 (https://www.rabbitmq.com/ttl.html)。

    rabbitmqctl.bat set_policy delq ".*" '{"expires": 1}' --apply-to queues
    

    删除政策

    rabbitmqctl clear_policy delq
    

    请注意,这只适用于未使用队列

    此处为原始信息:http://rabbitmq.1065348.n5.nabble.com/Deleting-all-queues-in-rabbitmq-td30933.html

    【讨论】:

    • 这是最快的方法
    【解决方案8】:

    我创建了一个 deleteRabbitMqQs.sh,它接受参数来搜索队列列表,只选择与您想要的模式匹配的那些。如果您不提供任何参数,它将全部删除!它会向您显示即将删除的队列列表,让您在执行任何破坏性操作之前退出。

    for word in "$@"
    do
            args=true
            newQueues=$(rabbitmqctl list_queues name | grep "$word")
            queues="$queues
    $newQueues"
    done
    if [ $# -eq 0 ]; then
            queues=$(rabbitmqctl list_queues name | grep -v "\.\.\.")
    fi
    
    queues=$(echo "$queues" | sed '/^[[:space:]]*$/d')
    
    if [ "x$queues" == "x" ]; then
            echo "No queues to delete, giving up."
            exit 0
    fi
    
    read -p "Deleting the following queues:
    ${queues}
    [CTRL+C quit | ENTER proceed]
    "
    
    while read -r line; do
            rabbitmqadmin delete queue name="$line"
    done <<< "$queues"
    

    如果您希望对传入的参数进行不同的匹配,您可以更改第四行中的 grep。删除所有队列时,它不会删除其中包含三个连续空格的队列,因为我认为与使用 rabbitmqctl 以不同语言打印其输出的人相比,这种可能性会更少。

    享受吧!

    【讨论】:

      【解决方案9】:

      这是一种使用 PowerShell 的方法。 URL 可能需要更新

      $cred = Get-Credential
       iwr -ContentType 'application/json' -Method Get -Credential $cred   'http://localhost:15672/api/queues' | % { 
          ConvertFrom-Json  $_.Content } | % { $_ } | ? { $_.messages -gt 0} | % {
          iwr  -method DELETE -Credential $cred  -uri  $("http://localhost:15672/api/queues/{0}/{1}" -f  [System.Web.HttpUtility]::UrlEncode($_.vhost),  $_.name)
       }
      

      【讨论】:

      • 注意,这只会删除非空队列。去掉 -gt 子句删除所有队列
      【解决方案10】:

      你可以使用 rabbitmqctl eval 如下:

      rabbitmqctl eval 'IfUnused = false, IfEmpty = true, MatchRegex = 
      <<"^prefix-">>, [rabbit_amqqueue:delete(Q, IfUnused, IfEmpty) || Q <- 
      rabbit_amqqueue:list(), re:run(element(4, element(2, Q)), MatchRegex) 
      =/= nomatch ].' 
      

      以上将删除所有具有名称的虚拟主机中的所有空队列 以“前缀-”开头。 您可以编辑变量 IfUnused, IfEmpty, 和 MatchRegex 根据您的要求。

      【讨论】:

      • 完美适用于无法访问rabbitmqadmin 时。
      • 我发现这比 list_queues 快得多
      • 有人用 RabbitMQ v3.8.2 或更高版本尝试过这个解决方案吗?我似乎遇到了一些未定义的 Erlang 错误。也许需要更新解决方案以反映较新的版本?
      • 我尝试了与上面类似的命令,但在 ^ 下面是我的命令之前出现语法错误。 kubectl exec -n kayaks svc/rabbitmq-ha -- rabbitmqctl --vhost=AM-Dev eval 'IfUnused = false, IfEmpty = true, MatchRegex = >, [rabbit_amqqueue:delete(Q, IfUnused , IfEmpty) || Q
      【解决方案11】:

      使用rabbitmqctl one liner删除所有队列

      rabbitmqctl list_queues | awk '{ print $1 }' | sed 's/Listing//' | xargs -L1 rabbitmqctl purge_queue
      

      【讨论】:

        【解决方案12】:

        你不需要重置 rabbitmq 服务器来删除 non-durable 队列。只需停止服务器并重新启动,它就会删除所有可用的 non-durable 队列。

        【讨论】:

        • 包括持久队列?我不这么认为。我会限定你的答案。
        • 不,不能通过停止服务器来删除持久队列。它们可以从队列下的 RabbitMQ 管理 Web 界面中删除。
        • 实际上是的,这对我有帮助,大约 4500 个自动生成的队列都消失了。这些似乎是不耐用的。谢谢!
        【解决方案13】:

        如果您只想清除非空队列(更快):

        rabbitmqctl list_queues | awk '$2!=0 { print $1 }' | sed 's/Listing//' | xargs -L1 rabbitmqctl purge_queue
        

        对我来说,清除一个队列(空的和非空的)需要 2-3 秒,所以遍历 50 个队列是一件很痛苦的事情,而我只需要清除其中的 10 个(40/50 是空的) )。

        【讨论】:

          【解决方案14】:

          我尝试了 rabbitmqctl 和 reset 命令,但它们非常慢。

          这是我找到的最快的方法(替换您的用户名和密码):

          #!/bin/bash
          
          # Stop on error
          set -eo pipefail
          
          USER='guest'
          PASSWORD='guest'
          
          curl -sSL -u $USER:$PASSWORD http://localhost:15672/api/queues/%2f/ | jq '.[].name' | sed 's/"//g' | xargs -L 1 -I@ curl -XDELETE -sSL -u $USER:$PASSWORD http://localhost:15672/api/queues/%2f/@
          # To also delete exchanges uncomment next line
          # curl -sSL -u $USER:$PASSWORD http://localhost:15672/api/exchanges/%2f/ | jq '.[].name' | sed 's/"//g' | xargs -L 1 -I@ curl -XDELETE -sSL -u $USER:$PASSWORD http://localhost:15672/api/exchanges/%2f/@
          

          注意:这仅适用于默认 vhost /

          【讨论】:

            【解决方案15】:

            这是一个更快的版本(使用 parallel install sudo apt-get install parallel)扩展了 @admenva 的出色答案

            parallel -j 50 rabbitmqadmin -H YOUR_HOST_OR_LOCALHOST -q delete queue name={} ::: $(rabbitmqadmin -H YOUR_HOST_OR_LOCALHOST -f tsv -q list queues name)

            【讨论】:

              【解决方案16】:

              这个命令会删除你所有的队列

              python rabbitmqadmin.py \
                -H YOURHOST -u guest -p guest -f bash list queues | \
              xargs -n1 | \
              xargs -I{} \
                python rabbitmqadmin.py -H YOURHOST -u guest -p guest delete queue name={}
              

              这个脚本超级简单,因为它使用-f bash,将队列输出为一个列表。

              然后我们使用xargs -n1 将其拆分为多个变量

              然后我们使用xargs -I{} 将运行以下命令,并替换命令中的{}

              【讨论】:

              • 我已经尝试了 10 种不同的答案,这是唯一真正有效地删除队列而不杀死我所有其他设置的方法。谢谢!我不敢相信 rabbitmqctl 不只是有一个“删除所有队列”命令。
              • 顺便说一句,要获取rabbitmqadmin,需要到http://yourhost:15672/cli/下载。
              【解决方案17】:

              列出队列,

              ./rabbitmqadmin -f tsv -q list queues
              

              要删除队列,

              ./rabbitmqadmin delete queue name=name_of_queue
              

              【讨论】:

                【解决方案18】:

                我尝试了上述代码,但没有进行任何流式传输。

                sudo rabbitmqctl list_queues | awk '{print $1}' &gt; queues.txt; for line in $(cat queues.txt); do sudo rabbitmqctl delete_queue "$line"; done

                我生成一个包含所有队列名称的文件,并逐行循环以删除它们。对于循环,while read ... 并没有为我做这件事。它总是停在第一个队列名称处。

                【讨论】:

                  【解决方案19】:

                  安装rabbitmqadmin有问题的请先安装python。

                  类 UNIX 操作系统用户需要将 rabbitmqadmin 复制到 PATH 中的一个目录,例如/usr/local/bin.

                  Windows 用户需要确保 Python 在他们的 PATH 上,并以 python.exe rabbitmqadmin 的形式调用 rabbitmqadmin。

                  然后

                  1. 浏览至http://{hostname}:15672/cli/rabbitmqadmin 进行下载。
                  2. 转到包含的文件夹,然后以管理员权限运行 cmd

                  列出队列 python rabbitmqadmin list queues.

                  删除队列 python rabbitmqadmin delete queue name=Name_of_queue

                  删除所有队列

                  1- 声明政策

                  python rabbitmqadmin declare policy name='expire_all_policies' pattern=.* definition={\"expires\":1} apply-to=queues
                  

                  2- 删除策略

                  python rabbitmqadmin  delete policy name='expire_all_policies'
                  

                  【讨论】:

                    【解决方案20】:

                    有一种方法可以在没有脚本和完全重置的情况下删除所有队列和交换。您可以从管理界面删除并重新创建虚拟主机。这甚至适用于 vhost /

                    您唯一需要恢复的是新创建的虚拟主机的权限。

                    【讨论】:

                      【解决方案21】:

                      好的,这个答案的重要限定符: 该问题确实要求使用 rabbitmqctlrabbitmqadmin 来解决此问题,我的答案需要同时使用两者。另外,请注意,这是在 MacOS 10.12.6 和 rabbitmqctlrabbitmqadmin 版本上测试的作为 rabbitmq 3.7.0

                      rabbitmqctl list_queues -p &lt;VIRTUAL_HOSTNAME&gt; name | sed 1,2d | xargs -I qname rabbitmqadmin --vhost &lt;VIRTUAL_HOSTNAME&gt; delete queue name=qname

                      【讨论】:

                        【解决方案22】:

                        另一个选项是删除与队列关联的虚拟主机。这将删除与虚拟主机关联的所有内容,因此请注意,但它既简单又快速。


                        注意:RabbitMQ 团队监控 the rabbitmq-users mailing list,并且有时只回答 * 上的问题。

                        【讨论】:

                          【解决方案23】:
                          rabbitmqadmin list queues|awk 'NR>3{print $4}'|head -n-1|xargs -I qname rabbitmqadmin delete queue name=qname
                          

                          【讨论】:

                          • 运行时收到:head: 非法行数 -- -1
                          • “head -n-1”应该是“head -1”或“head -n 1”