【问题标题】:Why Running SQL script(.sql) from MySQL command line has no effects on database?为什么从 MySQL 命令行运行 SQL 脚本(.sql)对数据库没有影响?
【发布时间】:2019-12-25 18:36:54
【问题描述】:

我正在尝试像这样运行init.sql 脚本(包括数据库创建、过程创建、表创建、数据插入)文件:

  • mysql.exe -u root -p <password> <my_db> < init.sql

但不知道为什么在调用此行后会显示如下输出而数据库没有任何反应?!

配置

  • 操作系统:Windows 10(1809)
  • MySQL:8.0.17

输出:

mysql Ver 8.0.17 for Win64 on x86_64 (MySQL Community Server - GPL) 版权所有 (c) 2000, 2019,Oracle 和/或其附属公司。所有权利 保留。

Oracle 是 Oracle Corporation 和/或其 附属公司。其他名称可能是其各自所有者的商标。

用法:mysql [OPTIONS] [database] -?, --help 显示这个 帮助并退出。 -I, --help - 的同义词? --auto-rehash
启用自动重新散列。一个不需要使用 'rehash' 获得表格和字段完成,但启动 并且重新连接可能需要更长的时间。禁用 --禁用自动重新哈希。 (默认为 on;使用 --skip-auto-rehash 禁用。) -A, --no-auto-rehash 没有自动重新散列。一个人必须使用'rehash'来获得 表格和字段完成。这样可以更快地启动 mysql 并在重新连接时禁用重新散列。 --自动垂直输出 自动切换到垂直输出模式,如果 结果比终端宽度更宽。 -B, --batch 不使用历史文件。禁用交互行为。 (启用 --silent。) --bind-address=name 要绑定的 IP 地址。 --binary-as-hex 将二进制数据打印为十六进制
--character-sets-dir=name 字符集文件的目录。 --column-type-in​​fo 显示列类型信息。 -c, --cmets 保留 cmets。将 cmets 发送到服务器。这 默认为 --skip-cmets(丢弃 cmets),启用 与--cmets。 -C, --compress 在服务器/客户端协议中使用压缩。 -#, --debug[=#] 这是一个 非调试版本。抓住这个并退出。 --debug-check 这是 非调试版本。抓住这个并退出。 -T, --debug-info 这个 是非调试版本。抓住这个并退出。 -D,--数据库=名称 要使用的数据库。 --default-character-set=name 设置默认字符集。 --delimiter=name 要使用的分隔符。 --启用明文插件 启用/禁用明文身份验证插件。 -e, --execute=name 执行命令并退出。 (禁用 ——力量与历史 文件。) -E, --vertical 垂直打印查询(行)的输出。 -f, --force 继续,即使我们 得到一个 SQL 错误。 --histignore=name 以冒号分隔的列表 保持语句的模式 从登录到 syslog 和 mysql 历史记录。 -G,--命名命令 启用命名命令。命名命令意味着这个程序的 内部命令;见 mysql> 帮助。启用后, 可以从查询的任何行使用命名命令, 否则只能从第一行开始,在输入之前。 使用 --disable-named-commands 禁用。这个选项是 默认禁用。 -i, --ignore-spaces 忽略函数名后的空格。 --init-command=name SQL 命令 在连接到 MySQL 服务器时执行。 重新连接时会自动重新执行。 --local-infile 启用/禁用本地加载数据 文件。 -b, --no-beep 关闭错误提示音。 -H, --host=name 连接到主机。 -H, --html 产生 HTML 输出。 -X, --xml 产生 XML 输出。 --行号
写下错误的行号。 (默认为 on;使用 --skip-line-numbers 禁用。)-L, --skip-line-numbers 不要为错误写行号。 -n, --unbuffered 每次查询后刷新缓冲区。 --column-names 在结果中写入列名。 (默认为 on;使用 --skip-column-names 禁用。) -N, --skip-column-names 不要在结果中写列名。 --sigint-ignore 忽略 SIGINT (CTRL-C)。 -o, --one-database 忽略语句,除了那些在 默认数据库是在命令行中命名的数据库。 -p,--密码[=名称] 连接服务器时使用的密码。如果密码是 没有给出它是从 tty 询问的。 -W, --pipe 使用命名管道连接到服务器。 -P, --port=# 端口 用于连接的数字或默认为 0,in 优先顺序,my.cnf,$MYSQL_TCP_PORT, /etc/services,内置默认值 (3306)。 --prompt=name 将 mysql 提示设置为该值。 --protocol=name 用于连接的协议(tcp、socket、管道、 记忆)。 -q, --quick 不缓存结果,逐行打印。这可能会减慢 如果输出暂停,则关闭服务器。不使用 历史文件。 -r, --raw 写入字段而不进行转换。与 --batch 一起使用。 --reconnect 重新连接 如果连接丢失。禁用 --禁用-重新连接。默认情况下启用此选项。 (默认为 on;使用 --skip-reconnect 禁用。) -s, --silent 更加安静。打印结果 制表符作为分隔符, 新行上的每一行。 --shared-memory-base-name=name 共享内存的基本名称。 -S, --socket=name 用于连接的套接字文件。 --server-public-key-path=name PEM 格式的服务器公共 RSA 密钥的文件路径。 --get-server-public-key 获取服务器公钥 --ssl-mode=name SSL 连接模式。 --ssl-ca=命名 PEM 格式的 CA 文件。
--ssl-capath=name CA 目录。 --ssl-cert=name PEM 格式的 X509 证书。 --ssl-cipher=name 要使用的 SSL 密码。 --ssl-key=名称 PEM 格式的 X509 密钥。 --ssl-crl=name 证书吊销 列表。 --ssl-crlpath=name 证书吊销列表路径。
--tls-version=name 要使用的 TLS 版本,允许的值为:TLSv1、TLSv1.1、 TLSv1.2、TLSv1.3 --ssl-fips-mode=name SSL FIPS 模式(仅适用于 OpenSSL);允许 值为:OFF、ON、STRICT --tls-ciphersuites=name 要使用的 TLS v1.3 密码。 -t, --table 以表格格式输出。 --tee=name 将所有内容附加到 外档。查看交互式帮助 (\h) 还。不适用于批处理模式。禁用 --禁用三通。默认情况下禁用此选项。 -u, --user=name 如果不是当前用户,则登录用户。
-U, --safe-updates 只允许使用密钥的 UPDATE 和 DELETE。 -U, --i-am-a-dummy 选项 --safe-updates, -U 的同义词。 -v, --verbose 写更多。 (-v -v -v 给出表格输出格式)。 -V,--版本 输出版本信息并退出。 -w, --wait 等待并 如果连接断开,请重试。 --connect-timeout=# 秒数 在连接超时之前。 --max-allowed-packet=# 发送或接收的最大数据包长度 服务器。 --net-buffer-length=# TCP/IP 和套接字通信的缓冲区大小。 --select-limit=# SELECT 时的自动限制 使用 --safe-updates。 --max-join-size=# 自动限制行数 在使用时加入 --安全更新。 --show-warnings 在每条语句后显示警告。 -j, --syslog 日志过滤 系统日志的交互式命令。过滤 命令取决于通过 histignore 提供的模式 除了默认模式之外的选项。 --plugin-dir=name 客户端插件的目录。 --default-auth=name 要使用的默认身份验证客户端插件。 --binary-mode 默认情况下,ASCII '\0' 是不允许的,而 '\r\n' 是 翻译成'\n'。此开关关闭这两个功能, 并且还关闭所有客户端命令的解析,除了 \C 和 DELIMITER,在非交互模式下(用于输入 通过管道传输到 mysql 或使用“source”命令加载)。 这在处理 mysqlbinlog 的输出时是必需的 可能包含斑点。 --connect-expired-password 通知服务器此客户端已准备好处理 密码过期沙盒模式。

