好吧,这迟早会发生,之前一切太顺利了。多年来系统一直自动更新,我只需每隔几周更新一次 Discourse。昨晚午夜,亚马逊显示系统无响应,Discourse 宕机,CPU 占用率飙升至 100%,直到耗尽 AWS 的 CPU 资源。我无法登录系统,唯一一次在多次重启后短暂登录成功时,我在 htop 中看到以下进程占用了大量 CPU:
snap lxd activate
如果有人遇到过这种情况,能否帮忙分析一下为什么会自行发生?这对未来的参考会非常有帮助。
回到当前紧迫的问题,我在 AWS 上重新构建了一台使用 Ubuntu 20 LTS 的新服务器,Discourse 的设置过程异常简单。我手头有一份 app.yml 文件,用它重新创建了 Discourse 论坛。旧服务器使用 S3 存储备份以及内容(如图片等)。
创建服务器后,我从 S3 下载了最新的 Discourse 备份文件,手动上传到 Discourse 服务器,然后点击了“恢复”按钮。几分钟后,我收到了以下错误:
[2022-06-09 09:01:56] ALTER TABLE
[2022-06-09 09:01:56] ALTER TABLE
[2022-06-09 09:01:56] 正在迁移数据库...
[2022-06-09 09:02:11] == 20220308201942 CreateUploadReferences: 迁移中 ===========================
-- create_table(:upload_references, {})
-> 0.0486s
-- add_index(:upload_references, [:upload_id, :target_type, :target_id], {:unique=>true, :name=>"index_upload_references_on_upload_and_target"})
-> 0.0030s
== 20220308201942 CreateUploadReferences: 迁移完成 (0.0580s) ==================
== 20220309132719 CopyPostUploadsToUploadReferences: 迁移中 ================
-- execute("INSERT INTO upload_references(upload_id, target_type, target_id, created_at, updated_at)\nSELECT post_uploads.upload_id, 'Post', post_uploads.post_id, uploads.created_at, uploads.updated_at\nFROM post_uploads\nJOIN uploads ON uploads.id = post_uploads.upload_id\nON CONFLICT DO NOTHING\n")
-> 0.0595s
== 20220309132719 CopyPostUploadsToUploadReferences: 迁移完成 (0.0602s) =======
== 20220309132720 CopyPostUploadsToUploadReferencesForSync: 迁移中 =========
-- execute("INSERT INTO upload_references(upload_id, target_type, target_id, created_at, updated_at)\nSELECT upload_id, 'Post', post_id, NOW(), NOW()\nFROM post_uploads\nON CONFLICT DO NOTHING\n")
-> 0.0076s
== 20220309132720 CopyPostUploadsToUploadReferencesForSync: 迁移完成 (0.0080s)
== 20220330160747 CopySiteSettingsUploadsToUploadReferences: 迁移中 ========
-- execute("WITH site_settings_uploads AS (\n SELECT id, unnest(string_to_array(value, '|'))::integer upload_id\n FROM site_settings\n WHERE data_type = 17\n UNION\n SELECT id, value::integer\n FROM site_settings\n WHERE data_type = 18 AND value != ''\n)\nINSERT INTO upload_references(upload_id, target_type, target_id, created_at, updated_at)\nSELECT site_settings_uploads.upload_id, 'SiteSetting', site_settings_uploads.id, uploads.created_at, uploads.updated_at\nFROM site_settings_uploads\nJOIN uploads ON uploads.id = site_settings_uploads.upload_id\nON CONFLICT DO NOTHING\n")
-> 0.0034s
== 20220330160747 CopySiteSettingsUploadsToUploadReferences: 迁移完成 (0.0038s)
== 20220330160751 CopyBadgesUploadsToUploadReferences: 迁移中 ==============
-- execute("INSERT INTO upload_references(upload_id, target_type, target_id, created_at, updated_at)\nSELECT badges.image_upload_id, 'Badge', badges.id, uploads.created_at, uploads.updated_at\nFROM badges\nJOIN uploads ON uploads.id = badges.image_upload_id\nWHERE badges.image_upload_id IS NOT NULL\nON CONFLICT DO NOTHING\n")
-> 0.0006s
== 20220330160751 CopyBadgesUploadsToUploadReferences: 迁移完成 (0.0010s) =====
== 20220330160754 CopyGroupsUploadsToUploadReferences: 迁移中 ==============
-- execute("INSERT INTO upload_references(upload_id, target_type, target_id, created_at, updated_at)\nSELECT groups.flair_upload_id, 'Group', groups.id, uploads.created_at, uploads.updated_at\nFROM groups\nJOIN uploads ON uploads.id = groups.flair_upload_id\nWHERE groups.flair_upload_id IS NOT NULL\nON CONFLICT DO NOTHING\n")
-> 0.0050s
== 20220330160754 CopyGroupsUploadsToUploadReferences: 迁移完成 (0.0055s) =====
== 20220330160757 CopyUserExportsUploadsToUploadReferences: 迁移中 =========
-- execute("INSERT INTO upload_references(upload_id, target_type, target_id, created_at, updated_at)\nSELECT user_exports.upload_id, 'UserExport', user_exports.id, uploads.created_at, uploads.updated_at\nFROM user_exports\nJOIN uploads ON uploads.id = user_exports.upload_id\nON CONFLICT DO NOTHING\n")
-> 0.0013s
== 20220330160757 CopyUserExportsUploadsToUploadReferences: 迁移完成 (0.0041s)
== 20220330164740 CopyThemeFieldsUploadsToUploadReferences: 迁移中 =========
-- execute("INSERT INTO upload_references(upload_id, target_type, target_id, created_at, updated_at)\nSELECT theme_fields.upload_id, 'ThemeField', theme_fields.id, uploads.created_at, uploads.updated_at\nFROM theme_fields\nJOIN uploads ON uploads.id = theme_fields.upload_id\nWHERE type_id = 2\nON CONFLICT DO NOTHING\n")
-> 0.0006s
== 20220330164740 CopyThemeFieldsUploadsToUploadReferences: 迁移完成 (0.0010s)
== 20220404195635 CopyCategoriesUploadsToUploadReferences: 迁移中 ==========
-- execute("INSERT INTO upload_references(upload_id, target_type, target_id, created_at, updated_at)\nSELECT categories.uploaded_logo_id, 'Category', categories.id, uploads.created_at, uploads.updated_at\nFROM categories\nJOIN uploads ON uploads.id = categories.uploaded_logo_id\nWHERE categories.uploaded_logo_id IS NOT NULL\nON CONFLICT DO NOTHING\n")
-> 0.0095s
-- execute("INSERT INTO upload_references(upload_id, target_type, target_id, created_at, updated_at)\nSELECT categories.uploaded_background_id, 'Category', categories.id, uploads.created_at, uploads.updated_at\nFROM categories\nJOIN uploads ON uploads.id = categories.uploaded_background_id\nWHERE categories.uploaded_background_id IS NOT NULL\nON CONFLICT DO NOTHING\n")
-> 0.0004s
== 20220404195635 CopyCategoriesUploadsToUploadReferences: 迁移完成 (0.0103s) =
== 20220404201949 CopyCustomEmojisUploadsToUploadReferences: 迁移中 ========
-- execute("INSERT INTO upload_references(upload_id, target_type, target_id, created_at, updated_at)\nSELECT custom_emojis.upload_id, 'CustomEmoji', custom_emojis.id, uploads.created_at, uploads.updated_at\nFROM custom_emojis\nJOIN uploads ON uploads.id = custom_emojis.upload_id\nWHERE custom_emojis.upload_id IS NOT NULL\nON CONFLICT DO NOTHING\n")
-> 0.0032s
== 20220404201949 CopyCustomEmojisUploadsToUploadReferences: 迁移完成 (0.0036s)
== 20220404203356 CopyUserProfilesUploadsToUploadReferences: 迁移中 ========
-- execute("INSERT INTO upload_references(upload_id, target_type, target_id, created_at, updated_at)\nSELECT user_profiles.profile_background_upload_id, 'UserProfile', user_profiles.user_id, uploads.created_at, uploads.updated_at\nFROM user_profiles\nJOIN uploads ON uploads.id = user_profiles.profile_background_upload_id\nWHERE user_profiles.profile_background_upload_id IS NOT NULL\nON CONFLICT DO NOTHING\n")
-> 0.0017s
-- execute("INSERT INTO upload_references(upload_id, target_type, target_id, created_at, updated_at)\nSELECT user_profiles.card_background_upload_id, 'UserProfile', user_profiles.user_id, uploads.created_at, uploads.updated_at\nFROM user_profiles\nJOIN uploads ON uploads.id = user_profiles.card_background_upload_id\nWHERE user_profiles.card_background_upload_id IS NOT NULL\nON CONFLICT DO NOTHING\n")
-> 0.0011s
== 20220404203356 CopyUserProfilesUploadsToUploadReferences: 迁移完成 (0.0033s)
== 20220404204439 CopyUserAvatarsUploadsToUploadReferences: 迁移中 =========
-- execute("INSERT INTO upload_references(upload_id, target_type, target_id, created_at, updated_at)\nSELECT user_avatars.custom_upload_id, 'UserAvatar', user_avatars.id, uploads.created_at, uploads.updated_at\nFROM user_avatars\nJOIN uploads ON uploads.id = user_avatars.custom_upload_id\nWHERE user_avatars.custom_upload_id IS NOT NULL\nON CONFLICT DO NOTHING\n")
-> 0.0200s
-- execute("INSERT INTO upload_references(upload_id, target_type, target_id, created_at, updated_at)\nSELECT user_avatars.gravatar_upload_id, 'UserAvatar', user_avatars.id, uploads.created_at, uploads.updated_at\nFROM user_avatars\nJOIN uploads ON uploads.id = user_avatars.gravatar_upload_id\nWHERE user_avatars.gravatar_upload_id IS NOT NULL\nON CONFLICT DO NOTHING\n")
-> 0.0069s
== 20220404204439 CopyUserAvatarsUploadsToUploadReferences: 迁移完成 (0.0276s)
== 20220404212716 CopyThemeSettingsUploadsToUploadReferences: 迁移中 =======
-- execute("INSERT INTO upload_references(upload_id, target_type, target_id, created_at, updated_at)\nSELECT theme_settings.value::int, 'ThemeSetting', theme_settings.id, uploads.created_at, uploads.updated_at\nFROM theme_settings\nJOIN uploads ON uploads.id = theme_settings.value::int\nWHERE data_type = 6 AND theme_settings.value IS NOT NULL AND theme_settings.value != ''\nON CONFLICT DO NOTHING\n")
-> 0.0025s
== 20220404212716 CopyThemeSettingsUploadsToUploadReferences: 迁移完成 (0.0030s)
== 20220526203356 CopyUserUploadsToUploadReferences: 迁移中 ================
-- execute("INSERT INTO upload_references(upload_id, target_type, target_id, created_at, updated_at)\nSELECT users.uploaded_avatar_id, 'User', users.id, uploads.created_at, uploads.updated_at\nFROM users\nJOIN uploads ON uploads.id = users.uploaded_avatar_id\nWHERE users.uploaded_avatar_id IS NOT NULL\nON CONFLICT DO NOTHING\n")
-> 0.0227s
== 20220526203356 CopyUserUploadsToUploadReferences: 迁移完成 (0.0234s) =======
[2022-06-09 09:02:11] 正在重新连接数据库...
[2022-06-09 09:02:12] 正在重新加载站点设置...
[2022-06-09 09:02:12] 正在为非工作人员用户禁用出站邮件...
[2022-06-09 09:02:14] 正在禁用只读模式...
[2022-06-09 09:02:14] 正在清除分类缓存...
[2022-06-09 09:02:14] 正在重新加载翻译...
[2022-06-09 09:02:14] 正在重新映射上传文件...
[2022-06-09 09:02:14] 正在恢复上传文件,这可能需要一些时间...
[2022-06-09 09:03:05] 异常:1823 个上传文件中有 509 个未迁移到 S3。数据库 'default' 的 S3 迁移失败。
[2022-06-09 09:03:05] /var/www/discourse/lib/file_store/to_s3_migration.rb:132:in `raise_or_log'
/var/www/discourse/lib/file_store/to_s3_migration.rb:79:in `migration_successful?'
/var/www/discourse/lib/file_store/to_s3_migration.rb:373:in `migrate_to_s3'
/var/www/discourse/lib/file_store/to_s3_migration.rb:66:in `migrate'
/var/www/discourse/lib/file_store/s3_store.rb:328:in `copy_from'
/var/www/discourse/lib/backup_restore/uploads_restorer.rb:62:in `restore_uploads'
/var/www/discourse/lib/backup_restore/uploads_restorer.rb:44:in `restore'
/var/www/discourse/lib/backup_restore/restorer.rb:61:in `run'
/var/www/discourse/script/spawn_backup_restore.rb:23:in `restore'
/var/www/discourse/script/spawn_backup_restore.rb:36:in `block in <main>'
/var/www/discourse/script/spawn_backup_restore.rb:4:in `fork'
/var/www/discourse/script/spawn_backup_restore.rb:4:in `<main>'
有人能告知问题出在哪里,以及如何从 Amazon S3 服务器备份中恢复服务器吗?