MYYCMS 站群系统数据库修改密码及数据库备份恢复操作笔记
最新上线了6台MYYCMS站群,目前整体排名效果不错!
最近这个月,陆续有3台MYYCMS站群服务器出现故障,最近这一台服务器因为硬盘故障,导致服务器无法启动,机房那边紧急帮忙安排了一块新的硬盘,并把旧硬盘挂载到服务器上,测试了两天,终于把旧硬盘上的MYYCMS站群数据,包括MYYCMS站群的源码、Mysql数据库文件,以及Redis数据库文件从旧硬盘转移到新硬盘,并重新配置MYYCMS站群的信息,将MYYCMS站群成功恢复,今天记录一下详细的操作过程。
一、MYYCMS站群服务器环境
本次恢复环境:
系统:Debian 12
Web:Nginx 1.30
PHP:PHP 8.2
数据库:MySQL 8.0.45
Redis:Redis 7.4.7
面板:宝塔 V11.7
站点数量:约 2500 个
数据库目录:/www/server/data
Redis 目录:/www/server/redis
宝塔面板目录:/www/server/panel
网站目录:/www/wwwroot
旧硬盘挂载目录:/old
本次故障背景:
服务器硬盘损坏,更换新硬盘并重新安装系统与宝塔环境;
旧硬盘挂载到新系统;
需要恢复 MYYCMS 站群网站、MySQL 数据库、Redis 数据、宝塔面板站点记录。
二、核心结论
这次最关键的经验有 5 条:
1. 宝塔面板的网站列表、数据库列表,不是单纯扫描 Nginx 配置和 MySQL 文件生成的;
宝塔自己还有 SQLite 面板数据库,宝塔面板网站、数据库相关信息存放数据库文件位置 /www/server/panel/data/default.db。
2. Redis 的 dump.rdb / AOF 恢复后,只要 Redis 能 PING、DBSIZE 正常,说明 Redis 本身基本没问题。
3. MySQL 8 不能只复制单个业务库目录或 .ibd 文件。
必须尽量完整恢复整个 /www/server/data 目录。
4. MySQL 8 的库表元数据主要在数据字典里,不是只靠数据库目录和 .ibd 文件识别。
MySQL 8 已移除旧式 .frm 文件元数据,相关元数据存入数据字典表中。:contentReference[oaicite:0]{index=0}
5. 完整恢复旧 /www/server/data 后,MySQL root 密码也会恢复成旧硬盘里的密码;
如果忘记旧密码,需要用 –skip-grant-tables 重置 root 密码。
三、宝塔面板相关数据恢复
1. 宝塔站点配置目录
Nginx 站点配置:
/www/server/panel/vhost/nginx/
SSL 证书目录:
/www/server/panel/vhost/cert/
恢复示例:
rsync -a /old/server/panel/vhost/nginx/ /www/server/panel/vhost/nginx/
rsync -a /old/server/panel/vhost/cert/ /www/server/panel/vhost/cert/
如果没有 rsync:
cp -a /old/server/panel/vhost/nginx/. /www/server/panel/vhost/nginx/
cp -a /old/server/panel/vhost/cert/. /www/server/panel/vhost/cert/
2. 宝塔面板数据库
恢复好数据库文件之后,无法同步数据库,会提示错误

宝塔面板自己的数据库一般在:
/www/server/panel/data/default.db
里面包含:
sites 网站列表
databases 数据库列表
config 面板配置,包括 mysql_root
users 面板用户
crontab 计划任务
ftps FTP 信息
logs 面板日志
查看表:
sqlite3 /www/server/panel/data/default.db “.tables”
查看 config 表结构:
sqlite3 /www/server/panel/data/default.db “PRAGMA table_info(config);”
查看宝塔保存的 MySQL root 密码:
sqlite3 /www/server/panel/data/default.db “SELECT id,mysql_root FROM config;”
如果显示:
1|admin
含义不是用户名是 admin,而是:
宝塔面板当前保存的 MySQL root 密码 = admin
如果 SSH 中实际 MySQL root 密码已经不是 admin,宝塔面板同步数据库就会提示密码错误。
3. 修改宝塔保存的 MySQL root 密码

