如何使用PowerShell脚本将.sql文件导入MySQL?

6

我正在尝试从Windows环境将一个包含CREATE/DROP/INSERT命令的dump文件(.sql文件)导入到远程MySQL服务器。我使用安装在我的环境中的"MySQL shell utility"功能来完成这个任务。

Set-ExecutionPolicy RemoteSigned
Add-Type –Path 'C:\Program Files (x86)\MySQL\MySQL Connector Net 8.0.11\Assemblies\v4.5.2\MySql.Data.dll'
$Connection = [MySql.Data.MySqlClient.MySqlConnection]@{ConnectionString='server=192.168.100.100;Encrypt=false;uid=myUser;pwd=myPass;database=myDB;'}
$Connection.Open()
$sql = New-Object MySql.Data.MySqlClient.MySqlCommand
$sql.Connection = $Connection
$sql.CommandText = "SOURCE D:/MySQL_Dumps/myFile.sql"
$sql.ExecuteNonQuery()
$Reader.Close()
$Connection.Close()

我可以连接到服务器并执行基本的SELECT查询,使用ExecuteNonQuery()/ExecuteScalar()/ExecuteReader()方法,但是对于这个特定的SOURCE命令,我收到了一个错误:
异常调用“ExecuteNonQuery”与“0”参数(s):“您有一个错误
在您的SQL语法中;检查手册对应于您的MySQL服务器的版本
使用附近的正确语法'源
D:/MySQL_Dumps/myFile.sql'在线1" 在行:8字符:1
+ $sql.ExecuteNonQuery()
+ ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : MySqlException
我尝试了几种输入路径的替代方法,比如使用双斜杠或双反斜杠,但遇到了同样的错误。有人能帮忙吗?

$sql.CommandText = Get-Content D:\MySQL_Dumps\myFile.sql -Raw - iRon
请详细说明。您是否遇到了相同的错误?D:\MySQL_Dumps\myFile.sql文件中有什么内容?请将此信息添加到问题中(特别是如果您现在遇到了不同的错误)。 - iRon
我得到了完全相同的错误;文件内容是有效的,因为它在任何IDE上都可以完美地工作。 - Behnam2016
替换文件内容可以使脚本工作!但事实并非如此,因为我没有其他方法来避免引用该文件。 - Behnam2016
值得一提的是:根据MySql文档,查询应该以分号结尾:"一个查询通常由一个SQL语句后跟一个分号组成。(有一些例外情况,其中分号可以省略。QUIT是其中之一。我们稍后会介绍其他情况。)"。如果您收到此类错误,我建议您在MySQL查询语法上变得更加严格。意思是:$sql.CommandText = "SOURCE D:/MySQL_Dumps/myFile.sql;" - iRon
显示剩余2条评论
3个回答

22
./mysql -u root -p DatabaseName -e "source C:\path\to\my_sql_file.sql"

2
这很好用@mytuny。但是你能解释一下-e标志后面发生了什么,或者请指给我一篇文章吗?一直在努力理解那部分。 - Tashrik Anam
5
若有人无法理解此帖子并需要解释。-e--execute 标志用于执行 SQL 语句。如果你已在 MySQL shell 中或想要从文件执行语句,则可以使用 MySQL 命令 source。【执行手册】(https://dev.mysql.com/doc/refman/8.0/en/mysql-command-options.html#option_mysql_execute) 【源手册】(https://dev.mysql.com/doc/refman/8.0/en/mysql-batch-commands.html) - Murolack
非常好的解释 @Murolack!! - mytuny
感谢“source”命令,以前从未见过。为什么输入管道在PS中不起作用:./mysql -u root -p DatabaseName < file.sql - Anse

0

我知道这个帖子有点老了,但是在谷歌搜索这个问题时它是排名第一的,所以我要发表我的看法。

我在一个项目中遇到了同样的问题,在使用代码片段后解决了它。

$sql.CommandText = Get-Content D:\MySQL_Dumps\myFile.sql -Raw

我在使用自定义DELIMITER字符的脚本时遇到了问题(包含存储过程、触发器和用户定义函数的.sql文件)。

经过一些研究,我发现有一个类MySql.Data.MySqlClient.MySqlScript可以处理.sql文件/脚本的执行。根据this thread,从连接器版本5.2.8开始,自定义DELIMITER问题不再存在。 所以,对我有效的是以下代码片段:

$Script = New-Object MySql.Data.MySqlClient.MySqlScript($MySqlConn)
$Script.Query = Get-Content $ScriptPath -Raw
$Script.Execute() | Out-Null

我目前正在使用 MySql.Data.dll 版本 8.0.25。


0
$sql.CommandText = Get-Content D:\MySQL_Dumps\myFile.sql -Raw

这对我来说完美地运作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接