导入data.sql MySQL Docker容器

时间:2017-05-09 21:18:25

标签: mysql docker

如果我有一个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"

14 个答案:

答案 0 :(得分:93)

您可以在以后导入数据库:

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

答案 1 :(得分:53)

使用卷装载

/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/

答案 2 :(得分:24)

我似乎无法使用最新的mysql或mysql:5.7。所以我改用mariaDB。这是我的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: 代码。

    sub = new Subject<any>();
    sub.next(1); sub.next(2); sub.next(3);
    #hack 1
    sub.next(4); sub.next(5); sub.next(6);
    #hack 2

答案 3 :(得分:20)

如果您不想挂载卷,但想从本地计算机中转储文件,另一种选择是管道cat yourdump.sql。像这样:

cat dump.sql | docker exec -i mysql-container mysql -uuser -ppassword db_name

请参阅: https://gist.github.com/spalladino/6d981f7b33f6e0afe6bb

答案 4 :(得分:5)

使用 docker-compose

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

答案 5 :(得分:5)

只需写docker ps并获取容器ID,然后编写以下内容;

docker exec -i your_container_id mysql -u root -p123456 your_db_name < /Users/your_pc/your_project_folder/backup.sql

答案 6 :(得分: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

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

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变量中使用指定名称创建一个新数据库-您可以通过设置环境变量 see here how to set environment variables

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

有关更多详细信息,您可以随时访问official page

答案 7 :(得分:3)

先做docker cp file.sql <CONTAINER NAME>:/file.sql

然后docker exec -it <CONTAINER NAME> mysql -u user -p

然后在mysql容器内执行source \file.sql

答案 8 :(得分:1)

我可以使用此命令导入

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

答案 9 :(得分:1)

这个为我工作

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

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

$ docker ps

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

答案 10 :(得分:0)

您可以运行一个设置共享目录(-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 (将安装在容器中的主机目录,以及该容器的容器位置共享目录)

我希望有帮助。

答案 11 :(得分:0)

结合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倍。

答案 12 :(得分:0)

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

答案 13 :(得分:0)

在Windows PowerShell响应中尝试"docker exec ... < data.sql"

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

但是可以用cmd /c来解决这个问题:

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