在 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
等参数调整性能。
选择最适合你场景的方法(推荐方法一或方法二)。如果脚本是用于数据库初始化,方法三更合适。