繁体   English   中英

导入 data.sql MySQL Docker 容器

[英]Import data.sql MySQL Docker Container

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

这是我的 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"

之后您可以导入数据库:

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

使用卷挂载在/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/

我似乎无法使用最新的 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:

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

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

见: https : //gist.github.com/spalladino/6d981f7b33f6e0afe6bb

使用docker-compose导入

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

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

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

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

我可以用这个命令导入

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

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

第一种方式:

首先将 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 执行(注意:如果您使用的是 alpine 版本,则需要在下面给出的命令中用 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 变量中创建一个具有指定名称的新数据库 - 您可以通过设置环境变量来传递,请参阅此处如何设置环境变量

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

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

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

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

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

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

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

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

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

您可以运行设置共享目录(-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 根密码)
  • /my-host-dir/shared-dir/container-dir (将挂载到容器中的主机目录,以及共享目录的容器位置)

这个对我有用

$ 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。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM