mysql - 如何使用 docker 将大型或中等大小的 SQL 转储导入 Mysql/MariaDB

标签 mysql docker docker-compose mariadb

我是 Docker 新手,想要创建 MariaDB 容器。在启动容器时,我想导入一个大小为 50MB 的 SQL 转储。我正在使用以下 Docker 撰写文件,该文件当前需要 1 小时以上才能导入 SQL 转储。

services:
  mariadb:
    image: mariadb:10.1
    container_name: mariadb
    volumes:
      - ./mountedVolume/dbvolume:/var/lib/mysql
      - ./webAppDatabase/dctdatabase/appDB.sql:/docker-entrypoint-initdb.d/appDB.sql
    command: --max_allowed_packet=500M      
    environment:
      MYSQL_ROOT_PASSWORD: root123
    ports:
      - "3306:3306"

在导入 SQL 转储之前,我尝试使用以下 Mysql 设置

SET @OLD_AUTOCOMMIT=@@AUTOCOMMIT, AUTOCOMMIT = 0;
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS = 0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS = 0;

导入 SQL 转储后,我重置了值

SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
SET AUTOCOMMIT = @OLD_AUTOCOMMIT;
COMMIT;

但是上述设置没有帮助。我还使用了 link 上发布的解决方案但这没有帮助。

我尝试过将 SQL 文件分割成更小的 block 并将其导入 MariaDB 容器,但花费了大约相同的时间

我只是想在更短的时间内导入约 50MB 的 SQL 转储,我已经尝试了互联网上可用的所有可能的方法,但没有一个解决方案可以帮助我最大限度地减少时间。如果有解决方法,请告诉我。

最佳答案

找了好久,终于找到了解决办法。听说我将解释导入/导出Mysql/MariaDB数据库的3种不同方法以及性能统计数据

导入 SQL 转储的传统方法需要花费大量时间来导入数据,因为它必须先创建表,然后按顺序导入数据!。但是,通过将 CREATE/INSERT 语句分离在两个不同的文件中并执行它仍然可以提高性能。与传统的导入方式相比,它只会提高一点性能。

为了提高更多性能,我们可以导入/导出gz格式的SQL转储!!!。

示例:

导出数据库:

mysqldump -u [user] -p [DATA_BASE_NAME] | gzip > [SQL_FILE_DUMP.sql.gz]   

导入数据库:

gunzip < [SQL_FILE_DUMP.sql.gz]  | mysql -u [user] -p[password] [DATA_BASE_NAME]

为了提高导入/导出性能,我们应该获取 /var/lib/mysql 目录的 Mysql/MariaDB 快照!!!。

[注意:由于我使用的是 InnoDB 表,所以我没有尝试使用其他数据库引擎,并且我在 blog] 之一中找到了解决方案。

导出数据库:

docker run --rm --volumes-from mariadb carinamarina/backup backup --source /var/lib/mysql/ --stdout --zip > db-data-volume.tar.gz

导入数据库:

docker run --rm --interactive --volumes-from mariadb carinamarina/backup restore --destination /var/lib/mysql/ --stdin --zip < db-data-volume.tar.gz

测试用例统计导入约 50mb 的 Mysql/MariaDB 数据:

___Method_______________Size_____________Time Taken in minits_____________

Traditional way         50mb                  50 min

gzip / .gz              50mb                  29 min        

/var/lib/mysql/         50mb                  0.2 min or 20 seconds  

[注:测试用例在 Ubuntu 14.04、Intel® Core™ i5-3470 CPU 和 4GB 内存中执行。高端系统的性能可以提高]

关于mysql - 如何使用 docker 将大型或中等大小的 SQL 转储导入 Mysql/MariaDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58413387/

相关文章:

docker - Docker组成:具有可覆盖卷和端口的单个主机上的多个隔离环境

docker - Windows 和 Linux 容器同时运行 Windows 10

mysql - 连接查询无法对表中的所有元素正常工作

mysql - 将多行转换为表中的列

php - 使用 php 生成数组的 PDO 中的 SELECT 语句

docker - 撰写文件 './docker-compose.yaml'无效,原因是:服务不支持的配置: 'pihole'

在 Dockerfile 中使用 SSH 进行 Git 克隆

docker - 将 docker 运行时参数添加到 helm 图表

docker - 在 Gitlab Runner 容器中构建 Docker 镜像

php - 如何在 php 中获取此 mysql 查询的两行的总和值