导入data.sql MySQL Docker容器


87

如果我有一个data.sql,如何将数据库导入到我的mysql docker容器中?如何导入数据库数据。在码头工人化的世界中,这增加了一层复杂性。请一些方法。

这是我的docker-compose.yml:

nginx:
  build: ./nginx/
  container_name: nginx-container
  ports:
    - 80:80
  links:
    - php
  volumes_from:
    - app-data

php:
  build: ./php/
  container_name: php-container
  expose:
    - 9000
  links:
    - mysql
  volumes_from:
    - app-data

app-data:
  image: php:7.0-fpm
  container_name: app-data-container
  volumes:
    - ./www/html/:/var/www/html/
  command: "true"

mysql:
  image: mysql:latest
  container_name: mysql-container
  ports:
    - 3306:3306
  volumes_from:
    - mysql-data
  environment:
    MYSQL_ROOT_PASSWORD: secret
    MYSQL_DATABASE: name_db
    MYSQL_USER: user
    MYSQL_PASSWORD: password

mysql-data:
  image: mysql:latest
  container_name: mysql-data-container
  volumes:
    - /var/lib/mysql
  command: "true"

将SQL文件复制到容器,然后在文件中加载数据。
杰·布兰查德

Answers:


58

我似乎无法使用最新的mysql或mysql:5.7进行此操作。所以我改用mariaDB。这是我的docker-compose.yaml代码。

version: '3'

services:
  mysql:
    image: mariadb:10.3
    container_name: mariadb
    volumes:
      - container-volume:/var/lib/mysql
      - ./dump.sql:/docker-entrypoint-initdb.d/dump.sql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: name_db
    ports:
      - "3306:3306"

volumes:
  container-volume:

当我尝试使用此方法时,最终会找到dump.sql的目录?知道为什么吗?例如:bash到mariadb容器&中:cd /docker-entrypoint-initdb.d/dump.sql/&然后在目录中?是什么会导致创建目录,而不是根本不存在.sql文件或引发某种错误?我对于mariadb容器的相关docker-compose.yml:mariadb: image: mariadb:latest ... volumes: - app-vhosts:/path/before/sqldump #creates a directory? - ./path/to/sql/dump.sql:/docker-entrypoint-initdb.d/dump.sql
K8sN0v1c3

150

之后可以导入数据库:

docker exec -i mysql-container mysql -uuser -ppassword name_db < data.sql


23
如果使用泊坞窗,撰写,你必须得到容器:docker exec -i $(docker-compose ps -q mysql-container) mysql …。它不支持从此刻标准输入,所描述的阅读这里
slhck

2
如何在docker-compose上执行此操作?
iamjc015

7
我是。收到错误消息“输入设备不是TTY”
kamal

仅供参考:-p出于安全目的,无需密码即可使用。
阿卜杜拉·尼拉姆

2
@kamal是否使用了该-t选项docker exec?使用Juse-i来避免错误
Wolfgang

83

/docker-entrypoint-initdb.d/yourdump.sql使用卷挂载挂载sql-dump

mysql:
  image: mysql:latest
  container_name: mysql-container
  ports:
    - 3306:3306
  volumes:
    - ./dump.sql:/docker-entrypoint-initdb.d/dump.sql
  environment:
    MYSQL_ROOT_PASSWORD: secret
    MYSQL_DATABASE: name_db
    MYSQL_USER: user
    MYSQL_PASSWORD: password

这将在容器启动期间触发sql-dump的导入,请参阅 “初始化新实例”下的https://hub.docker.com/_/mysql/


3
+1 @EugenMayer。绝对任何使用Compose v1的人都应改用
Mano

1
V3不是V2的后继产品,即使这样做很不方便。V3基本上只是一群人,而是一个分支,然后是一个继承者。请参阅Dockers对此的评论。巨大的问题之一是缺少volumr_from安装可能性
Eugen Mayer

20
伙计们,请记住,如果您为数据库服务创建一个持久卷,除非您重新创建它,否则它将不会检查新的.sql文件。为此花了几个小时,我希望没有其他人会经历同样的事情。
达扎

1
@DhwanilPatel您必须使用--build --force-recreate选项。 docs.docker.com/compose/reference/up例如docker -compose up --build --force-recreate
Dazag

@Dazag实际上我已经使用了以下命令:“ sudo docker-compose up -d --force-recreate --build”,但什么都没有发生
Dhwanil Patel


11

使用docker-compose导入

cat dump.sql | docker-compose exec -T <mysql_container> mysql -u <db-username> -p<db-password> <db-name>

