Docker MySQL容器中无法同时执行Dump导入与全局参数设置命令的问题
解决MySQL 5.7 Dump导入8.0.4容器的版本兼容问题
问题根源
你之前的命令无法正常导入dump文件,原因如下:
- 使用
-e参数时,MySQL客户端执行指定的SET语句后会直接退出,不会读取管道传入的dump内容 - 使用
<<<输入重定向时,该输入会覆盖管道内容,MySQL只会执行SET语句,完全忽略dump文件
正确解决方案
方法1:分两次执行命令
先单独设置全局变量,再导入dump文件:
# 执行全局变量配置 sudo docker exec -i easy_marine_db_8 mysql easy_marine -uworkbench -pworkbench -e "SET GLOBAL log_bin_trust_function_creators = 1;" # 导入dump文件 sudo cat easy_marine.sql | docker exec -i easy_marine_db_8 mysql easy_marine -uworkbench -pworkbench
方法2:合并命令一次执行
将SET语句和dump文件内容合并后传入MySQL,确保先执行配置再导入数据:
echo "SET GLOBAL log_bin_trust_function_creators = 1;" | cat - easy_marine.sql | sudo docker exec -i easy_marine_db_8 mysql easy_marine -uworkbench -pworkbench
说明:cat - easy_marine.sql会先读取标准输入(即echo输出的SET语句),再读取dump文件内容,一起传递给MySQL客户端
方法3:修改容器配置永久生效
如果需要长期解决这个问题,可以修改MySQL容器的启动配置,让变量在容器启动时自动生效:
Docker Compose示例:
services: easy_marine_db_8: image: mysql:8.0.4 command: --log-bin-trust-function-creators=1 environment: MYSQL_USER: workbench MYSQL_PASSWORD: workbench MYSQL_DATABASE: easy_marine # 其他挂载、端口等配置...
直接docker run示例:
docker run -d \ --name easy_marine_db_8 \ -e MYSQL_USER=workbench \ -e MYSQL_PASSWORD=workbench \ -e MYSQL_DATABASE=easy_marine \ mysql:8.0.4 --log-bin-trust-function-creators=1
内容的提问来源于stack exchange,提问作者rafaelpadu
相关产品推荐
相关产品推荐

