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