Ошибка Index_users_on_username_lower при восстановлении базы данных: импорт не удался

Привет!

Вчера вечером у меня возникла серьёзная проблема на форуме, и мне пришлось всё восстановить заново. Однако в процессе восстановления возникла ошибка, и процесс не удался. Вот текст ошибки:

ERROR:  could not create unique index "index_users_on_username_lower"
DETAIL:  Key (username_lower)=(lea) is duplicated.
EXCEPTION: psql failed: DETAIL:  Key (username_lower)=(lea) is duplicated.

Думаю, это может быть связано с входом через Twitter, но может ли процесс восстановления изменить значение username_lower, если оно дублируется? Я не думаю, что смогу изменить это в SQL-файле (он довольно большой) и затем снова загрузить его.

Ещё один случай повреждения индекса базы данных, о котором уже упоминалось здесь: Critical Error: changed username, user got broken

Не знаю, с какой именно проблемой вы столкнулись, из-за которой пришлось восстановить резервную копию, но она может быть связана с этим.

Это была другая проблема: сервер не мог получить доступ к pups.git, ошибка «Не удалось разрешить хост: github.com». Я попробовал решения, найденные вчера вечером, но они не помогли.

С восстановлением, похоже, проблема касается только одного имени пользователя (возможно, связанного с созданием аккаунта в один клик через Twitter или чего-то подобного). Я пытаюсь исправить это вручную, но работа с SQL-файлом размером 1 ГБ — не самый удобный вариант.

Редактирование: с помощью редактора vim я смог отредактировать SQL-файл и найти нужные строки. Восстановление прошло успешно. Мне осталось только пересобрать всё, и всё будет готово.

Существовали учётные записи с именем “Lea” и “lea”. Странно, что Discourse позволил такое. Это довольно старый форум (июнь 2014 года), и я часто его обновлял, так что, возможно, это было связано с конкретной версией.

День был безумным, но я попробую объяснить, как я всё исправил, на случай, если у кого-то, как у меня, будет действительно :upside_down_face: невероятное невезение.

  1. Скачайте резервную копию. Распакуйте её несколько раз, пока у вас не появится файл dump.sql.

  2. Отредактируйте файл dump.sql с помощью программы, например, vim download : vim online.

  3. Я ужасно разбираюсь в SQL. Чтобы найти нужную таблицу, я искал username_lower,. Это указало мне на таблицу users, затем я искал «lea». Я отредактировал две записи с именем Lea. Вероятно, это можно было сделать гораздо проще. Но помните, я плохо знаю SQL, особенно когда файлы размером 1,5 ГБ. Сохраните файл.

  4. Сожмите файл dump.sql с помощью 7zip. У вас должен появиться новый файл с именем: dump.sql.gz.

  5. Создайте новую папку в :file_folder: /var/discourse/shared/standalone/backups/default/. Я использовал название test.

  6. Если у вас хорошее интернет-соединение, загрузите папку :file_folder: uploads, которую вы получили при распаковке файла резервной копии, и поместите её в /var/discourse/shared/standalone/backups/default/test/.
    6.1 Если у вас нет хорошего соединения, как у меня, вам нужно использовать ваш сервер. Запомните имя вашего файла резервной копии и выполните эту команду: tar xvzf /var/discourse/shared/standalone/backups/default/yourbackupfile.tar.gz -C /var/discourse/shared/standalone/backups/default/test.
    6.2 В папке test у вас будут файлы dump.sql.gz и папка uploads. Всё в порядке.

  7. Загрузите файл dump.sql.gz из вашей папки test, чтобы заменить повреждённый dump.sql.gz.

  8. На вашем сервере перейдите в директорию: cd /var/discourse/shared/standalone/backups/default/test.

  9. Вам нужно создать новый файл резервной копии. Используйте точное имя старого файла резервной копии: tar -czvf yourbackupfile.tar.gz uploads/ dump.sql.gz.

  10. Через FTP перейдите в :file_folder: /var/discourse/shared/standalone/backups/default/, удалите повреждённую резервную копию или переместите её в другую папку.

  11. Переместите новый файл резервной копии в /var/discourse/shared/standalone/backups/default/.

  12. Восстановите резервную копию. Я предпочитаю этот метод, и если вы добрались до этого шага, у вас должно получиться использовать его без проблем: Restore a backup from the command line.

Резервное копирование должно завершиться успешно :sweat_smile:

Легко.