mysql/windows/docker-如何将转储文件导入mySQL容器
#mysql #docker #windows #powershell


OS:Windows
DB:mysql
虚拟化软件•docker
shellï¼powershell / git bash /命令提示< / p>

我尝试使用转储文件在Windows上的MySQL容器中导入,这是一项非常艰巨的工作。

如何使用PowerShell命令导出转储文件(从容器外部执行)

当您从容器外部获取MySQL转储文件时,命令就是这样。

我有一个名为“ mysql”的MySQL容器。

docker-compose exec mysql mysqldump --user=root --password=password myapp01 > dump_file_20221119.sql

要执行,替换您的环境中的“ - user”和“ - password”。
该方案是“ myapp01”。

执行此命令后,将创建dump_file_20221119.sql。
到目前为止还没有问题。

如何导入转储文件

PowerShell(从容器外部执行)[失败]

我尝试了最基本的导入命令。

docker-compose exec mysql mysql --host=localhost --user=root --password=password myapp01 < dump_file_20221119.sql

结果是:

PS C:\kaki\work> docker-compose exec mysql mysql --host=localhost --user=root --password=password myapp01 < dump_file_20221119.sql
発生場所 行:1 文字:90
+ ... ql --host=localhost --user=root --password=password myapp01 < dump_fi ...
+                                                                 ~
演算子 '<' は、今後の使用のために予約されています。
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : RedirectionNotSupported

您不能在powershell中使用字符'<'。

我抬头看如何使角色逃脱,但是没有办法做到这一点。

(参考)
about Special Characters - PowerShell | Microsoft Learn

我尝试了“ <”和“ <”,它不起作用。

PowerShell(从容器外部执行 - 其他命令)[失败]

执行导入命令时,可以使用'-e'选项而不是字符'<'。

(参考)
MySQL :: MySQL 5.6 Reference Manual :: 4.5.4 mysqldump — A Database Backup Program

(示例)
shell> mysql -e“ source/path to-backup/backup-file.sql” db_name

所以,我尝试了:

docker-compose exec mysql mysql --user=root --password=password -e "source dump_file_20221119.sql" myapp01

结果是:

ERROR at line 1: Failed to open file 'dump_file_20221119.sql'

我发现“ -e”选项仅目标文件。

我尝试将转储文件存储在容器中并执行命令,识别该文件。

尽管发生了错误。

ERROR: ASCII '\0' appeared in the statement, but this is not allowed unless option --binary-mode is enabled and mysql is run in non-interactive mode. Set --binary-mode to 1 if ASCII '\0' is expected. Query: '��m'.

原因是powershell默认字符代码为cp932(sjis)。

(注意)
作者是日语。

(参考)
How to export dump file on Windows, import it to Ubuntu

我以为如果“二进制模式”设置为“ 1”,它将起作用。
但是,不是。

(参考)
mysql Client Options

执行命令:

docker-compose exec mysql mysql --user=root --password=password -e "source dump_file_20221119.sql" myapp01 --binary-mode

结果:

ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'source dump_file_20221119.sql' at line 1

当我搜索“二进制模式”选项时,我找到了“ - binary mode = 1”和“ binary mode 0”。
但是,我不太了解。 (我尝试了它们,但我有错误)

我不确定为什么有这么多不同的陈述。无论如何,我从官方网站上引用了一个。

但是,如果解决问题,我必须在容器中设置文件。因此,这不是一种有效的方法。

当我使用MySQL Workbench附加命令导出时,我可以成功导入而无需提及错误。

命令是:

使用mysql workbench附加命令导出

& "C:\Program Files\MySQL\MySQL Workbench 8.0 CE\mysqldump.exe" --result-file=dump_file_20221119.sql myapp01 --user=root --password=password --host=127.0.0.1 --port=3306 --set-gtid-purged=OFF --skip-lock-tables --skip-add-locks --skip-column-statistics

外壳是powershell。
当您执行包含空间的PowerShell命令时,发生了错误。
因此,您必须采取其他方法。

您需要将转储文件放在MySQL容器中。

执行PowerShell脚本[失败]

我认为如果我创建PowerShell脚本文件并执行了。
所以,我尝试了。

我创建了文件“ dump-import.ps1”。
文件内容为:

dump-import.ps1

Write-Host "dump importing..."

# docker-compose exec mysql bash
docker-compose exec mysql mysql --host=localhost --user=root --password=password myapp01 < dump_file_20221119.sql

执行命令:

PowerShell -ExecutionPolicy RemoteSigned .\dump-import.ps1

结果:

PS C:\kaki\work\tmp> PowerShell -ExecutionPolicy RemoteSigned .\dump-import.ps1
発生場所 C:\kaki\work\dump-import.ps1:4 文字:90
+ ... ql --host=localhost --user=root --password=password myapp01 < dump_fi ...
+                                                                 ~
演算子 '<' は、今後の使用のために予約されています。
    + CategoryInfo          : ParserError: (:) [], ParseException
    + FullyQualifiedErrorId : RedirectionNotSupported

我有完全相同的错误。

它正确地工作了命令“ docker-compose exec mysql bash”。

使用git bash [失败]

我使用powershell放弃了,所以我尝试了git bash。

结果是:

$ docker-compose exec mysql mysql --host=localhost --user=root --password=password myapp01 < dump_file_20221119.sql
the input device is not a TTY.  If you are using mintty, try prefixing the command with 'winpty'

错误消息说使用“ winpy”。

无论如何,在命令的头上添加“ winpy”。

(参考)
the input device is not a TTY. If you are using mintty, try prefixing the command with 'winpty' · Issue #2888 · vercel/hyper

所以,重新执行。

$ winpty docker-compose exec mysql mysql --host=localhost --user=root --password=password myapp01 < dump_file_20221119.sql
stdin is not a tty

错误消息说“ stdin不是tty”。

我在研究后找到了页面。

docker-compose on wsl: stdin is not a tty · Issue #166 · rprichard/winpty

这是Docker的长期问题。
它的终端检测方式仅适用于cmd.exe和powershell.exe。任何第三方终端都可以检测并发出消息。

似乎不可能在Docker命令的头上添加“ winty”,必须直接使用PowerShell或CMD。 (如果您使用Windows)

作为旁注,您可以在此处查看有关“ Winpty”的信息。

[Git Bash] winpty コマンドについて調べてみた([Git Bash] About winpty)

“ winpy”命令是在Windows Console程序和UNIX虚拟终端之间交互的接口。

使用命令提示[失败]

所以,我使用了CMD。

C:\kaki\work>docker-compose exec mysql mysql --host=localhost --user=root --password=password myapp01 < dump_file_20221119.sql
the input device is not a TTY.  If you are using mintty, try prefixing the command with 'winpty'

接下来,我在头上重新执行了“ wintpy”的命令。

C:\kaki\work\ryuki-prd>winpty docker-compose exec mysql mysql --host=localhost --user=root --password=password myapp01 < dump_file_20221119.sql
'winpty' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

它不起作用。

在容器内执行命令[成功(但效率低下)]

我在输入容器后尝试执行导入命令。

有必要在主机和容器之间设置共享目录。
示例在这里:

docker-compose.yml

  mysql:
    image: mysql:5.7

# (omission)

    volumes:
      - db-data:/var/lib/mysql
      - ./shared_db:/shared_db  # set share directory between host and container

在登录mysql容器后,将导出的转储文件存储在“ shared_db”目录中。

并在容器内部的“ shared_db”目录中执行导入命令。

缺点:需要重建容器。烦人。

另外,完全不适合编辑docker-compose.yml和重建容器以导入转储文件。

使用MySQL Workbench。 [成功]

经过漫长的研究,我建议使用MySQL Workbench将转储文件导入Windows上的MySQL容器。

当我用上面的命令导入转储文件时,关于字符编码的错误。
因此,最好使用MySQL Workbench导出。

MySQLWorkBenchï¼出口

1.服务器 - >数据导出

sqlworkbench01

2ï¼启动出口

选择要导出的模式。 (图像中的“ myApp01”。)

选择出口独立文件。
(如果您不检查选项,则将为每个表创建转储文件,从而在文件系统中创建灾难。)

设置导出文件名。

单击“启动导出”按钮。

sqlworkbench02

3.数据导出完成

sqlworkbench03

MySQLWorkBenchï¼导入

1ï¼删除现有模式

删除架构以导入“ myApp01”。

sqlworkbench04

2.创建模式

重新创建已删除的架构。(MyApp01)

sqlworkbench05

设置名称,然后单击“应用”。

sqlworkbench06

您可以将算法和锁定类型作为默认类型。
sqlworkbench07

将创建方案。
sqlworkbench08

3.服务器 - >数据导入

sqlworkbench09

4ï¼开始导入

选择“从独立文件导入”,然后设置导出文件。

设置目标方案。

然后,单击“启动导入”。

sqlworkbench10

5ï¼导入完成

sqlworkbench11

观察

我希望Powershell接受角色“ <”。