我遇到了错误-mysql:[警告]在命令行界面上使用密码可能不安全。第1行的错误1064(42000):您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以在'mysqldump'附近使用正确的语法:[警告]在命令行1上使用insec在命令行界面上输入密码可能不安全,请读unix @-> / var / run / docker。袜子:读取:对等
R,Sun,

请检查一下,该警告是否尚未出现在您的dump.sql中:当使用mysqldump生成文件并在命令行上提供密码时,该警告将最终出现在转储文件中。
Stefan Frank

5

结合https://stackoverflow.com/a/51837876/1078784 和这个问题的答案,我认为最好的答案是:

cat {SQL FILE NAME} | docker exec -i {MYSQL CONTAINER NAME} {MYSQL PATH IN CONTAINER} --init-command="SET autocommit=0;"

例如,在我的系统中,此命令应如下所示:

cat temp.sql | docker exec -i mysql.master /bin/mysql --init-command="SET autocommit=0;"

您也可以使用pv监控进度:

cat temp.sql | pv | docker exec -i mysql.master /bin/mysql --init-command="SET autocommit=0;"

最重要的是“ --init-command”,它将加快导入速度10倍。


我得到标准输入不是tty ...对此感到非常无聊,对此有什么解决方案?
Bram B

不明白您的意思,也许您可​​以给我更多细节?
Matt.Cai

4

我可以使用此命令导入

docker-compose exec -T mysql mysql -uroot -proot mydatabase < ~/Desktop/mydatabase_2019-10-05.sql

很难说出什么是什么,但是我是用同样的方式做的docker-compose exec -T [host] mysql -u [mysql user] -p[password] [database] < localfile.sql。除此之外,我认为您的陈述中有错误。-u和用户名本身之间应该有一个空格。
Gordon Freeman

3

您可以按照以下简单步骤操作:

方式:

首先将SQL转储文件从您的本地目录复制到mysql容器。使用docker cp命令

docker cp [SRC-Local path to sql file] [container-name or container-id]:[DEST-path to copy to]

docker cp ./data.sql mysql-container:/home

然后使用执行mysql-container(注意:如果您使用的是阿尔卑斯版本,则需要在下面的给定命令中用sh替换bash。)

docker exec -it -u root mysql-container bash

然后您可以简单地导入此SQL转储文件。

mysql [DB_NAME] < [SQL dump file path]

mysql movie_db < /home/data.sql

第二种方式:简单

docker cp ./data.sql mysql-container:/docker-entrypoint-initdb.d/

如mysql Docker Hub官方页面中所述。

每当容器首次启动时,都会在MYSQL_DATABASE变量中使用指定名称创建一个新数据库-您可以通过设置环境变量来传递该数据库,请参见此处如何设置环境变量

默认情况下,容器将执行在/docker-entrypoint-initdb.d文件夹中找到的扩展名为.sh,.sql和.sql.gz的文件。文件将按字母顺序执行。这样,您的SQL文件将默认导入到MYSQL_DATABASE变量指定的数据库中。

有关更多详细信息,您可以随时访问官方页面


1

您可以运行设置共享目录(-v卷)的容器,然后在该容器中运行bash。之后,您可以从容器内部以交互方式使用mysql-client执行.sql文件。obs:/ my-host-dir / shared-dir是主机系统中的.sql位置。

docker run --detach --name=test-mysql -p host-port:container-port  --env="MYSQL_ROOT_PASSWORD=my-root-pswd" -v /my-host-dir/shared-dir:/container-dir mysql:latest


docker exec -it test-mysql bash

在容器里面...

mysql -p < /container-dir/file.sql 

自定义参数:

  • test-mysql(容器名称)
  • 主机端口容器端口
  • my-root-pswd(mysql root密码)
  • / my-host-dir / shared-dir/ container-dir(将在容器中安装的主机目录,以及共享目录的容器位置)

0

这个为我工作

$ docker exec -i NAME_CONTAINER_MYSQL mysql -u DB_USER -pPASSWORD DATABASE < /path/to/your/file.sql

首先,如果您想知道什么是NAME_CONTAINER_MYSQL,则应在下面使用此命令:

$ docker ps

在“名称”输出列中,您会看到需要在上面的命令中替换的NAME_CONTAINER_MYSQL。


0

"docker exec ... < data.sql"在Windows PowerShell响应中尝试以下操作:

'<'运算符保留供将来使用。

但是可以用它cmd /c来解决此问题:

cmd /c "docker exec -i mysql-container mysql -uuser -ppassword name_db < data.sql"

-2

您可以使用docker cp将例如dump.sql的导出文件复制到容器中,然后导入数据库。如果您需要完整的说明,请告诉我,我会提供

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.