# Gelöschte Beiträge dauerhaft in großen Mengen löschen?

**URL:** https://meta.discourse.org/t/delete-deleted-posts-permanently-in-bulk/203289
**Category:** Support
**Created:** [12. September 2021 um 04:15 UTC](https://meta.discourse.org/t/delete-deleted-posts-permanently-in-bulk/203289 "2021-09-12T04:15:12Z")
**Posts on this page:** 20
**Page:** 2

<div class="post-metadata">

### Author: ![mstm](https://avatars.discourse-cdn.com/v4/letter/m/6de8d8/32.png) [@mstm](https://meta.discourse.org/u/mstm)
#### Post date: [17. September 2021 um 16:52 UTC](https://meta.discourse.org/t/delete-deleted-posts-permanently-in-bulk/203289/21 "2021-09-17T16:52:28Z")

</div>

Entschuldige, falls das eine dumme Frage ist …  
Warum ist es bei Discourse nicht möglich, Nachrichten einfach aus der Datenbank zu löschen?

---

<div class="post-metadata">

### Author: ![RGJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rgj/32/523185_2.png) [@RGJ](https://meta.discourse.org/u/RGJ)
#### Post date: [17. September 2021 um 17:26 UTC](https://meta.discourse.org/t/delete-deleted-posts-permanently-in-bulk/203289/22 "2021-09-17T17:26:46Z")

</div>

Discourse verwendet einen Mechanismus namens „Soft Delete", der das Korrigieren von Fehlern erleichtert. Zudem lässt sich dadurch unterscheiden, ob ein Beitrag „für andere Benutzer" oder „nur für Administratoren" gelöscht wurde.

Außerdem bleibt die Integrität der Datenbank gewahrt. Was wäre, wenn ein gelöschter Beitrag zuvor zitiert wurde? Dann würde der zitierende Beitrag auf einen Beitrag verweisen, der nicht mehr existiert. Das könnte zu allen möglichen Fehlern führen.

---

<div class="post-metadata">

### Author: ![mstm](https://avatars.discourse-cdn.com/v4/letter/m/6de8d8/32.png) [@mstm](https://meta.discourse.org/u/mstm)
#### Post date: [17. September 2021 um 17:35 UTC](https://meta.discourse.org/t/delete-deleted-posts-permanently-in-bulk/203289/23 "2021-09-17T17:35:48Z")

</div>

Danke, jetzt verstehe ich… das einzige Problem ist, wenn es viele gelöschte Nachrichten gibt.

---

<div class="post-metadata">

### Author: ![TallTrees](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/talltrees/32/208620_2.png) [@TallTrees](https://meta.discourse.org/u/TallTrees)
#### Post date: [17. September 2021 um 17:48 UTC](https://meta.discourse.org/t/delete-deleted-posts-permanently-in-bulk/203289/24 "2021-09-17T17:48:17Z")

</div>

Das wurde bereits mehrfach diskutiert und angefragt, z. B.:

> [@How to remove post completely?](https://meta.discourse.org/t/how-to-remove-post-completely/50514):
>
> Hey there! I want to remove a post completely. For example can I delete post shown below? I don’t want to see this deleted post shown in red, even if they’re only visible to staff. (If you wondered why I want to remove it, because I have obsession.) I think discourse is a very pleasant forum software. But sometimes it makes me laugh. I can do a lot of thing as an admin, but I can’t delete post completely… What a contradiction! blush

Ich verstehe, dass ein Soft-Delete sinnvoll sein kann, aber es wäre wünschenswert, dass gelöschte Inhalte nach einer gewissen Frist (z. B. eine Woche oder einen Monat) tatsächlich entfernt werden, um Speicherplatz zu sparen und die Einhaltung gesetzlicher Vorschriften sicherzustellen – etwa wenn illegale Inhalte gepostet wurden oder personenbezogene Daten gemäß der DSGVO entfernt werden müssen.

Es ist etwas umständlich, sich einzuloggen und einen Rake-Task auszuführen, um die Nachricht durch „Dies wurde gelöscht" zu ersetzen.

---

<div class="post-metadata">

### Author: ![mstm](https://avatars.discourse-cdn.com/v4/letter/m/6de8d8/32.png) [@mstm](https://meta.discourse.org/u/mstm)
#### Post date: [17. September 2021 um 18:02 UTC](https://meta.discourse.org/t/delete-deleted-posts-permanently-in-bulk/203289/25 "2021-09-17T18:02:36Z")

</div>

> [@TallTrees](#):
>
> Das wurde schon vorher diskutiert und gewünscht.

Ups… Entschuldigung, von phpBB kommend, dachte ich, das wäre möglich.

---

<div class="post-metadata">

### Author: ![IAmGav](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/iamgav/32/235598_2.png) [@IAmGav](https://meta.discourse.org/u/IAmGav)
#### Post date: [13. Oktober 2021 um 12:55 UTC](https://meta.discourse.org/t/delete-deleted-posts-permanently-in-bulk/203289/26 "2021-10-13T12:55:32Z")

</div>

Es ist jetzt implementiert

> <https://github.com/discourse/discourse/commit/c4843fc1c18fc9fb077d61e59615f54c4735bb42>
>
> Sometimes administrators want to permanently delete posts and topics
> from the d…atabase. To make sure that this is done for a good reasons,
> administrators can do this only after one minute has passed since the
> post was deleted or immediately if another administrator does it.

---

<div class="post-metadata">

### Author: ![rahulMasal](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rahulmasal/32/213255_2.png) [@rahulMasal](https://meta.discourse.org/u/rahulMasal)
#### Post date: [13. Oktober 2021 um 13:08 UTC](https://meta.discourse.org/t/delete-deleted-posts-permanently-in-bulk/203289/27 "2021-10-13T13:08:39Z")

</div>

Beste Grüße,

Aber wie machen wir das???

---

<div class="post-metadata">

### Author: ![JammyDodger](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jammydodger/32/254611_2.png) [@JammyDodger](https://meta.discourse.org/u/JammyDodger)
#### Post date: [13. Oktober 2021 um 13:53 UTC](https://meta.discourse.org/t/delete-deleted-posts-permanently-in-bulk/203289/28 "2021-10-13T13:53:22Z")

</div>

Ich habe das heute Morgen ausprobiert, aber ich komme nicht weiter. 🙂 Hast du einen Tipp?

---

<div class="post-metadata">

### Author: ![IAmGav](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/iamgav/32/235598_2.png) [@IAmGav](https://meta.discourse.org/u/IAmGav)
#### Post date: [13. Oktober 2021 um 13:55 UTC](https://meta.discourse.org/t/delete-deleted-posts-permanently-in-bulk/203289/29 "2021-10-13T13:55:37Z")

</div>

Nun, die Einstellung muss unter Admin \> Einstellungen \> Sicherheit gesetzt werden (derzeit aus irgendeinem Grund ausgeblendet), und dann müsste jeder Admin diese Berechtigung wie bei einem Moderator erhalten.

Sobald sie erteilt ist, erscheint sie im Admin-Menü für Beiträge.

---

<div class="post-metadata">

### Author: ![JammyDodger](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jammydodger/32/254611_2.png) [@JammyDodger](https://meta.discourse.org/u/JammyDodger)
#### Post date: [13. Oktober 2021 um 14:01 UTC](https://meta.discourse.org/t/delete-deleted-posts-permanently-in-bulk/203289/30 "2021-10-13T14:01:39Z")

</div>

> [@IAmGav](#):
>
> (derzeit aus irgendeinem Grund ausgeblendet)

Ah, das könnte mein Stolperstein sein. Ich habe in den Admin-Einstellungen nach `can_permanently_delete` gesucht und konnte es nicht finden.

---

<div class="post-metadata">

### Author: ![nbianca](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nbianca/32/157984_2.png) [@nbianca](https://meta.discourse.org/u/nbianca)
#### Post date: [14. Oktober 2021 um 16:45 UTC](https://meta.discourse.org/t/delete-deleted-posts-permanently-in-bulk/203289/31 "2021-10-14T16:45:24Z")

</div>

Die Site-Einstellung ist ausgeblendet, da wir ihre Verwendung nicht empfehlen. Sie wurde für Fälle entwickelt, in denen sensible Informationen veröffentlicht wurden und diese vollständig aus der Datenbank entfernt werden müssen. Außerdem handelt es sich bei dieser Operation ohnehin nicht um eine Massenoperation.

Da es sich um eine ausgeblendete Site-Einstellung handelt, kann sie nur über die Konsole aktiviert werden.

---

<div class="post-metadata">

### Author: ![nathank](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nathank/32/290039_2.png) [@nathank](https://meta.discourse.org/u/nathank)
#### Post date: [14. Oktober 2021 um 19:04 UTC](https://meta.discourse.org/t/delete-deleted-posts-permanently-in-bulk/203289/32 "2021-10-14T19:04:30Z")

</div>

> [@RGJ](#):
>
> Post.with\_deleted.where(‘deleted\_at is not null’).update\_all(raw: ‘Dieser Beitrag wurde gelöscht’, cooked: ‘Dieser Beitrag wurde gelöscht’)

Das ist fast genau das, was ich brauche! Danke.

Wie müsste ich die Syntax schreiben, damit sie nur alle Beiträge abdeckt, die vor dem xxxx-Datum gelöscht wurden?

---

<div class="post-metadata">

### Author: ![RGJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rgj/32/523185_2.png) [@RGJ](https://meta.discourse.org/u/RGJ)
#### Post date: [15. Oktober 2021 um 06:20 UTC](https://meta.discourse.org/t/delete-deleted-posts-permanently-in-bulk/203289/33 "2021-10-15T06:20:09Z")

</div>

Das wäre `Post.with_deleted.where("deleted_at < 'YYYY-mm-dd'").update_all(...)`.

---

<div class="post-metadata">

### Author: ![RBoy](https://avatars.discourse-cdn.com/v4/letter/r/2bfe46/32.png) [@RBoy](https://meta.discourse.org/u/RBoy)
#### Post date: [21. Oktober 2021 um 14:34 UTC](https://meta.discourse.org/t/delete-deleted-posts-permanently-in-bulk/203289/34 "2021-10-21T14:34:02Z")

</div>

Können Sie uns bitte mitteilen, wie man es über die Konsole aktiviert?

---

<div class="post-metadata">

### Author: ![JammyDodger](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jammydodger/32/254611_2.png) [@JammyDodger](https://meta.discourse.org/u/JammyDodger)
#### Post date: [21. Oktober 2021 um 14:50 UTC](https://meta.discourse.org/t/delete-deleted-posts-permanently-in-bulk/203289/35 "2021-10-21T14:50:42Z")

</div>

Hier sind die Anweisungen:

> [@Enable setting to allow admins to permanently delete data](https://meta.discourse.org/t/enable-the-hidden-can-permanently-delete-site-setting/206678):
>
> bookmark This is a guide on how to enable the setting for administrators to permanently delete data on a Discourse instance. person_raising_hand Required user level: System Admin wrench Console access required As of [2.8.0.beta7: Security Release, Fast Edits, Topic Bookmarks, and more](https://meta.discourse.org/t/2-8-0-beta7-security-release-fast-edits-topic-bookmarks-and-more/206578#permanent-deletion-of-posts-and-topics-11) there is a hidden site setting to allow admins to permanently delete data. Enabling permanent deletion via the Rails console To enable the setting using the Rails console, execute the following commands: …

---

<div class="post-metadata">

### Author: ![rahulMasal](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rahulmasal/32/213255_2.png) [@rahulMasal](https://meta.discourse.org/u/rahulMasal)
#### Post date: [22. Oktober 2021 um 02:43 UTC](https://meta.discourse.org/t/delete-deleted-posts-permanently-in-bulk/203289/36 "2021-10-22T02:43:31Z")

</div>

> [@JammyDodger](#):
>
> can\_permanently\_delete

Funktion über die Konsole aktiviert, aber wie kann ich gelöschte Beiträge endgültig löschen? Alle Beiträge sind in „gelöschte Beiträge" enthalten.

---

<div class="post-metadata">

### Author: ![JammyDodger](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jammydodger/32/254611_2.png) [@JammyDodger](https://meta.discourse.org/u/JammyDodger)
#### Post date: [22. Oktober 2021 um 12:51 UTC](https://meta.discourse.org/t/delete-deleted-posts-permanently-in-bulk/203289/37 "2021-10-22T12:51:43Z")

</div>

Ich bin zwar kein Experte auf diesem Gebiet, aber es scheint, als gäbe es in diesem Thema genügend Informationsfragmente, um den von dir gesuchten Code zu erstellen.

Das Thema, das ich am Anfang verlinkt habe, enthält Warnungen der Entwickler dazu, dass dies Neuland ist und du es auf eigenes Risiko durchführst. Sie stellen jedoch auch das „destroy\_all"-Element bereit, das nützlich erscheint, und empfehlen, zunächst mit Batches zu arbeiten.

In diesem Thema gibt es zudem ein paar Beispiele, wie man entweder Beiträge oder Themen anspricht, was (in Kombination mit den Beispielen von @RGJ zum Ansprechen bestimmter Beiträge) dich sehr weit bringen sollte.

Ich habe jedoch keine Erfahrung damit, daher kann ich es leider nicht freigeben, da ich es noch nie selbst ausprobiert habe. 🤷‍♂️

---

<div class="post-metadata">

### Author: ![nathank](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nathank/32/290039_2.png) [@nathank](https://meta.discourse.org/u/nathank)
#### Post date: [30. Oktober 2021 um 00:27 UTC](https://meta.discourse.org/t/delete-deleted-posts-permanently-in-bulk/203289/38 "2021-10-30T00:27:37Z")

</div>

Um alte Beiträge in unserem Forum zu löschen, habe ich dies verwendet. Es ist das Ergebnis einer Kombination aus [The proper way to completely delete hundred of topics via rails?](https://meta.discourse.org/t/the-proper-way-to-completely-delete-hundred-of-topics-via-rails/90323) und den Vorschlägen von @RGJ.

Ich habe mich schließlich dafür entschieden, da ich die Daten unbedingt aus der Datenbank entfernen wollte, um die Privatsphäre der Nutzer zu schützen. Das Ersetzen des Texts durch „Dieser Beitrag wurde gelöscht" lässt den Bearbeitungsverlauf intakt und relativ leicht zugänglich, was also nicht ausreicht.

Da wir 20.000 Themen zu löschen hatten, hat es eine Weile gedauert!

```plaintext
Topic.with_deleted.where("deleted_at < '2021-08-28'").limit(1000).destroy_all

```

Da dies viele verwaiste Beiträge hinterließ, musste ich dies mit folgendem Befehl nachbessern:

```plaintext
Post.where('topic_id not in (select id from topics)').limit(1000).destroy_all

```

---

<div class="post-metadata">

### Author: ![IAmGav](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/iamgav/32/235598_2.png) [@IAmGav](https://meta.discourse.org/u/IAmGav)
#### Post date: [30. Oktober 2021 um 06:22 UTC](https://meta.discourse.org/t/delete-deleted-posts-permanently-in-bulk/203289/39 "2021-10-30T06:22:20Z")

</div>

Ich stelle mir vor, dass dein `./launcher cleanup` danach auch noch etwas Speicherplatz freigemacht hat 🙂

---

<div class="post-metadata">

### Author: ![nathank](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nathank/32/290039_2.png) [@nathank](https://meta.discourse.org/u/nathank)
#### Post date: [2. November 2021 um 23:33 UTC](https://meta.discourse.org/t/delete-deleted-posts-permanently-in-bulk/203289/40 "2021-11-02T23:33:50Z")

</div>

> [@nathank](#):
>
> Da dies viele verwaiste Beiträge hinterlassen hat, musste ich das mit folgendem Befehl nachbessern:
> 
> ```plaintext
> Post.where('topic_id not in (select id from topics)').limit(1000).destroy_all
> 
> ```

Leider ist die Tabelle `posts` trotz erfolgreich ausgeführten Befehls immer noch voller verwaister Beiträge. Die Tabelle `topics` wurde hingegen sauber bereinigt. Die Beiträge sind nicht erreichbar, wenn ich versuche, sie über /t/topic\_id aufzurufen, was wahrscheinlich daran liegt, dass keine gültige Topic-ID vorliegt. Ich verstehe jedoch nicht ganz, warum sie trotzdem noch in der Tabelle vorhanden sind.

Hat jemand einen besseren Vorschlag, wie man die Tabelle `posts` bereinigen kann?

[Previous page](https://meta.discourse.org/t/delete-deleted-posts-permanently-in-bulk/203289.md?page=1)

[Next page](https://meta.discourse.org/t/delete-deleted-posts-permanently-in-bulk/203289.md?page=3)
