# MySQL 8.4 备份与恢复 ## 策略 - 由 1Panel 每日执行一次完整备份,保留 30 天;备份写入与应用主机隔离的对象存储。 - MySQL 启用 binary log,至少保留 7 天,用于完整备份后的时间点恢复。 - 数据库备份和对象存储均启用加密;备份账号只授予备份所需权限。 - 每月至少在隔离环境恢复一次,并记录恢复点、耗时和校验结果。未做恢复演练的备份不能视为可用。 - 发布含 Flyway 迁移的镜像前,先完成一次可验证的备份。Flyway 迁移只向前执行。 ## 命令行完整备份 先用 `mysql_config_editor` 为受限备份账号建立本机登录路径,避免把密码写入命令行或脚本: ```bash mysql_config_editor set --login-path=osg-backup \ --host=127.0.0.1 --user=osg_backup --password ``` 在只允许管理员读取的目录执行一致性备份: ```bash umask 077 mysqldump --login-path=osg-backup \ --single-transaction --quick --routines --triggers --events \ --set-gtid-purged=OFF --default-character-set=utf8mb4 \ osg_account | gzip -9 > "osg_account-$(date -u +%Y%m%dT%H%M%SZ).sql.gz" ``` 备份任务应在上传后生成 SHA-256 校验值,并按保留策略删除过期副本。不要将备份、登录路径文件或校验清单提交到 Git。 ## 隔离恢复演练 恢复目标必须是新建的隔离 MySQL 8.4 实例,不能覆盖生产库: ```bash mysql --login-path=osg-restore -e \ "CREATE DATABASE osg_account_restore CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci" gzip -dc osg_account-YYYYMMDDTHHMMSSZ.sql.gz | \ mysql --login-path=osg-restore osg_account_restore mysql --login-path=osg-restore osg_account_restore -e \ "SELECT version, success FROM flyway_schema_history ORDER BY installed_rank" ``` 恢复后执行应用只读验收、表行数抽样、外键检查和邀请查询测试。时间点恢复应先还原完整备份,再仅回放目标时间之前的 binary log。确认结果后销毁隔离实例及明文恢复文件。 ## 1Panel 1Panel 的数据库备份任务使用相同的每日频率、异地存储、加密和保留期。启用任务成功/失败通知,并每月下载一份备份到隔离 MySQL 8.4 完成恢复演练。1Panel 面板、工单和截图中不得出现数据库密码、Apple 私钥或供应商 API Key。