Docker容器中MySQL备份恢复时Unicode字符乱码问题求助
解决MySQL备份恢复乱码问题及替代方案
修复PowerShell命令(直接解决编码问题)
乱码核心原因是PowerShell默认的set-content/get-content采用系统默认编码(通常非UTF-8),而你的MySQL数据库使用utf8mb4编码,mysqldump输出UTF-8格式内容,管道传输时编码不匹配导致乱码。修改命令时指定UTF-8编码即可:
备份命令
docker exec db /usr/bin/mysqldump -u myuser --password=123 --no-tablespaces mydb | set-content backup__.sql -Encoding UTF8
恢复命令
get-content backup__.sql -Encoding UTF8 | docker exec -i db mysql -u myuser --password=123 mydb
若仍有问题,可改用Out-File并指定编码:
docker exec db /usr/bin/mysqldump -u myuser --password=123 --no-tablespaces mydb | Out-File -FilePath backup__.sql -Encoding UTF8
替代方案(无需PowerShell)
如果不想依赖PowerShell,以下几种方案更适合给产品经理使用:
1. CMD脚本
用Windows命令提示符编写脚本,先切换到UTF-8编码再执行操作:
备份脚本(backup.cmd)
chcp 65001 docker exec db /usr/bin/mysqldump -u myuser --password=123 --no-tablespaces mydb > backup__.sql
恢复脚本(restore.cmd)
chcp 65001 docker exec -i db mysql -u myuser --password=123 mydb < backup__.sql
2. Docker挂载卷直接备份/恢复
通过挂载宿主目录到容器,让备份文件直接生成在宿主机器,完全避免管道编码问题:
备份命令
# 假设宿主备份目录是D:\mysql-backup,挂载到容器/backup路径 docker exec -v D:\mysql-backup:/backup db /usr/bin/mysqldump -u myuser --password=123 --no-tablespaces mydb > /backup/backup__.sql
恢复命令
docker exec -v D:\mysql-backup:/backup db sh -c "/usr/bin/mysql -u myuser --password=123 mydb < /backup/backup__.sql"
注:启动容器时需提前添加挂载参数-v D:\mysql-backup:/backup,或临时挂载执行命令
3. 使用WSL(Windows Subsystem for Linux)
若系统已开启WSL,直接用Linux bash命令执行,彻底避开Windows编码问题:
备份命令
docker exec db /usr/bin/mysqldump -u myuser --password=123 --no-tablespaces mydb > /mnt/d/mysql-backup/backup__.sql
恢复命令
cat /mnt/d/mysql-backup/backup__.sql | docker exec -i db mysql -u myuser --password=123 mydb
内容的提问来源于stack exchange,提问作者Morteza M
相关产品推荐
相关产品推荐

