记一次 Docker Compose 项目迁移:从 Windows Docker Desktop 迁移到 CentOS 服务器
前言
最近把一个基于 Docker Compose 部署的项目,从本地 Windows Docker Desktop 环境迁移到了 CentOS 云服务器。
部署项目为:xianyu-auto-reply
一开始以为这件事很简单:
把项目目录复制到服务器,然后
docker compose up -d就完事了。
结果真正操作时才发现,Docker Compose 项目迁移最容易出问题的地方,根本不是容器启动,而是 数据迁移。
尤其是 MySQL、Redis 这类有持久化数据的服务,如果直接复制目录,很容易出现:
sql
MySQL 一直 Restarting
Redis AOF 文件缺失
SQL 导入后表为空
导入 SQL 报 No database selected
这篇文章就记录一次完整的 Docker Compose 项目迁移过程,包括:
- Docker Compose 项目迁移到底要迁移什么
- 为什么不能直接复制 MySQL 数据目录
- Windows Docker Desktop 到 CentOS 的正确迁移流程
- MySQL、Redis 迁移常见问题
- 常用命令总结
适合刚开始接触 Docker 部署、Docker Compose 多服务项目迁移的同学参考。
一、项目背景
这次迁移的是一个闲鱼自动回复系统,项目使用 Docker Compose 编排,主要服务包括:
frontend 前端服务
backend-web 后端服务
websocket WebSocket 服务
scheduler 定时任务服务
mysql MySQL 数据库
redis Redis 缓存
项目原本跑在 Windows Docker Desktop 中,现在需要迁移到一台 CentOS 云服务器上。
需要迁移的核心内容主要有:
bash
docker-compose.deploy.yml
.env
xianyu_auto_reply/
SQL 数据库备份文件
其中:
xianyu_auto_reply/
是项目的绑定挂载目录,里面保存了 MySQL 数据、Redis 数据、日志、静态文件、浏览器登录态等内容。
二、先搞清楚:Docker Compose 项目迁移到底迁移什么?
很多人第一次迁移 Docker 项目时,会下意识认为:
Docker 项目迁移 = 复制容器。
但实际不是。
容器本身通常不需要复制,真正需要迁移的是:
| 内容 | 作用 |
|---|---|
docker-compose.yml / docker-compose.deploy.yml |
描述服务如何启动 |
.env |
保存端口、密码、镜像版本等配置 |
| 绑定挂载目录 | 保存业务数据、日志、上传文件等 |
| 数据库备份文件 | 用于恢复 MySQL 业务数据 |
| 静态资源目录 | 图片、二维码、截图、上传文件等 |
| 浏览器数据目录 | 登录态、Cookie、缓存等 |
如果项目使用远程镜像部署,服务器上甚至不需要完整源码,只要 Compose 文件、环境变量文件和数据目录准备好即可。
三、Compose 里的几个基础概念
在正式迁移之前,先把几个容易混淆的概念说清楚。
1. service 和 container 的区别
在 docker-compose.deploy.yml 里定义的是服务名:
yaml
services:
mysql:
redis:
backend-web:
这里的:
mysql
redis
backend-web
都是 Compose 服务名。
但服务启动后,会创建真实容器,例如:
makefile
container_name: xianyu-mysql
container_name: xianyu-redis
container_name: xianyu-backend-web
所以可以简单理解为:
| 类型 | 示例 | 使用场景 |
|---|---|---|
| 服务名 | mysql |
docker compose 操作时使用 |
| 容器名 | xianyu-mysql |
docker 直接操作容器时使用 |
例如重启 MySQL,有两种写法。
使用服务名:
bash
docker compose -f docker-compose.deploy.yml --env-file .env restart mysql
使用容器名:
docker restart xianyu-mysql
这两个都能重启 MySQL,但前者是 Compose 维度,后者是 Docker 容器维度。
2. image 和 build 的区别
Compose 中启动服务有两种常见方式。
第一种是使用远程镜像:
yaml
backend-web:
image: registry.cn-shanghai.aliyuncs.com/zhinian-software/xianyu-backend-web:latest
这种方式表示:
直接从镜像仓库拉取已经构建好的镜像运行。
推荐命令是:
bash
docker compose -f docker-compose.deploy.yml --env-file .env pull
docker compose -f docker-compose.deploy.yml --env-file .env up -d
第二种是本地构建:
yaml
backend-web:
build:
context: .
dockerfile: backend-web/Dockerfile
这种方式表示:
根据本地 Dockerfile 重新构建镜像。
常用命令是:
css
docker compose up -d --build
本次迁移使用的是远程镜像部署版,Compose 文件中主要是 image:,不是 build:。
所以:
css
docker compose -f docker-compose.deploy.yml up -d --build
虽然可以执行,但意义不大,因为没有本地 Dockerfile 需要重新构建。
更推荐:
bash
docker compose -f docker-compose.deploy.yml --env-file .env pull
docker compose -f docker-compose.deploy.yml --env-file .env up -d
3. 命名卷和绑定挂载
Docker 保存数据主要有两种方式:
markdown
1. named volume:Docker 命名卷
2. bind mount:绑定挂载
命名卷示例:
vbnet
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
这种数据由 Docker 自己管理。
可以通过下面命令查看:
bash
docker volume ls
docker volume inspect mysql_data
绑定挂载示例:
bash
volumes:
- ./xianyu_auto_reply/mysql/data:/var/lib/mysql
这种方式表示:
把宿主机当前项目目录下的
./xianyu_auto_reply/mysql/data挂载到容器内的/var/lib/mysql。
本次项目用的就是绑定挂载。
项目中的主要挂载关系如下:
| 宿主机目录 | 容器内目录 | 服务 | 作用 |
|---|---|---|---|
./xianyu_auto_reply/mysql/data |
/var/lib/mysql |
MySQL | 数据库数据 |
./xianyu_auto_reply/redis/data |
/data |
Redis | Redis 持久化数据 |
./xianyu_auto_reply/logs/backend_web |
/app/backend-web/logs |
Backend-Web | 后端日志 |
./xianyu_auto_reply/logs/websocket |
/app/websocket/logs |
WebSocket | WebSocket 日志 |
./xianyu_auto_reply/logs/scheduler |
/app/scheduler/logs |
Scheduler | 定时任务日志 |
./xianyu_auto_reply/static |
/app/static |
多服务共享 | 静态文件、二维码、截图、上传资源 |
./xianyu_auto_reply/browser_data |
/app/browser_data |
WebSocket | 浏览器登录态、Cookie、缓存 |
四、这次迁移踩的第一个坑:直接复制 MySQL 数据目录失败
一开始我尝试把 Windows 项目目录下的 MySQL 数据目录:
bash
xianyu_auto_reply/mysql/data
直接复制到 CentOS 服务器,然后启动 MySQL。
结果 MySQL 容器一直处于重启状态:
scss
Restarting (1)
查看日志:
ini
docker logs --tail=100 xianyu-mysql
发现类似错误:
erlang
Failed to find valid data directory.
Data Dictionary initialization failed.
这个错误说明:
/var/lib/mysql不是一个有效的 MySQL 数据目录。
虽然目录里看起来有这些内容:
mysql/
performance_schema/
sys/
xianyu_data/
binlog.*
但缺少 MySQL 启动所需的核心文件,例如:
ibdata1
undo_001
undo_002
mysql.ibd
所以 MySQL 无法正常启动。
五、为什么不建议直接复制 MySQL 物理目录?
MySQL 的数据目录不是普通文件夹。
它里面不只是表数据,还包括:
perl
系统库
数据字典
redo log
undo log
binlog
表空间文件
事务相关文件
这些文件必须保持一致。
如果你在 MySQL 容器运行时直接复制目录,或者 Windows 到 Linux 复制过程中漏了部分文件,就可能导致 MySQL 无法识别数据目录。
常见原因有:
markdown
1. MySQL 容器还在运行时直接复制数据目录
2. Windows 到 Linux 复制过程中漏文件
3. 压缩、上传、解压过程不完整
4. 原来的数据其实在 Docker named volume 中,不在当前项目目录
5. 换过 compose 文件,启动的是一个新的空数据库
所以 MySQL 迁移更推荐使用逻辑备份:
sql
mysqldump 导出 SQL
CentOS 初始化空数据库
再导入 SQL
简单说:
MySQL 迁移不要优先复制
/var/lib/mysql,优先使用mysqldump。
六、Redis 为什么也可能迁移失败?
Redis 如果开启了 AOF:
bash
--appendonly yes
在 Redis 7 中,AOF 文件可能不是单独一个 appendonly.aof,而是一个目录结构:
csharp
appendonlydir/
├── appendonly.aof.manifest
├── appendonly.aof.1.base.rdb
└── appendonly.aof.1.incr.aof
如果复制时缺了其中某个文件,就可能出现类似错误:
vbnet
Unable to obtain the AOF file appendonly.aof.1.incr.aof length.
stat: No such file or directory
如果 Redis 只是缓存数据,不是核心业务数据,我的建议是:
不迁移 Redis 旧数据,直接重建空目录。
这样更干净,也更不容易出错。
七、正确迁移流程
下面是最终验证可行的迁移流程。
整体流程如下:
bash
1. Windows 原环境确认 MySQL 真实有数据
2. 使用 mysqldump 导出 xianyu_data
3. 上传 SQL 到 CentOS
4. CentOS 停止旧容器
5. 移走坏的 mysql/data 和 redis/data
6. 创建新的空 mysql/data 和 redis/data
7. 启动 MySQL
8. 导入 SQL
9. 启动 Redis
10. 启动所有服务
11. 检查容器状态、日志和页面访问
八、Windows 原环境导出 MySQL 数据
1. 确认 MySQL 容器正在运行
在 Windows 项目目录执行:
docker ps
确认存在:
xianyu-mysql
如果没有启动,可以单独启动 MySQL:
docker compose up -d mysql
2. 进入 MySQL 检查数据库
perl
docker exec -it xianyu-mysql mysql -uroot -pxianyu@2026
进入后执行:
ini
SHOW DATABASES;
切换到业务库:
ini
USE xianyu_data;
SHOW TABLES;
这里一定要确认表存在。
如果 SHOW TABLES; 是空的,说明当前连接的库可能不是原来有数据的库。
这时可以检查容器真实挂载目录:
ini
docker inspect xianyu-mysql --format="{{json .Mounts}}"
也可以在本地搜索是否存在多个 xianyu_data 目录:
sql
Get-ChildItem D:\codes -Recurse -Directory -Filter xianyu_data -ErrorAction SilentlyContinue |
Select-Object FullName
这一步很重要。
因为如果你导出的是空库,后面迁移再顺利,导入到服务器的也还是空数据。
3. 导出数据库
确认 xianyu_data 里有表之后,再执行导出:
sql
docker exec xianyu-mysql mysqldump -uroot -pxianyu@2026 --databases xianyu_data > xianyu_data_backup.sql
或者使用这种写法:
ini
docker exec xianyu-mysql mysqldump -u root --password="xianyu@2026" --databases xianyu_data > xianyu_data_backup.sql
这里注意:
css
--databases xianyu_data
会让导出的 SQL 文件里包含:
go
CREATE DATABASE
USE `xianyu_data`
这样后面导入时就不需要手动指定数据库。
4. 检查 SQL 文件是否有效
导出完成后,不要急着上传,先检查文件。
查看文件大小:
bash
dir .\xianyu_data_backup.sql
查看前几行:
css
Get-Content .\xianyu_data_backup.sql -TotalCount 40
正常的 SQL 备份应该包含:
sql
CREATE DATABASE
USE `xianyu_data`
CREATE TABLE
INSERT INTO
如果只有:
go
CREATE DATABASE
USE `xianyu_data`
但没有:
sql
CREATE TABLE
INSERT INTO
说明你导出的是空库,需要回到原环境继续排查数据到底在哪里。
九、上传 SQL 到 CentOS
假设服务器项目目录是:
arduino
/opt/xianyu-auto-reply-deploy
在 Windows 执行:
ruby
scp .\xianyu_data_backup.sql root@服务器IP:/opt/xianyu-auto-reply-deploy/
如果 SSH 不是默认 22 端口,例如 5555:
ruby
scp -P 5555 .\xianyu_data_backup.sql root@服务器IP:/opt/xianyu-auto-reply-deploy/
十、CentOS 准备项目目录
进入服务器项目目录:
bash
cd /opt/xianyu-auto-reply-deploy
查看文件:
bash
ls
目录中至少应该包含:
bash
docker-compose.deploy.yml
.env
xianyu_auto_reply/
xianyu_data_backup.sql
如果没有 .env,可以新建一个:
ini
cat > .env << 'EOF'
MYSQL_ROOT_PASSWORD=xianyu@2026
MYSQL_DATABASE=xianyu_data
MYSQL_USER=xianyu
MYSQL_PASSWORD=xianyu@2026
REDIS_PASSWORD=xianyu@2026
REDIS_DB=0
JWT_SECRET_KEY=change-me-in-production-please
FRONTEND_PORT=9000
BACKEND_WEB_PORT=8089
WEBSOCKET_PORT=8090
SCHEDULER_PORT=8091
IMAGE_REGISTRY=registry.cn-shanghai.aliyuncs.com/zhinian-software
IMAGE_TAG=latest
LOG_LEVEL=INFO
ACCESS_TOKEN_EXPIRE_MINUTES=1440
REFRESH_TOKEN_EXPIRE_MINUTES=10080
REDELIVERY_INTERVAL=5
RATE_INTERVAL=20
MAX_CAPTCHA_CONCURRENT=3
EOF
生产环境中,密码和密钥建议自行修改,不要长期使用默认值。
十一、重建 MySQL 空数据目录
如果服务器上之前已经启动过 MySQL,并且目录是坏的,需要先移走旧目录。
停止所有服务:
bash
docker compose -f docker-compose.deploy.yml --env-file .env down
备份旧 MySQL 目录:
bash
mv ./xianyu_auto_reply/mysql/data ./xianyu_auto_reply/mysql/data_bad_$(date +%F_%H%M%S)
创建新的空目录:
bash
mkdir -p ./xianyu_auto_reply/mysql/data
设置权限:
bash
chown -R 999:999 ./xianyu_auto_reply/mysql/data
chmod -R 750 ./xianyu_auto_reply/mysql/data
这里的 999:999 通常对应容器内 MySQL 用户的 UID/GID。
十二、重建 Redis 空数据目录
如果 Redis 数据不重要,建议直接重建:
bash
mv ./xianyu_auto_reply/redis/data ./xianyu_auto_reply/redis/data_bad_$(date +%F_%H%M%S)
mkdir -p ./xianyu_auto_reply/redis/data
chown -R 999:999 ./xianyu_auto_reply/redis/data
chmod -R 755 ./xianyu_auto_reply/redis/data
十三、单独启动 MySQL
不要一上来就启动所有服务。
先单独启动 MySQL:
bash
docker compose -f docker-compose.deploy.yml --env-file .env up -d mysql
查看状态:
bash
docker compose -f docker-compose.deploy.yml --env-file .env ps
如果看到类似:
xianyu-mysql Up ... healthy
说明 MySQL 初始化成功。
如果还是 Restarting,查看日志:
ini
docker logs --tail=100 xianyu-mysql
十四、导入 SQL 数据
情况一:SQL 文件包含 CREATE DATABASE 和 USE
如果导出时使用了:
css
mysqldump --databases xianyu_data
SQL 文件一般包含:
go
CREATE DATABASE ...
USE `xianyu_data`;
这种情况可以直接导入:
css
docker exec -i xianyu-mysql mysql -uroot -pxianyu@2026 < xianyu_data_backup.sql
情况二:SQL 文件没有 USE 数据库
如果导入时报:
yaml
ERROR 1046 (3D000): No database selected
说明 SQL 文件里没有指定数据库。
先创建数据库:
css
docker exec -i xianyu-mysql mysql -uroot -pxianyu@2026 -e "CREATE DATABASE IF NOT EXISTS xianyu_data DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
再指定数据库导入:
css
docker exec -i xianyu-mysql mysql -uroot -pxianyu@2026 xianyu_data < xianyu_data_backup.sql
十五、验证数据库是否导入成功
进入 MySQL:
perl
docker exec -it xianyu-mysql mysql -uroot -pxianyu@2026
执行:
ini
USE xianyu_data;
SHOW TABLES;
查看表数量:
sql
SELECT COUNT(*)
FROM information_schema.tables
WHERE table_schema = 'xianyu_data';
如果表数量正常,说明数据库导入成功。
退出 MySQL:
bash
exit;
十六、启动 Redis
数据库恢复完成后,再启动 Redis:
bash
docker compose -f docker-compose.deploy.yml --env-file .env up -d redis
查看状态:
bash
docker compose -f docker-compose.deploy.yml --env-file .env ps
查看 Redis 日志:
ini
docker logs --tail=100 xianyu-redis
十七、启动所有服务
MySQL 和 Redis 都正常之后,再启动全部服务:
bash
docker compose -f docker-compose.deploy.yml --env-file .env up -d
查看服务状态:
bash
docker compose -f docker-compose.deploy.yml --env-file .env ps
查看全部日志:
bash
docker compose -f docker-compose.deploy.yml --env-file .env logs -f
十八、访问服务
如果 .env 中端口配置如下:
ini
FRONTEND_PORT=9000
BACKEND_WEB_PORT=8089
WEBSOCKET_PORT=8090
SCHEDULER_PORT=8091
那么访问地址一般是:
arduino
前端:http://服务器IP:9000
后端:http://服务器IP:8089
WebSocket:http://服务器IP:8090
Scheduler:http://服务器IP:8091
如果外部访问不了,需要检查两处:
markdown
1. 云服务器安全组是否放行端口
2. CentOS 防火墙是否放行端口
查看防火墙端口:
css
firewall-cmd --list-ports
开放前端端口:
css
firewall-cmd --zone=public --add-port=9000/tcp --permanent
firewall-cmd --reload
十九、常见问题排查
1. MySQL 一直 Restarting
查看状态:
bash
docker compose -f docker-compose.deploy.yml --env-file .env ps
查看日志:
ini
docker logs --tail=100 xianyu-mysql
如果出现:
erlang
Failed to find valid data directory.
Data Dictionary initialization failed.
基本就是 MySQL 数据目录不可用。
处理方式:
bash
docker compose -f docker-compose.deploy.yml --env-file .env down
mv ./xianyu_auto_reply/mysql/data ./xianyu_auto_reply/mysql/data_bad_$(date +%F_%H%M%S)
mkdir -p ./xianyu_auto_reply/mysql/data
chown -R 999:999 ./xianyu_auto_reply/mysql/data
chmod -R 750 ./xianyu_auto_reply/mysql/data
docker compose -f docker-compose.deploy.yml --env-file .env up -d mysql
然后重新导入 SQL。
2. Redis 一直 Restarting
查看日志:
ini
docker logs --tail=100 xianyu-redis
如果是 AOF 文件缺失,可以重建 Redis 目录:
bash
docker compose -f docker-compose.deploy.yml --env-file .env down
mv ./xianyu_auto_reply/redis/data ./xianyu_auto_reply/redis/data_bad_$(date +%F_%H%M%S)
mkdir -p ./xianyu_auto_reply/redis/data
chown -R 999:999 ./xianyu_auto_reply/redis/data
chmod -R 755 ./xianyu_auto_reply/redis/data
docker compose -f docker-compose.deploy.yml --env-file .env up -d redis
3. SQL 导入时报 No database selected
错误:
yaml
ERROR 1046 (3D000): No database selected
原因:
sql
SQL 文件里没有 USE 数据库名。
解决方式:
css
docker exec -i xianyu-mysql mysql -uroot -pxianyu@2026 -e "CREATE DATABASE IF NOT EXISTS xianyu_data DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
然后指定数据库导入:
css
docker exec -i xianyu-mysql mysql -uroot -pxianyu@2026 xianyu_data < xianyu_data_backup.sql
4. mysqldump 导出的 SQL 没有表
如果 SQL 里只有:
sql
CREATE DATABASE
USE xianyu_data
但没有:
sql
CREATE TABLE
INSERT INTO
说明导出的是空库。
需要回到原环境检查:
ini
USE xianyu_data;
SHOW TABLES;
如果原环境也没有表,继续检查容器挂载目录:
ini
docker inspect xianyu-mysql --format="{{json .Mounts}}"
可能原因:
markdown
1. 当前容器不是原来有数据的容器
2. 当前挂载目录不是原来的数据目录
3. 数据在 Docker named volume 里
4. 换过 compose 文件
5. 换过项目目录
5. Access denied for user root
错误写法:
sql
docker exec xianyu-mysql mysqldump -u root -p xianyu@2026 --databases xianyu_data > xianyu_data_backup.sql
这种写法可能导致:
yaml
Access denied
using password: NO
原因是 -p 后面不能有空格。
正确写法:
sql
docker exec xianyu-mysql mysqldump -uroot -pxianyu@2026 --databases xianyu_data > xianyu_data_backup.sql
或者:
ini
docker exec xianyu-mysql mysqldump -u root --password="xianyu@2026" --databases xianyu_data > xianyu_data_backup.sql
6. 命令行提示密码不安全
导入或导出时可能出现:
vbnet
Using a password on the command line interface can be insecure.
这是警告,不是错误。
如果 SQL 文件正常生成,或者导入结果正常,可以先忽略。
生产环境中可以通过配置文件或交互式输入密码来避免这个提示。
二十、常用命令总结
1. Docker Compose 启停命令
| 功能 | 命令 | 说明 |
|---|---|---|
| 启动全部服务 | docker compose -f docker-compose.deploy.yml --env-file .env up -d |
后台启动所有服务 |
| 停止全部服务 | docker compose -f docker-compose.deploy.yml --env-file .env down |
停止并删除当前项目容器,不删除绑定目录数据 |
| 查看服务状态 | docker compose -f docker-compose.deploy.yml --env-file .env ps |
查看当前 Compose 服务状态 |
| 查看全部日志 | docker compose -f docker-compose.deploy.yml --env-file .env logs -f |
实时查看所有服务日志 |
| 拉取最新镜像 | docker compose -f docker-compose.deploy.yml --env-file .env pull |
拉取远程镜像仓库中的最新镜像 |
| 重启全部服务 | docker compose -f docker-compose.deploy.yml --env-file .env restart |
重启所有服务 |
2. 单个服务操作命令
| 功能 | 命令 | 说明 |
|---|---|---|
| 启动 MySQL | docker compose -f docker-compose.deploy.yml --env-file .env up -d mysql |
只启动 MySQL 服务 |
| 启动 Redis | docker compose -f docker-compose.deploy.yml --env-file .env up -d redis |
只启动 Redis 服务 |
| 启动后端 | docker compose -f docker-compose.deploy.yml --env-file .env up -d backend-web |
只启动后端服务 |
| 启动前端 | docker compose -f docker-compose.deploy.yml --env-file .env up -d frontend |
只启动前端服务 |
| 重启 MySQL | docker compose -f docker-compose.deploy.yml --env-file .env restart mysql |
使用服务名重启 MySQL |
| 重启后端 | docker compose -f docker-compose.deploy.yml --env-file .env restart backend-web |
使用服务名重启后端 |
| 重启容器 | docker restart xianyu-mysql |
使用容器名重启容器 |
3. 容器查看命令
| 功能 | 命令 | 说明 |
|---|---|---|
| 查看运行中容器 | docker ps |
只看运行中的容器 |
| 查看所有容器 | docker ps -a |
包括停止和异常退出的容器 |
| 查看 MySQL 日志 | docker logs --tail=100 xianyu-mysql |
查看 MySQL 最近 100 行日志 |
| 实时查看 MySQL 日志 | docker logs -f xianyu-mysql |
持续输出 MySQL 日志 |
| 查看 Redis 日志 | docker logs --tail=100 xianyu-redis |
查看 Redis 日志 |
| 进入 MySQL 容器 | docker exec -it xianyu-mysql bash |
进入 MySQL 容器内部 |
| 查看容器挂载 | docker inspect xianyu-mysql --format="{{json .Mounts}}" |
查看容器数据挂载位置 |
4. MySQL 操作命令
| 功能 | 命令 | 说明 |
|---|---|---|
| 登录 MySQL | docker exec -it xianyu-mysql mysql -uroot -pxianyu@2026 |
进入 MySQL 命令行 |
| 查看数据库 | SHOW DATABASES; |
MySQL 内执行 |
| 使用数据库 | USE xianyu_data; |
切换到业务数据库 |
| 查看表 | SHOW TABLES; |
查看当前数据库的表 |
| 创建数据库 | CREATE DATABASE IF NOT EXISTS xianyu_data DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; |
初始化业务库 |
| 导出数据库 | docker exec xianyu-mysql mysqldump -uroot -pxianyu@2026 --databases xianyu_data > xianyu_data_backup.sql |
在宿主机当前目录生成 SQL |
| 导入带 USE 的 SQL | docker exec -i xianyu-mysql mysql -uroot -pxianyu@2026 < xianyu_data_backup.sql |
SQL 内已包含数据库选择 |
| 导入不带 USE 的 SQL | docker exec -i xianyu-mysql mysql -uroot -pxianyu@2026 xianyu_data < xianyu_data_backup.sql |
手动指定导入数据库 |
5. 数据目录处理命令
| 功能 | 命令 | 说明 |
|---|---|---|
| 备份整个数据目录 | tar -czf /root/xianyu_auto_reply_backup_$(date +%F_%H%M%S).tar.gz ./xianyu_auto_reply |
备份绑定挂载数据 |
| 备份坏 MySQL 目录 | mv ./xianyu_auto_reply/mysql/data ./xianyu_auto_reply/mysql/data_bad_$(date +%F_%H%M%S) |
不删除,改名保留 |
| 创建 MySQL 空目录 | mkdir -p ./xianyu_auto_reply/mysql/data |
准备新数据目录 |
| 设置 MySQL 权限 | chown -R 999:999 ./xianyu_auto_reply/mysql/data && chmod -R 750 ./xianyu_auto_reply/mysql/data |
避免 MySQL 权限问题 |
| 备份坏 Redis 目录 | mv ./xianyu_auto_reply/redis/data ./xianyu_auto_reply/redis/data_bad_$(date +%F_%H%M%S) |
备份 Redis 旧目录 |
| 创建 Redis 空目录 | mkdir -p ./xianyu_auto_reply/redis/data |
准备新 Redis 数据目录 |
| 设置 Redis 权限 | chown -R 999:999 ./xianyu_auto_reply/redis/data && chmod -R 755 ./xianyu_auto_reply/redis/data |
避免 Redis 权限问题 |