先备份:
cp -a /www/server/panel/data/default.db /www/server/panel/data/default.db.bak.$(date +%F-%H%M%S)
tar -czf /root/bt-panel-data-backup-$(date +%F-%H%M%S).tar.gz /www/server/panel/data
修改:
sqlite3 /www/server/panel/data/default.db “UPDATE config SET mysql_root=‘你的真实root密码’ WHERE id=1;”
确认:
sqlite3 /www/server/panel/data/default.db “SELECT id,mysql_root FROM config;”
重启宝塔:
bt restart
然后再进入:
宝塔面板 → 数据库 → MySQL → 同步数据库
四、Redis 数据恢复与排查
1. Redis 数据位置
宝塔 Redis 常见目录:
/www/server/redis
查看 Redis 持久化配置:
grep -E “^(dir|dbfilename|appendonly|appendfilename|appenddirname)” /www/server/redis/redis.conf

常见配置:
dir /www/server/redis
dbfilename dump.rdb
appendonly no
如果启用了 AOF,可能还有:
/www/server/redis/appendonlydir/
2. 恢复 Redis 数据
停止 Redis:
systemctl stop redis
复制旧数据:
rsync -a /old/server/redis/ /www/server/redis/
没有 rsync 时:
cp -a /old/server/redis/. /www/server/redis/
修复权限:
chown -R root:root /www/server/redis
启动:
systemctl start redis
3. 判断 Redis 是否恢复成功
测试:
redis-cli PING
正常返回:
PONG
检查 DB1:
redis-cli -n 1 DBSIZE
本次恢复后结果类似:
(integer) 346390
扫描 key:
redis-cli -n 1 –scan | head -n 20
本次 MYYCMS / Laravel key 格式类似:
laravel_database_seo.bj:article_with_menu_75
laravel_database_xxx.com:category_3_limit_10
4. Redis LOADING 报错说明
如果刚执行:
systemctl restart redis
redis-cli -n 1 DBSIZE
马上出现:
(error) LOADING Redis is loading the dataset in memory
这不一定是故障。说明 Redis 正在把 RDB/AOF 加载进内存。
本次日志显示:
Loading RDB produced by version 7.4.7
RDB memory usage when created 4293.41 Mb
Done loading RDB, keys loaded: 346390
DB loaded from disk: 13.833 seconds
Ready to accept connections tcp
说明 Redis 大概 14 秒加载完成。不要反复重启 Redis。
五、文章详情页 500 排查经验
1. 现象
本次测试站点:
https://www.seo.bj/
现象:
首页正常
列表页正常
文章详情页 500
案例详情页 500
Redis 中对应文章 key 存在:
redis-cli -n 1 EXISTS “laravel_database_seo.bj:article_with_menu_75”
redis-cli -n 1 TYPE “laravel_database_seo.bj:article_with_menu_75”
redis-cli -n 1 TTL “laravel_database_seo.bj:article_with_menu_75”
返回:
(integer) 1
string
(integer) -1
读取文章内容:
redis-cli -n 1 GET “laravel_database_seo.bj:article_with_menu_75” | head -c 1000
内容开头:
O:24:“App\Models\SpiderArticle”:30:{…}
说明 Redis 里存的是 PHP serialize 后的 Laravel Eloquent 模型对象。
2. 检查模型类是否存在
进入站点目录:
cd /www/wwwroot/seo.bj
测试 autoload:
/www/server/php/82/bin/php -r “require ‘vendor/autoload.php’; var_dump(class_exists(‘App\\Models\\SpiderArticle’));”
正常返回:
bool(true)
如果在错误目录执行,比如 /www/wwwlogs/free_waf_log,会报:
require(vendor/autoload.php): Failed to open stream
所以必须进入 Laravel 项目根目录执行。
3. 查看 Laravel 日志
真正的错误不在 Nginx access log,而在:
/www/wwwroot/seo.bj/storage/logs/laravel.log
查看:
cd /www/wwwroot/seo.bj
tail -n 200 storage/logs/laravel.log
本次关键错误:
SQLSTATE[HY000] [1045] Access denied for user ‘z0eeg4mt05q38888’@’localhost’ (using password: YES)
SQL: select `categoryid`, `id`, `viewcount` from `spider_article` where `spider_article`.`id` = 74 limit 1
结论:
Redis 没问题;
文章详情页读取 Redis 后,还会查询 MySQL 的 spider_article 表;
MySQL 用户或数据库权限异常,导致详情页 500。
六、MySQL 数据库恢复重点
1. MySQL 8 不能只复制业务库目录
错误做法:
cp -rf /old/server/data/z0eeg4mt05q38888 /www/server/data/
cp -rf /old/server/data/undo_001 /www/server/data/
cp -rf /old/server/data/undo_002 /www/server/data/
这种方式会导致:
SHOW DATABASES 看不到业务库;
宝塔同步数据库显示 0 个数据库;
甚至 MySQL 无法启动。
原因:
MySQL 8 的数据库、表、表空间信息依赖数据字典;
只复制业务库目录和 .ibd 文件,MySQL 不一定识别。
MySQL 8 移除了 .frm 等文件式元数据,表结构等信息改由数据字典表保存。
2. 正确做法:完整恢复整个 data 目录
旧目录:
/old/server/data
新目录:
/www/server/data
旧目录应包含:
auto.cnf
ibdata1
#innodb_redo/
#innodb_temp/
mysql/
mysql.ibd
undo_001
undo_002
大量业务库目录
检查:
ls -lah /old/server/data | egrep “mysql$|mysql.ibd|ibdata1|#innodb_redo|#innodb_temp|undo_001|undo_002|auto.cnf”
本次确认旧数据目录完整:
auto.cnf
ibdata1
#innodb_redo
#innodb_temp
mysql
mysql.ibd
undo_001
undo_002
MySQL 8 的 redo log 默认位于数据目录下的 #innodb_redo 目录中,不能混用不同数据目录的 redo 文件。(dev.mysql.com)
3. 安装 rsync
新系统如果没有 rsync,会报:
-bash: rsync: command not found
安装:
apt update
apt install -y rsync
Debian 12 官方源提供 rsync 包,适合本地和远程文件复制、备份和镜像同步。(packages.debian.org)
4. 完整恢复 /www/server/data
停止 MySQL:
systemctl stop mysqld
pkill -f mysqld_safe
pkill -f “/www/server/mysql/bin/mysqld”
确认没有进程:
ps aux | grep mysqld | grep -v grep
备份当前坏目录:
mv /www/server/data /www/server/data.mixed-broken.$(date +%F-%H%M%S)
mkdir -p /www/server/data
完整同步旧目录:
rsync -aH –numeric-ids –delete /old/server/data/ /www/server/data/
如果没有 rsync,可用:
cp -a /old/server/data/. /www/server/data/
修复权限:
chown -R mysql:mysql /www/server/data
find /www/server/data -type d -exec chmod 750 {} \;
find /www/server/data -type f -exec chmod 640 {} \;
清理运行时文件:
rm -f /www/server/data/*.pid
rm -f /www/server/data/*.sock
rm -f /www/server/data/*.sock.lock
启动 MySQL:
systemctl start mysqld
查看状态:
systemctl status mysqld –no-pager -l
5. 典型错误:redo 文件混用
本次曾出现错误:
The redo log file /www/server/data/#innodb_redo/#ib_redo179 comes from other data directory than redo log file /www/server/data/#innodb_redo/#ib_redo0.
Plugin initialization aborted
Failed to initialize DD Storage Engine
Data Dictionary initialization failed
原因:
/www/server/data 中混入了新 MySQL 初始化的 redo 文件和旧硬盘复制过来的 redo 文件;
数据字典、redo、undo、表空间不属于同一套实例。
解决:
不要单独复制 undo 或某些数据库目录;
直接备份当前 /www/server/data;
完整同步 /old/server/data 到 /www/server/data。
七、MySQL root 密码重置
1. 为什么恢复后 root 密码又不对?
完整恢复旧 /www/server/data 后,mysql 系统库也恢复了。
所以:
MySQL 用户表恢复成旧硬盘状态;
root 密码也恢复成旧服务器上的密码;
SSH 和宝塔面板原来保存的新密码都会失效。
这属于正常现象。
2. 停止残留 MySQL 进程
有时候:
systemctl stop mysqld
不能完全停止进程。
检查:
ps aux | grep mysqld | grep -v grep
如果看到:
mysqld_safe
mysqld
先温和停止:
kill mysqld的PID
kill mysqld_safe的PID
sleep 5
如果仍存在:
kill -9 mysqld的PID
kill -9 mysqld_safe的PID
确认:
ps aux | grep mysqld | grep -v grep
必须没有输出。
3. 用 skip-grant-tables 启动
不要直接执行:
/www/server/mysql/bin/mysqld
直接以 root 执行会报:
Fatal error: Please read “Security” section of the manual to find out how to run mysqld as root!
MySQL 官方不建议用 Unix root 用户运行 mysqld,应使用普通用户,例如 mysql 用户。(dev.mysql.com)
正确方式:
/www/server/mysql/bin/mysqld_safe –defaults-file=/etc/my.cnf –skip-grant-tables –skip-networking –user=mysql &
等待:
sleep 10
登录:
mysql -uroot
注意这里不加 -p。
MySQL 官方说明,重置 root 密码可以先停止 MySQL,然后用 --skip-grant-tables 启动,使本地可以无密码连接,完成后再恢复正常启动。
4. 修改 root 密码
进入 MySQL 后:
FLUSH PRIVILEGES;
SELECT user, host, plugin FROM mysql.user WHERE user=‘root’;
修改 root 密码:
ALTER USER ‘root’@’localhost’ IDENTIFIED WITH mysql_native_password BY ‘你的新root密码’;
FLUSH PRIVILEGES;
exit;
如果存在 root@127.0.0.1,也可以一起修改:
ALTER USER ‘root’@‘127.0.0.1’ IDENTIFIED WITH mysql_native_password BY ‘你的新root密码’;
FLUSH PRIVILEGES;
5. 关闭临时 MySQL,正常启动
关闭临时实例:
/www/server/mysql/bin/mysqladmin -uroot -p shutdown
输入新 root 密码。
如果失败,手动 kill 残留进程:
ps aux | grep mysqld | grep -v grep
kill mysqld的PID
kill mysqld_safe的PID
正常启动:
systemctl start mysqld
测试:
mysql -uroot -p -e “SHOW DATABASES;” | head -n 50
如果能看到业务库,说明恢复成功。
八、宝塔面板同步 MySQL root 密码
MySQL root 修改后,还要修改宝塔面板保存的 root 密码。
查看:
sqlite3 /www/server/panel/data/default.db “SELECT id,mysql_root FROM config;”
修改:
sqlite3 /www/server/panel/data/default.db “UPDATE config SET mysql_root=‘你的新root密码’ WHERE id=1;”
重启宝塔:
bt restart
然后宝塔面板执行:
数据库 → MySQL → 同步数据库
九、站点数据库用户修复
如果某个站点 .env 是:
DB_HOST=127.0.0.1
DB_DATABASE=z0eeg4mt05q3ofof
DB_USERNAME=z0eeg4mt05q3ofof
DB_PASSWORD=站点数据库密码
但是 Laravel 日志报:
SQLSTATE[HY000] [1045] Access denied for user ‘z0eeg4mt05q38888’@’localhost’
用 root 登录 MySQL 后执行:
CREATE USER IF NOT EXISTS ‘z0eeg4mt05q38888’@’localhost’ IDENTIFIED BY ‘站点数据库密码’;
ALTER USER ‘z0eeg4mt05q38888’@’localhost’ IDENTIFIED BY ‘站点数据库密码’;
GRANT ALL PRIVILEGES ON `z0eeg4mt05q38888`.* TO ‘z0eeg4mt05q38888’@’localhost’;
CREATE USER IF NOT EXISTS ‘z0eeg4mt05q38888’@‘127.0.0.1’ IDENTIFIED BY ‘站点数据库密码’;
ALTER USER ‘z0eeg4mt05q38888’@‘127.0.0.1’ IDENTIFIED BY ‘站点数据库密码’;
GRANT ALL PRIVILEGES ON `z0eeg4mt05q3ofof`.* TO ‘z0eeg4mt05q38888’@‘127.0.0.1’;
FLUSH PRIVILEGES;
测试:
mysql -uz0eeg4mt05q38888 -p -h127.0.0.1 z0eeg4mt05q38888
查询表:
SELECT id, categoryid, viewcount FROM spider_article WHERE id=74 LIMIT 1;
十、Laravel / MYYCMS 缓存清理
数据库权限修复后,进入站点目录:
cd /www/wwwroot/seo.bj
清理缓存:
/www/server/php/82/bin/php artisan config:clear
/www/server/php/82/bin/php artisan cache:clear
/www/server/php/82/bin/php artisan route:clear
/www/server/php/82/bin/php artisan view:clear
重启 PHP-FPM:
/etc/init.d/php-fpm-82 restart
然后访问:
https://www.seo.bj/news/75.html
https://www.seo.bj/cases/74.html
十一、批量检查命令
1. 查所有站点 .env 数据库配置
find /www/wwwroot -name “.env” -type f -print0 | xargs -0 grep -H “DB_DATABASE=”
find /www/wwwroot -name “.env” -type f -print0 | xargs -0 grep -H “DB_USERNAME=”
find /www/wwwroot -name “.env” -type f -print0 | xargs -0 grep -H “DB_PASSWORD=”
2. 查 MySQL 用户
SELECT user, host FROM mysql.user ORDER BY user, host;
3. 查 MySQL 数据目录
mysql -uroot -p -e “SHOW VARIABLES LIKE ‘datadir’;”
4. 查业务库是否识别
mysql -uroot -p -e “SHOW DATABASES;” | head -n 100
5. 查 Redis DB1
redis-cli PING
redis-cli -n 1 DBSIZE
redis-cli -n 1 –scan | head -n 20
6. 查 Laravel 错误日志
tail -n 200 /www/wwwroot/站点目录/storage/logs/laravel.log
或者:
grep -R “SQLSTATE\|RedisException\|Fatal error\|Uncaught\|Access denied\|Class .* not found” /www/wwwroot/ /www/wwwlogs/ -n | tail -n 100
十二、完整恢复流程总结
阶段 1:恢复网站和宝塔站点记录
rsync -a /old/server/panel/vhost/ /www/server/panel/vhost/
rsync -a /old/wwwroot/ /www/wwwroot/
chown -R www:www /www/wwwroot
bt restart
如果旧路径是 /old/www/wwwroot:
rsync -a /old/www/wwwroot/ /www/wwwroot/
阶段 2:恢复 Redis
systemctl stop redis
rsync -a /old/server/redis/ /www/server/redis/
systemctl start redis
redis-cli PING
redis-cli -n 1 DBSIZE
阶段 3:恢复 MySQL 数据
systemctl stop mysqld
pkill -f mysqld_safe
pkill -f “/www/server/mysql/bin/mysqld”
mv /www/server/data /www/server/data.bak.$(date +%F-%H%M%S)
mkdir -p /www/server/data
rsync -aH –numeric-ids –delete /old/server/data/ /www/server/data/
chown -R mysql:mysql /www/server/data
find /www/server/data -type d -exec chmod 750 {} \;
find /www/server/data -type f -exec chmod 640 {} \;
rm -f /www/server/data/*.pid
rm -f /www/server/data/*.sock
rm -f /www/server/data/*.sock.lock
systemctl start mysqld
阶段 4:重置 MySQL root 密码
systemctl stop mysqld
pkill -f mysqld_safe
pkill -f “/www/server/mysql/bin/mysqld”
ps aux | grep mysqld | grep -v grep
如果还有残留 PID:
kill -9 PID
跳过权限表启动:
/www/server/mysql/bin/mysqld_safe –defaults-file=/etc/my.cnf –skip-grant-tables –skip-networking –user=mysql &
sleep 10
mysql -uroot
SQL:
FLUSH PRIVILEGES;
ALTER USER ‘root’@’localhost’ IDENTIFIED WITH mysql_native_password BY ‘你的新root密码’;
FLUSH PRIVILEGES;
exit;
关闭临时实例:
/www/server/mysql/bin/mysqladmin -uroot -p shutdown
正常启动:
systemctl start mysqld
测试:
mysql -uroot -p -e “SHOW DATABASES;” | head -n 50
阶段 5:同步宝塔面板 root 密码
sqlite3 /www/server/panel/data/default.db “UPDATE config SET mysql_root=‘你的新root密码’ WHERE id=1;”
bt restart
然后宝塔面板:
数据库 → MySQL → 同步数据库
阶段 6:修复站点数据库用户和 Laravel 缓存
CREATE USER IF NOT EXISTS ‘站点数据库用户’@’localhost’ IDENTIFIED BY ‘站点数据库密码’;
ALTER USER ‘站点数据库用户’@’localhost’ IDENTIFIED BY ‘站点数据库密码’;
GRANT ALL PRIVILEGES ON `站点数据库名`.* TO ‘站点数据库用户’@’localhost’;
CREATE USER IF NOT EXISTS ‘站点数据库用户’@‘127.0.0.1’ IDENTIFIED BY ‘站点数据库密码’;
ALTER USER ‘站点数据库用户’@‘127.0.0.1’ IDENTIFIED BY ‘站点数据库密码’;
GRANT ALL PRIVILEGES ON `站点数据库名`.* TO ‘站点数据库用户’@‘127.0.0.1’;
FLUSH PRIVILEGES;
清理站点缓存:
cd /www/wwwroot/站点目录
/www/server/php/82/bin/php artisan config:clear
/www/server/php/82/bin/php artisan cache:clear
/www/server/php/82/bin/php artisan route:clear
/www/server/php/82/bin/php artisan view:clear
/etc/init.d/php-fpm-82 restart
十三、重要注意事项
1. 不要混合新旧 MySQL 数据目录文件
危险操作:
cp -rf undo_001 undo_002 /www/server/data/
cp -rf 某个业务库目录 /www/server/data/
cp -rf 某些 .ibd 文件 /www/server/data/
可能导致:
redo log file comes from other data directory
Failed to initialize DD Storage Engine
Data Dictionary initialization failed
正确方式:
完整恢复同一套 /www/server/data
2. 不要直接以 root 用户运行 mysqld
错误:
/www/server/mysql/bin/mysqld
可能报:
Fatal error: Please read “Security” section of the manual to find out how to run mysqld as root!
正确:
/www/server/mysql/bin/mysqld_safe –defaults-file=/etc/my.cnf –user=mysql &
或:
systemctl start mysqld
3. 修改 .env 后必须清理 Laravel 配置缓存
php artisan config:clear
否则 Laravel 可能继续使用旧配置。
4. 宝塔保存的 root 密码和 MySQL 实际 root 密码要一致
MySQL root 修改后,还要同步:
sqlite3 /www/server/panel/data/default.db “UPDATE config SET mysql_root=‘真实root密码’ WHERE id=1;”
bt restart
5. 敏感信息泄露后要更换
这次排查中曾暴露:
数据库密码
Telegram Bot Token
恢复后建议:
1. 修改数据库用户密码;
2. 更新站点 .env;
3. php artisan config:clear;
4. 重启 PHP-FPM;
5. 到 BotFather 重置 Telegram Bot Token。
十四、最终验证清单
恢复完成后逐项检查:
systemctl status mysqld –no-pager -l
systemctl status redis –no-pager
systemctl status nginx –no-pager
MySQL:
mysql -uroot -p -e “SHOW DATABASES;” | head -n 50
Redis:
redis-cli PING
redis-cli -n 1 DBSIZE
宝塔:
数据库 → MySQL → 当前状态
数据库 → MySQL → 同步数据库
网站 → 站点列表
站点:
首页 200
列表页 200
文章详情页 200
案例详情页 200
Laravel 日志:
tail -n 100 /www/wwwroot/站点目录/storage/logs/laravel.log
Nginx 错误日志:
tail -n 100 /www/wwwlogs/站点域名.error.log
十五、一句话总结
这次 MYYCMS 站群系统恢复的关键不是单独恢复某个数据库文件,而是:
完整恢复宝塔面板数据 + 完整恢复 MySQL /www/server/data + 恢复 Redis 数据 + 重置 MySQL root 密码 + 同步宝塔 mysql_root + 修复站点数据库用户权限。
尤其是 MySQL 8,必须把:
mysql/
mysql.ibd
ibdata1
#innodb_redo/
#innodb_temp/
undo_001
undo_002
业务库目录
作为一整套数据目录恢复,不能拆开复制。