默认选项按给定顺序从以下文件中读取: C:\WINDOWS\my.ini C:\WINDOWS\my.cnf C:\my.ini C:\my.cnf C:\Program Files\MySQL\my.ini C:\Program Files\MySQL\my.cnf 以下组 阅读:mysql客户端以下选项可以作为第一个给出 争论: --print-defaults 打印程序参数列表并退出。 --no-defaults 不要从任何选项文件中读取默认选项, 除了登录文件。 --defaults-file=# 只从给定文件中读取默认选项#。 --defaults-extra-file=# 读取全局文件后读取此文件。 --defaults-group-suffix=# 还阅读带有 concat(group, suffix) 的组 --login-path=# 从登录文件中读取此路径。

变量 (--variable-name=value) 和布尔选项 {FALSE|TRUE} 值(阅读选项后) --------------------------------- ----------------- ----------------------- 自动重新散列 TRUE 自动垂直输出 FALSE 绑定地址
(无默认值) binary-as-hex FALSE 字符集目录(无默认值)列类型信息 FALSE cmets FALSE compress
FALSE 数据库(无默认值) 默认字符集自动分隔符
;启用明文插件 FALSE 垂直
FALSE 强制 FALSE histignore
(无默认值)命名命令 FALSE 忽略空格 FALSE 初始化命令
(无默认值) local-infile FALSE no-beep
FALSE 主机(无默认值)html
FALSE xml FALSE 行号
TRUE 无缓冲 FALSE 列名
TRUE sigint-ignore FALSE 端口
0 提示 mysql> 快速
FALSE 原始 FALSE 重新连接
FALSE shared-memory-base-name(无默认值)socket
(无默认值) server-public-key-path (无默认值) 值)获取服务器公钥 FALSE ssl-ca
(无默认值) ssl-capath (无默认值) 值)ssl-cert(无默认值)ssl-cipher (无默认值) ssl-key (无默认值) 值)ssl-crl(无默认值) ssl-crlpath (无默认值) tls-version
(无默认值) tls-ciphersuites (无默认值) 值)表 FALSE 用户
root 安全更新 FALSE i-am-a-dummy
FALSE 连接超时 0 最大允许数据包
16777216 净缓冲区长度 16384 选择限制
1000 最大连接大小 1000000 显示警告
FALSE 插件目录(无默认值) default-auth(无默认值)二进制模式
FALSE connect-expired-password FALSE

