【问题标题】:How to run SQL script in MySQL?如何在 MySQL 中运行 SQL 脚本?
【发布时间】:2012-02-14 22:46:21
【问题描述】:

我想在 MySQL 中执行一个包含 SQL 查询的文本文件。

我尝试运行source /Desktop/test.sql 并收到错误:

mysql>。 \home\sivakumar\Desktop\test.sql 错误:无法打开文件 '\home\sivakumar\Desktop\test.sql',错误:2

知道我做错了什么吗?

【问题讨论】:

标签: mysql command-line


【解决方案1】:

我使用 Bash 的 Here Strings 进行即时 SQL 执行:

mysql -uroot -p <<<"select date(now())"

https://www.gnu.org/software/bash/manual/html_node/Redirections.html#Here-Strings

【讨论】:

    【解决方案2】:

    从 linux 14.04 到 MySql 5.7,使用cat 命令通过 mysql 登录:

    cat /Desktop/test.sql | sudo mysql -uroot -p 
    

    您可以使用此方法让许多 MySQL 命令直接从 Shell 执行。例如:

    echo "USE my_db; SHOW tables;" | sudo mysql -uroot -p 
    

    确保用分号 (';') 分隔命令。

    我在上面的答案中没有看到这种方法,并认为这是一个很好的贡献。

    【讨论】:

      【解决方案3】:

      有很多方法可以做到。

      From Workbench: File > Run SQL Script -- then follow prompts
      
      From Windows Command Line:
         Option 1: mysql -u usr -p
                   mysql> source file_path.sql
         Option 2: mysql -u usr -p '-e source file_path.sql'
         Option 3: mysql -u usr -p < file_path.sql
         Option 4: put multiple 'source' statements inside of file_path.sql (I do this to drop and recreate schemas/databases which requires multiple files to be run)
                   mysql -u usr -p < file_path.sql
      

      如果您从命令行收到错误,请确保您之前已经运行过

      cd {!!>>mysqld.exe home directory here<<!!}
      mysqld.exe --initialize 
      

      这必须从 mysqld.exe 目录中运行,因此是 CD。

      希望这是有帮助的,而不仅仅是多余的。

      【讨论】:

        【解决方案4】:

        我会执行以下操作而不是重定向

        mysql -h <hostname> -u <username> --password=<password> -D <database> -e 'source <path-to-sql-file>'
        

        这将执行文件 path-to-sql-file

        【讨论】:

          【解决方案5】:

          我最喜欢的选择是:

           mysql --user="username" --database="databasename" --password="yourpassword" < "filepath"
          

          我这样使用它是因为当你用 "" 将它串起来时,你可以避免错误的路径和空格的错误,而且可能还有更多我没有遇到的字符问题。


          使用@elcuco 评论,我建议在之前使用带有 [space] 的命令,这样它会告诉 bash 忽略将其保存在历史记录中,这在大多数 bash 中都是开箱即用的。

          如果它仍然将您的命令保存在历史记录中,请查看以下解决方案:

          Execute command without keeping it in history


          额外的安全编辑

          如果您想更加安全,可以使用以下命令并在命令行输入中输入密码:

          mysql --user="username" --database="databasename" -p < "filepath"
          

          【讨论】:

          • 我不建议将密码传递给命令行,因为它会保存在 ~/.bash_history 中,并且可以被其他程序通过 /proc/ 访问。
          • 来自@elcuco 的出色建议!此外,可能在 -p 之后使用另一个标志(或将其作为最后一个参数),因此不会错误地将另一个参数视为预期密码。
          • 请注意,命令行参数仍然对其他用户可见。示例: for i in /proc/*/cmdline ;回声 $i;猫$我;完成
          • 这不是重新开始,因为您将服务器密码暴露给控制台的历史记录
          • @AlexiusDiakogiannis 你能给我举个例子,当你在命令前使用 [空格] 执行命令时,如何从历史记录中查看命令?
          【解决方案6】:

          我也来到这里寻找这个答案,这是我发现最适合我的方法:注意我使用的是 Ubuntu 16.x.x

          1. 使用以下方式访问mysql:

          mysql -u &lt;your_user&gt; - p

          1. 在 mysql 提示符下,输入:

          source file_name.sql

          希望这会有所帮助。

          【讨论】:

          • 除了启动提示之外,将这两个步骤组合在一个命令中甚至可能会很有用:mysql -u&lt;user&gt; -p -e 'source filename.sql'
          • 谢谢,@junix!以这种方式使用的 source 选项正是我想要的。
          【解决方案7】:
          mysql -uusername -ppassword database-name < file.sql
          

          【讨论】:

            【解决方案8】:

            从命令行直接传递密码参数绝对不是一个好习惯,它保存在~/.bash_history 文件中,并且可以从其他应用程序访问。

            改用这个:

            mysql -u user --host host --port 9999 database_name < /scripts/script.sql -p
            Enter password:
            

            【讨论】:

              【解决方案9】:

              .sql 文件的路径为:

              source c:/dump/SQL/file_name.sql;
              

              【讨论】:

              • 非常感谢!即使您的用户没有 SUDO 权限并且在远程 Amazon RDS 上也可以使用此方法
              【解决方案10】:

              你有很多选择:

              • 使用 MySQL 命令行客户端:mysql -h hostname -u user database &lt; path/to/test.sql
              • 安装 MySQL GUI 工具并打开您的 SQL 文件,然后执行它
              • 如果数据库可以通过您的网络服务器使用,请使用 phpmysql

              【讨论】:

              • 用户的密码(-p选项)呢?
              • @AmirKatz 虽然可以使用-p 选项提供密码,但不建议这样做:在这种情况下,同一主机上的其他用户可以使用ps 等系统工具来读取它。
              • @EugenRieck -p 不带参数提示在下一行输入密码
              【解决方案11】:
              mysql> source C:\Users\admin\Desktop\fn_Split.sql
              

              不要指定单引号。

              如果上述命令不起作用,请将文件复制到 c: 驱动器并重试。 如下图,

              mysql> source C:\fn_Split.sql
              

              【讨论】:

                【解决方案12】:

                我遇到了这个错误,我尝试了所有我能得到的建议都无济于事。

                最后,问题是我的文件夹在文件夹名称中有一个空格,在文件夹路径中显示为正斜杠,一旦我找到并删除它,它就可以正常工作了。

                【讨论】:

                  【解决方案13】:

                  为了将来参考,我发现这与上述方法相比,在 Windows 下的 msql 控制台中有效:

                  mysql>>source c://path_to_file//path_to_file//file_name.sql;

                  如果您的根驱动器不称为“c”,则只需与您的驱动器名称互换即可。首先尝试反斜杠,如果它们不起作用,请尝试正斜杠。如果它们也不起作用,请确保您有完整的文件路径、文件名上的 .sql 扩展名,如果您的版本坚持使用分号,请确保它存在并重试。

                  【讨论】:

                    【解决方案14】:

                    如果您使用的是 MySQL 命令行 mysql&gt;,则必须将 SQL 文件声明为 source

                    mysql> source \home\user\Desktop\test.sql;
                    

                    【讨论】:

                    • 对于 Mac 上的 mysql 5.6.10,文件路径不需要单引号。
                    • 对于 Windows,使用 '/' 而不是 '\' 对我来说是正确的。最初使用“/”时出现错误。这对我有用...source C:/Users/macombers/Downloads/midcoast_db.sql;
                    • 在 ubuntu 上也去掉引号(mysql Ver 14.14 debian-linux-gnu (x86_64) using EditLine wrapper)
                    • @kapil 相对于什么?此时你在 MySQL 中,所以恐怕没有亲戚。
                    • @kapil 我知道这篇文章已经很老了,但是如果您在启动 mysql 之前位于脚本所在的文件夹中,则无需输入完整路径。
                    【解决方案15】:

                    所有热门答案都很好。但万一有人想从远程服务器上的文本文件运行查询将结果保存到文件(而不是在控制台上显示),您可以这样做:

                    mysql -u yourusername -p yourpassword yourdatabase < query_file > results_file
                    

                    希望这对某人有所帮助。

                    【讨论】:

                    • 我认为-p和密码之间应该没有空格
                    • 如果写入文件的目的是进行数据转储,我猜SELECT ... INTO OUTFILE /path/to/file.csv 是更有效的方式。在此处查看选项和语法 - dev.mysql.com/doc/refman/5.7/en/select-into.html
                    【解决方案16】:

                    由于mysql -u yourusername -p yourpassword yourdatabase &lt; text_file 无法在远程服务器(亚马逊的 EC2)上运行...

                    确保首先创建数据库。

                    然后:

                    mysql --host=localhost --user=your_username --password=your_password your_database_name < pathTofilename.sql
                    

                    【讨论】:

                      【解决方案17】:

                      很可能,您只需要更改斜线/黑斜线: 来自

                       \home\sivakumar\Desktop\test.sql
                      

                       /home/sivakumar/Desktop/test.sql
                      

                      所以命令是:

                      source /home/sivakumar/Desktop/test.sql
                      

                      【讨论】:

                        【解决方案18】:

                        使用 mysql 命令提示符-

                        中的以下内容
                        source \\home\\user\\Desktop\\test.sql;
                        

                        不使用引号。即使路径包含空格(' '),请使用完全不引用

                        【讨论】:

                          【解决方案19】:

                          您可以使用以下命令执行已写入文本文件的 mysql 语句:

                          mysql -u yourusername -p yourpassword yourdatabase < text_file
                          

                          如果您的数据库尚未创建,请先使用以下命令登录您的 mysql:

                          mysql -u yourusername -p yourpassword yourdatabase
                          

                          然后:

                          mysql>CREATE DATABASE a_new_database_name
                          

                          然后:

                          mysql -u yourusername -p yourpassword a_new_database_name < text_file
                          

                          应该这样做!

                          更多信息在这里:http://dev.mysql.com/doc/refman/5.0/en/mysql-batch-commands.html

                          【讨论】:

                          • 在 Windows 上:对于密码,我必须使用引号并且没有空格才能使其工作(密码本身不包含任何空格或特殊字符):mysql -u yourusername -p"yourpassword"
                          • 如果您不希望密码出现在提示符上,我相信这里概述的方法会起作用:stackoverflow.com/questions/9293042/…
                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 2018-11-19
                          • 1970-01-01
                          • 1970-01-01
                          • 2013-06-09
                          • 2013-10-11
                          • 2020-10-06
                          • 1970-01-01
                          相关资源
                          最近更新 更多