如何将 MySQL 转储从主机恢复到 Docker 容器

Posted

技术标签:

【中文标题】如何将 MySQL 转储从主机恢复到 Docker 容器【英文标题】:How to restore MySQL dump from host to Docker container 【发布时间】:2018-03-16 16:54:11 【问题描述】:

我确定这是一个重复的主题,但我根本无法完成:我喜欢在运行时将我的数据库转储恢复到 mysql 容器,而不修改 docker-compose.yml文件。

Dockerfile

FROM php:5.4.45-apache
RUN apt-get update
RUN docker-php-ext-install mysql mysqli

docker-compose.yml

version: '2'
services:
  php_service:
    container_name: my_php
    # Use Dockerfile in this dir to build the image
    build: .
    # Stop containers always after exiting.
    restart: always
    ports:
      # 'localhost' does not works from the host, but the IP of docker itself
      # (192.168.99.100 for example - shown on the top of the console)
      - "80:80"
      - "443:443"
    environment:
      # Pass variables
      - API_TOKEN=xxxx
    volumes:
      # The current directory will be mounted to '/var/www/html'
      # WORKS ONLY IN USER'S DIR ON WINDOWS (~/Downloads for example)
      - .:/var/www/html
  # See https://hub.docker.com/_/mysql/ for additional information.
  # To open up console, run `docker exec -it my_mysql bash`.
  # To restore a dump `docker exec -i my_mysql /usr/bin/mysql -u root
  # --password=test_pass DATABASE < DUMP.sql` should work, but it never did.
  mysql_service:
    container_name: my_mysql
    # Use an existing image
    image: mysql:5.6
    restart: always
    ports:
      # Let it accessible for other apps (mysql on host, IDE, etc.)
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 'test_pass' # TODO: Change this
      MYSQL_USER: 'test'
      MYSQL_PASS: 'pass'
    volumes:
      # Named volumes (my-datavolume) has to be listed in the "volumes"
      # section - I don't know how it works or what is it doing at all...
      # (-_-')
      - my-datavolume:/var/lib/mysql
volumes:
  my-datavolume:

重现步骤:

在 Windows 7 主机上启动 Docker Toolbox docker-compose up 打开一个新的 Docker Toolbox 终端 docker exec my_msql /usr/bin/mysql -u root --password=test_pass -e 'CREATE DATABASE testdb;' docker exec -i my_mysql /usr/bin/mysql -u root --password=test_pass testdb &lt; dump_on_host.sql docker exec -it my_mysql /usr/bin/mysql -u root --password=test_pass testdb mysql&gt; SHOW TABLES;

数据库为空。似乎它什么也没做,因为终端响应太快了。我通过在我的主机上安装 MySQL 尝试了转储,它可以恢复。

【问题讨论】:

你能得到像docker exec -i my_mysql wc &lt; dump_on_host.sql这样的正确输出吗? 感谢您的建议 - 它说输入为空 (0 0 0)。 假设文件确实存在,也许管道没有工作?试试cat dump_on_host.sql | docker exec ... 不行,试了没成功。 cat dump_on_host.sql in Docker Toolbox (aka: host) 显示整个文件,所以它不是空的。 【参考方案1】:

试试下面的命令对我来说很好。

从 docker 主机运行它。

备份

docker exec 容器 /usr/bin/mysqldump -u root --password=root 数据库 > 备份.sql

恢复 猫备份.sql | docker exec -i CONTAINER /usr/bin/mysql -u root --password=root 数据库

如有任何问题,请告诉我。

【讨论】:

请参阅 cmets 以获取开场信息。 恢复时,最好将密码保存在文件中 类似cat bkp.sql | docker exec -i CONTAINER mysql -uroot -p`cat /root/mariadb-root` 对于较大的数据集,保持压缩也很有帮助。我用。 zcat &lt; backup.sql.gz | docker exec -i CONTAINER /usr/bin/mysql -u root --password='root' DATABASE 我收到以下消息:mysql: [Warning] Using a password on the command line interface can be insecure.【参考方案2】:

dockerhub 上的文档对我有用:https://hub.docker.com/_/mysql

备份

docker exec some-mysql sh -c 'exec mysqldump --all-databases -u<user> -p<password> <database>' > /some/path/on/your/host/all-databases.sql

恢复

docker exec -i some-mysql sh -c 'exec mysql -u<user> -p<password> <database>' < /some/path/on/your/host/all-databases.sql

【讨论】:

对我来说也有这种帮助: docker exec -i mysql -u -p【参考方案3】:

您正在使用卷,这意味着在您恢复转储后,数据将保留。

您还在端口 3306 中公开数据库,因此解决方案可能是通过客户端连接到数据库。您可以使用MySql Workbench 之类的图形客户端连接到 mysql 并从那里恢复数据库。

或者如果你已经在命令行中安装了 mysql

$ mysql --host=127.0.0.1 --port=3306 -u test -p testdb < dump_on_host.sql

【讨论】:

【参考方案4】:

试试下面的命令

sudo docker exec -i CONTAINER_ID sh -c 'exec mysql -u root -p[YourPassword] database_name' /database/directory/database_name.sql;

【讨论】:

【参考方案5】:

一个 DOCKER DB 到另一个 DOCKER DB

备份

docker exec containerid mysqldump -u root --password=root portal-db > lower-portal-db.sql

恢复

cat lower-portal-db.sql | docker exec -i containerid mysql -u root --password=root portal-db

【讨论】:

以上是关于如何将 MySQL 转储从主机恢复到 Docker 容器的主要内容,如果未能解决你的问题,请参考以下文章

从 MySql 转储导入到配置单元

如何从 Mysql 8.0 转储到 5.7?

sh 如果db在docker容器中,则恢复mysql转储

如何使用 kubernetes 从 mysqldump 恢复转储文件?

Docker MariaDB/Mysql 转储

mysql 从远程数据库转储到本地主机输出文件