Add post about my Mastodon DB hickup
This commit is contained in:
parent
7d13a05f32
commit
4429b381d0
169
content/blog/mastodon-database-hickup.rst
Normal file
169
content/blog/mastodon-database-hickup.rst
Normal file
@ -0,0 +1,169 @@
|
|||||||
|
Mastodon database hickup
|
||||||
|
########################
|
||||||
|
|
||||||
|
:date: 2020-04-23T11:17Z
|
||||||
|
:category: blog
|
||||||
|
:tags: postgresql,mastodon
|
||||||
|
:url: blog/mastodon-database-hickup/
|
||||||
|
:save_as: blog/mastodon/database-hickup/index.html
|
||||||
|
:status: published
|
||||||
|
:author: Gergely Polonkai
|
||||||
|
|
||||||
|
|
||||||
|
After being online for almost a year, my `Mastodon instance <https://social.polonkai.eu>`_ is back
|
||||||
|
up. However, it wasn’t as straightforward as i wanted it to be.
|
||||||
|
|
||||||
|
About a year ago my Mastodon server went down. I messed up my docker images big time and the
|
||||||
|
then-new version 2.8.4 didn’t want to start up. I left it there, and as i had a pretty rough year
|
||||||
|
(in the good sense) i didn’t have time to bring it up again.
|
||||||
|
|
||||||
|
One of the constant problems i had with this instance is the size of the attachment directory. It
|
||||||
|
easily grew to an enormous size in no time, so i had to constantly clean things up. Plus, it took
|
||||||
|
away the precious space away from my other projects. So my first move was moving all these files
|
||||||
|
to a DigitalOcean Space; with the ``awscli`` Python package it was easy as pie. If you want to do
|
||||||
|
it, too, i followed `this article
|
||||||
|
<https://angristan.xyz/2018/05/moving-mastodon-media-files-to-wasabi-object-storage/>`_.
|
||||||
|
|
||||||
|
Next came the database.
|
||||||
|
|
||||||
|
I tried to load the database dump, created using ``pg_dump -f mastodon.sql mastodon``, with
|
||||||
|
``psql -f mastodon.sql``. Everything went fine, all the records created, except this error
|
||||||
|
message:
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
psql:mastodon-dump.sql:1691661: ERROR: could not create unique index "index_tags_on_name"
|
||||||
|
DETAIL: Key (name)=(opensource) is duplicated.
|
||||||
|
|
||||||
|
First i tried to ignore it, but running `rails db:migrate` failed when it wanted to manipulate
|
||||||
|
this index.
|
||||||
|
|
||||||
|
So i issued this query:
|
||||||
|
|
||||||
|
.. code-block:: sql
|
||||||
|
|
||||||
|
SELECT COUNT(*) AS count, name FROM tags GROUP BY name HAVING COUNT(*) > 1;
|
||||||
|
|
||||||
|
And the result was this:
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
count | name
|
||||||
|
2 | opensource
|
||||||
|
2 | xmpp
|
||||||
|
2 | fdroid
|
||||||
|
2 | socialmedia
|
||||||
|
2 | blogging
|
||||||
|
2 | c64
|
||||||
|
2 | blog
|
||||||
|
|
||||||
|
Then collected the IDs of these duplicate tag records using this query:
|
||||||
|
|
||||||
|
.. code-block:: sql
|
||||||
|
|
||||||
|
SELECT id, name, created_at
|
||||||
|
FROM tags
|
||||||
|
WHERE name in ('opensource',
|
||||||
|
'xmpp',
|
||||||
|
'fdroid',
|
||||||
|
'socialmedia',
|
||||||
|
'blogging',
|
||||||
|
'c64',
|
||||||
|
'blog')
|
||||||
|
ORDER BY name, created_at;
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
id | name | created_at
|
||||||
|
-------+-------------+------------
|
||||||
|
159 | blog | 2018-02-24 19:56:01.710702
|
||||||
|
15941 | blog | 2019-04-03 22:05:56.438488
|
||||||
|
158 | blogging | 2018-02-24 19:56:01.721354
|
||||||
|
16006 | blogging | 2019-04-09 12:13:20.852976
|
||||||
|
5441 | c64 | 2018-07-31 00:50:56.172468
|
||||||
|
16036 | c64 | 2019-04-14 19:56:40.692197
|
||||||
|
924 | fdroid | 2018-04-14 19:39:21.261817
|
||||||
|
15947 | fdroid | 2019-04-04 19:10:50.190317
|
||||||
|
237 | opensource | 2018-03-05 21:50:52.609723
|
||||||
|
15929 | opensource | 2019-04-03 11:49:21.772961
|
||||||
|
251 | socialmedia | 2018-03-06 23:02:33.573775
|
||||||
|
16034 | socialmedia | 2019-04-14 19:07:37.081635
|
||||||
|
519 | xmpp | 2018-03-28 16:02:05.023784
|
||||||
|
15988 | xmpp | 2019-04-07 08:06:59.429965
|
||||||
|
|
||||||
|
I wanted to see the ``created_at`` field just to know when things got bad. As it turns out, it
|
||||||
|
was around April 2019, so it might have happened with the 2.8.0 upgrade. Was it me, or some
|
||||||
|
problem with the migrations remains a mistery.
|
||||||
|
|
||||||
|
I also wanted to know about all the tables referencing tags:
|
||||||
|
|
||||||
|
.. code-block:: sql
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
tc.table_name, kcu.column_name
|
||||||
|
FROM
|
||||||
|
information_schema.table_constraints AS tc
|
||||||
|
JOIN information_schema.key_column_usage AS kcu
|
||||||
|
ON tc.constraint_name = kcu.constraint_name
|
||||||
|
JOIN information_schema.constraint_column_usage AS ccu
|
||||||
|
ON ccu.constraint_name = tc.constraint_name
|
||||||
|
WHERE constraint_type = 'FOREIGN KEY' AND ccu.table_name = 'tags';
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
table_name | column_name
|
||||||
|
-------------------+-------------
|
||||||
|
statuses_tags | tag_id
|
||||||
|
account_tag_stats | tag_id
|
||||||
|
|
||||||
|
And last, but not least, i had to massage the dump a bit. After creating a backup, i opened up
|
||||||
|
the file in ViM and looked for the place where it was loading the data into the ``tags`` table.
|
||||||
|
It looked like this:
|
||||||
|
|
||||||
|
.. code-block:: sql
|
||||||
|
|
||||||
|
COPY public.tags (name, created_at, updated_at, id) FROM stdin;
|
||||||
|
blogging 2018-02-24 19:56:01.710702 2018-02-24 19:56:01.710702 158
|
||||||
|
blog 2018-02-24 19:56:01.721354 2018-02-24 19:56:01.721354 159
|
||||||
|
opensource 2018-03-05 21:50:52.609723 2018-03-05 21:50:52.609723 237
|
||||||
|
socialmedia 2018-03-06 23:02:33.573775 2018-03-06 23:02:33.573775 251
|
||||||
|
xmpp 2018-03-28 16:02:05.023784 2018-03-28 16:02:05.023784 519
|
||||||
|
fdroid 2018-04-14 19:39:21.261817 2018-04-14 19:39:21.261817 924
|
||||||
|
c64 2018-07-31 00:50:56.172468 2018-07-31 00:50:56.172468 5441
|
||||||
|
opensource 2019-04-03 11:49:21.772961 2019-04-03 11:49:21.772961 15929
|
||||||
|
blog 2019-04-03 22:05:56.438488 2019-04-03 22:05:56.438488 15941
|
||||||
|
fdroid 2019-04-04 19:10:50.190317 2019-04-04 19:10:50.190317 15947
|
||||||
|
xmpp 2019-04-07 08:06:59.429965 2019-04-07 08:06:59.429965 15988
|
||||||
|
blogging 2019-04-09 12:13:20.852976 2019-04-09 12:13:20.852976 16006
|
||||||
|
socialmedia 2019-04-14 19:07:37.081635 2019-04-14 19:07:37.081635 16034
|
||||||
|
c64 2019-04-14 19:56:40.692197 2019-04-14 19:56:40.692197 16036
|
||||||
|
|
||||||
|
For every tag, i removed the line with the latest date, and noted their IDs, then went on to the
|
||||||
|
``statuses_tags`` table, which looked like this (i don’t put all rows here as it would take a lot
|
||||||
|
of space):
|
||||||
|
|
||||||
|
.. code-block:: sql
|
||||||
|
|
||||||
|
COPY public.statuses_tags (status_id, tag_id) FROM stdin;
|
||||||
|
101862091116861098 15929
|
||||||
|
|
||||||
|
Here, i had to look for the IDs noted before in the last column (ie. at the end of a line), and
|
||||||
|
for every line i change the newer ID to the old ones (15929 became 237, and so on).
|
||||||
|
|
||||||
|
Finally, the ``account_tag_stats`` table:
|
||||||
|
|
||||||
|
.. code-block:: sql
|
||||||
|
|
||||||
|
COPY public.account_tag_stats (id, tag_id, accounts_count, hidden, created_at, updated_at) FROM stdin;
|
||||||
|
1 15929 0 f 2019-04-03 11:49:21.810564 2019-04-03 11:49:21.810564
|
||||||
|
|
||||||
|
Here, the ID i was looking for is in the second column, so i used the magical ViM regex
|
||||||
|
``^[0-9]\+\t\(15929\|15941\)`` (but with all the other IDs in the parentheses, too), and again
|
||||||
|
changed the new IDs to the old ones.
|
||||||
|
|
||||||
|
I still can’t believe i didn’t mess up the database too much, but it loaded just fine, and the
|
||||||
|
``db:migrate`` command executet just fine.
|
||||||
|
|
||||||
|
I also had some problems with so nginx reverse proxying, but it all turned out well, and my
|
||||||
|
instance is back online after a year. Come follow me at `@gergely@polonkai.eu
|
||||||
|
<https://social.polonkai.eu/@gergely>`_!
|
Loading…
Reference in New Issue
Block a user