状況 #
mattermostでは、ユーザーが削除したメッセージはDB内では削除フラグが立つだけでレコードに残っているので、それを消したい。
関連情報
- Deleted posts stay inside the DB for some time: 🔗https://forum.mattermost.com/t/deleted-posts-stay-inside-the-db-for-some-time/759
- How to delete old messages automatically in a channel?: 🔗https://forum.mattermost.com/t/how-to-delete-old-messages-automatically-in-a-channel/13397
DBを弄る #
ver 10.xあたりからmattermostはmysqlを捨ててpostgresに完全移行するらしい。
以下の情報はすべてpostgresを想定している。
- DB構造把握
\d channels
\d posts
- channel一覧を確認して、削除したくないchannelのidをコピペ
select id, displayname, name from channels;
- 投稿をSELECTして確認
以下、参考クエリ。
SELECT message FROM posts
WHERE NOT EXISTS (
SELECT 1 FROM (VALUES
('削除したくないchannelのidをここに入れていく'),
('2つめ'),
) AS keep(channelid)
WHERE posts.channelid = keep.channelid
) LIMIT 20;
日本語で説明すると、どれかひとつでもkeep.channelidと一致するとSELECT 1が返るので、それが返らないpostsのみSELECTする。
- 良さげなら、クエリをいじってDELETEに変えて削除
仕事や重要な環境では、DBのバックアップを取って、トランザクションを張りましょう
やっぱ張っとけ 🔗https://www.postgresql.org/docs/current/tutorial-transactions.html
一応軽く説明しておくと、BEGIN(トランザクション開始)してDELETEして、SELECTしてokそうであればCOMMIT(変更確定)、ミスってたらROLLBACK(変更確定しない)でもとに戻せる。
バックアップについては 🔗pg_dump, 🔗pg_dumpall, 🔗pg_basebackupなどを調べてくれ。
Chapter 25. Backup and Restore: 🔗https://www.postgresql.org/docs/current/backup.html
What is recommended way to do a PostgreSQL database backup: pg_dump or pg_basebackup?: 🔗https://stackoverflow.com/questions/62653659/what-is-recommended-way-to-do-a-postgresql-database-backup-pg-dump-or-pg-baseba
おわり #
mattermostは十分に複雑なソフトウェアなので、DBを抜かれたときの事を考えて定期的にカルマを落としておく必要がある。