# 修改备份中的数据库以删除重复键标记，以免在还原时失败

**URL:** <https://meta.discourse.org/t/modifying-the-database-inside-of-a-backup-to-remove-a-duplicate-key-tag-so-that-it-doesnt-fail-when-restoring/273039>\
**Category:** Self-hosting\
**Created:** [2023 年7 月 27 日 12:25 UTC](https://meta.discourse.org/t/modifying-the-database-inside-of-a-backup-to-remove-a-duplicate-key-tag-so-that-it-doesnt-fail-when-restoring/273039 "2023-07-27T12:25:26Z")\
**Posts on this page:** 1\
**Showing post:** 1

<div class="post-metadata">

作者： ![Drew-ART](https://avatars.discourse-cdn.com/v4/letter/d/8edcca/32.png) [@Drew-ART](https://meta.discourse.org/u/Drew-ART)\
发布日期： [2023 年7 月 27 日 12:25 UTC](https://meta.discourse.org/t/modifying-the-database-inside-of-a-backup-to-remove-a-duplicate-key-tag-so-that-it-doesnt-fail-when-restoring/273039/1 "2023-07-27T12:25:27Z")

</div>

这篇帖子是我过去 24 小时的精简版，尽管它实际上还没有成功，所以我希望有人能在下面发帖说明哪里出了问题。

我的 Discourse 更新因重复键而失败，我的一个标签重复了。为了解决更新问题，我需要进行一次全新的 Discourse 安装，然后加载我最新的备份，但加载失败，因为它抱怨重复键。所以，我需要进入备份内部编辑有问题的标签，将其更改为其他内容。

出于某种原因，重新压缩的备份（已修复重复标签问题）比原始备份小得多，并且在我尝试恢复时失败，因此重新压缩过程出了点问题。

**1) 查找备份：** 要查找您的 Discourse 备份，您可以使用以下命令：

```plaintext
sudo find / -name "*.tar.gz"

```

这将搜索您的系统上所有扩展名为“.tar.gz”的备份文件。默认情况下，它应该在您的容器内：shared/backups/default

**2) 创建副本：** 找到要使用的备份后，请创建该文件的副本，以确保您拥有原始文件的备份。使用“cp”命令：

bash

```plaintext
sudo cp /path/to/original_backup.tar.gz /path/to/copy_backup.tar.gz

```

**3) 提取副本：** 使用“tar”命令提取复制的备份文件的内容：

bash

```plaintext
tar -xzvf /path/to/copy_backup.tar.gz

```

这将把备份文件提取到一个临时目录。

**4) 编辑数据库中的标签：** 导航到提取的备份文件，并使用文本编辑器打开相关的数据库文件。我遇到了重复的“socialmedia”标签问题，这阻止了成功恢复。在一个大的数据库中，有很多标签的实例，很可能也有您要查找的特定标签，所以我使用 Nano 中的 Ctrl W 搜索了“immutable socialmedia”，这直接带我到了那里。

```plaintext
sudo nano /path/to/extracted_database.sql

```

我将一个“socialmedia”标签实例编辑为“socialmedia2”，然后快速搜索以检查它现在是否只出现一次。一旦恢复成功，我就可以从管理部分修复这些标签。

**5) 重新压缩：** 编辑备份文件后，创建一个包含已更正内容的新备份文件。使用以下命令压缩修改后的文件：

```plaintext
tar -czvf /path/to/new_modified_backup.tar.gz /path/to/modified_files_directory

```

**6) 移动到正确的文件：** 将新的修改后的备份文件移动到存储备份的适当目录。默认位置通常是“/shared/backups/default”：

```plaintext
sudo mv /path/to/new_modified_backup.tar.gz /shared/backups/default/

```

**7) 停止和启动服务：** 在恢复修改后的备份之前，请确保停止相关服务，以避免在恢复过程中可能发生的冲突。使用“./launcher stop app”命令停止 Discourse 应用程序：

```plaintext
./launcher stop app

```

**8) 恢复备份：** 要从修改后的备份恢复，请使用指向新备份文件的“discourse restore”命令：

```plaintext
discourse restore /shared/backups/default/new_modified_backup.tar.gz

```

或者您可以通过您的网站上的 /admin 进行操作，因为它现在应该出现在备份部分。

**9) 验证恢复：** 恢复过程完成后，我通过检查 Discourse 应用程序和数据库来验证更改是否成功，以确保已删除重复的“socialmedia”标签。

**10) 启动服务：** 我重新启动了之前停止的服务，以使 Discourse 应用程序重新联机。我使用“./launcher start app”命令启动 Discourse 应用程序：

```plaintext
./launcher start app

```

**11) 删除临时文件和额外备份：** 成功恢复备份后，我删除了在此过程中创建的任何临时文件和额外备份，以释放磁盘空间。使用“rm”命令删除文件：

```plaintext
sudo rm -r /path/to/temporary_directory
sudo rm /path/to/copy_backup.tar.gz

```

---

_[View the full topic](https://meta.discourse.org/t/modifying-the-database-inside-of-a-backup-to-remove-a-duplicate-key-tag-so-that-it-doesnt-fail-when-restoring/273039)._