【问题讨论】:

    标签: mysql cmd sql-scripts


    【解决方案1】:

    你显示的输出是mysql客户端的帮助输出。它根本没有运行您的 init.sql 脚本。它没有走那么远,因为它不理解你调用客户端的命令。

    我不使用 Windows,但我知道 < 输入重定向在 Powershell 中不起作用。您可以以不同的方式运行 SQL 脚本,而无需使用输入重定向:

    mysql ...options... -e "source init.sql"
    

    您还应该了解,如果-p 和密码之间有空格,则mysql 客户端的-p 选项不起作用。

    使用任一:

    mysql -p<password> ...
    

    或者:

    mysql --password=<password> ...
    

    但我的偏好是完全避免将用户名和密码放在命令行上。将它们放在一个选项文件中,如下所述:https://dev.mysql.com/doc/refman/8.0/en/option-files.html

    【讨论】:

    • 感谢您的澄清,但如果mysql 不理解命令或错误选项,我们会收到警告
    • 当命令不理解您的命令时输出帮助是非常标准的。这就是它在这种情况下所做的。
    【解决方案2】:

    我建议按照MySQL8.0 文档的描述进行操作。尝试完全限定 --user--password,如下所示:

    shell> mysql --user=user_name --password=pass db_name
    

    List of options

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-13
      • 2011-10-07
      • 1970-01-01
      • 2018-02-23
      • 1970-01-01
      • 2020-07-07
      • 1970-01-01
      相关资源
      最近更新 更多