在 Docker 环境下安装的 MySQL 中批量执行 SQL 脚本(如 x.sql)可以通过以下几种方法实现。以下是详细步骤:
方法一:使用 docker exec 和 mysql 客户端(推荐)
-
将 SQL 脚本复制到容器中(如果文件不在容器内):
bash
docker cp /path/to/x.sql mysql-container:/tmp/x.sql
-
将
/path/to/x.sql替换为宿主机上脚本的实际路径。 -
mysql-container是 MySQL 容器的名称或 ID(通过docker ps查看)。
-
-
通过
mysql客户端执行脚本:bash
docker exec -i mysql-container mysql -u root -p<password> <database_name> < /tmp/x.sql
-
-u root:指定 MySQL 用户名(根据实际情况替换)。 -
-p<password>:直接在命令中输入密码(注意无空格)。也可省略-p后参数,命令行会提示输入密码。 -
<database_name>:指定要执行脚本的目标数据库(需提前创建)。 -
< /tmp/x.sql:将容器内的脚本文件重定向到mysql客户端。
示例(密码为
123456,数据库为mydb):bash
docker exec -i mysql-container mysql -u root -p123456 mydb < /tmp/x.sql
-
方法二:直接通过宿主机文件重定向
如果不想先将文件复制到容器,可直接将宿主机文件重定向到容器内的 mysql 客户端:
bash
docker exec -i mysql-container mysql -u root -p<password> <database_name> < /path/to/x.sql
-
注意:这里直接使用宿主机上的
x.sql路径(无需复制到容器)。
方法三:通过 docker run 临时容器执行(适合初始化数据库)
如果希望容器启动时自动执行脚本(例如初始化数据库),可通过挂载 SQL 文件并利用 docker-entrypoint-initdb.d 目录:
-
将
x.sql挂载到容器的/docker-entrypoint-initdb.d/目录:bash
docker run -d \ --name mysql-container \ -e MYSQL_ROOT_PASSWORD=123456 \ -e MYSQL_DATABASE=mydb \ -v /path/to/x.sql:/docker-entrypoint-initdb.d/x.sql \ mysql:tag
-
MySQL 容器启动时会自动执行
/docker-entrypoint-initdb.d/目录下的所有.sql、.sh文件。 -
注意:仅当首次启动容器(数据目录为空)时会执行,若需重新执行需删除容器及其数据卷。
-
方法四:进入容器交互式执行
-
进入容器 shell:
bash
docker exec -it mysql-container bash
-
在容器内使用
mysql客户端执行脚本:bash
mysql -u root -p<password> <database_name> < /tmp/x.sql
常见问题解决
-
权限错误:确保 SQL 文件可读(容器内权限可通过
chmod a+r /tmp/x.sql调整)。 -
中文乱码:确保脚本文件编码为 UTF-8,且 MySQL 字符集配置正确(如
utf8mb4)。 -
大型脚本执行慢:尝试在 MySQL 客户端命令中添加
--max_allowed_packet=512M等参数调整性能。
选择最适合你场景的方法(推荐方法一或方法二)。如果脚本是用于数据库初始化,方法三更合适。
662

被折叠的 条评论
为什么被折叠?



