Administrator
发布于 2025-07-07 / 40 阅读
0

Docker 数据库导出以及导入,恢复备份

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;