docker 部署的项目,有时候需要迁移服务器,那么数据的备份和恢复操作就至关重要了,记录下 chatgpt 项目的备份和恢复。
首先需要知道 docker中该项目的名称或者 id,使用命令:
docker ps -a
可以获得所有的项目实例:

复制其中的 container id 或者 name,这就是你要操作的对象,一般是 mysql 数据库,这类我就以941a1432f3f0为例。
导出完整数据库(不带创建表结构):
docker exec 941a1432f3f0 mysqldump -u root -p --no-create-info db_name > backup.sql
root 是 mysql 的用户名
--no-create-info 是指不导出创建表结构(如果只导出数据,加上这个)
db_name 就是导出的数据库名称,会将其中所有的表导出
backup.sql 就是导出的 sql 文件。
导出部分表数据(不带创建表结构):
docker exec 941a1432f3f0 mysqldump -u root -p --no-create-info db_name table1_name table2_name > backup_tables.sql
在 db_name 后多个表名,指定导出部分表数据。
导入完整数据库:
docker exec -i 941a1432f3f0 mysql -u root -p123456 db_name < backup.sql
这条命令,会将 backup.sql 的数据导入到 db_name 的数据库中
注意导入数据库的时候,不支持指定表名,也就是说是否是导入部分表,由 backup.sql 决定,你在导出的时候就已经做了处理了。
假设导出的时候是部分表,导入就是部分表,导出全部,导入就是全部。
碰到的问题:
新老数据库表的字段数量不匹配
手动调整导入 sql 中的字段数量,和新表的字段数量一致就可以了。
怎么看容器中的数据库表字段
首先需要进入到 msyql 中。docker exec -it 941a1432f3f0 bash
docker exec:在运行中的容器里执行命令。-i:保持标准输入(interactive)。-t:分配伪终端(terminal),常与-i搭配使用。941a1432f3f0:容器 ID(或容器名也行)。bash:在容器中运行 bash shell。
进入 容器后,再执行 mysql -u root -p,进入到 mysql 命令行,这个时候就可以通过 mysql 语句获取到数据库表以及字段、数据等
show databases; use db_name; show tables; desc table_name;