为什么来自 MySQL 命令行的 运行 SQL 脚本 (.sql) 对数据库没有影响?
Why Running SQL script(.sql) from MySQL command line has no effects on database?
我正在尝试 运行 一个 init.sql
脚本(包括数据库创建、过程创建、table 创建、数据插入)文件,如下所示:
mysql.exe -u root -p <password> <my_db> < init.sql
.
但不知道为什么在调用此行后它会显示如下输出并且数据库没有任何变化?!
配置
- OS:
Windows 10(1809)
- MySQL:
8.0.17
输出:
mysql Ver 8.0.17 for Win64 on x86_64 (MySQL Community Server - GPL)
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights
reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective owners.
Usage: mysql [OPTIONS] [database] -?, --help Display this
help and exit. -I, --help Synonym for -? --auto-rehash
Enable automatic rehashing. One doesn't need to use
'rehash' to get table and field completion, but startup
and reconnecting may take a longer time. Disable with
--disable-auto-rehash.
(Defaults to on; use --skip-auto-rehash to disable.) -A, --no-auto-rehash
No automatic rehashing. One has to use 'rehash' to get
table and field completion. This gives a quicker start of
mysql and disables rehashing on reconnect. --auto-vertical-output
Automatically switch to vertical output mode if the
result is wider than the terminal width. -B, --batch Don't use history file. Disable interactive behavior.
(Enables --silent.) --bind-address=name IP address to bind to. --binary-as-hex Print binary data as hex
--character-sets-dir=name
Directory for character set files. --column-type-info Display column type information. -c, --comments Preserve comments. Send comments to the server. The
default is --skip-comments (discard comments), enable
with --comments. -C, --compress Use compression in server/client protocol. -#, --debug[=#] This is a
non-debug version. Catch this and exit. --debug-check This is
a non-debug version. Catch this and exit. -T, --debug-info This
is a non-debug version. Catch this and exit. -D, --database=name
Database to use. --default-character-set=name
Set the default character set. --delimiter=name Delimiter to be used. --enable-cleartext-plugin
Enable/disable the clear text authentication plugin. -e, --execute=name Execute command and quit. (Disables
--force and history
file.) -E, --vertical Print the output of a query (rows) vertically. -f, --force Continue even if we
get an SQL error. --histignore=name A colon-separated list of
patterns to keep statements
from getting logged into syslog and mysql history. -G, --named-commands
Enable named commands. Named commands mean this program's
internal commands; see mysql> help . When enabled, the
named commands can be used from any line of the query,
otherwise only from the first line, before an enter.
Disable with --disable-named-commands. This option is
disabled by default. -i, --ignore-spaces Ignore space after function names. --init-command=name SQL Command
to execute when connecting to MySQL server.
Will automatically be re-executed when reconnecting. --local-infile Enable/disable LOAD DATA LOCAL
INFILE. -b, --no-beep Turn off beep on error. -h,
--host=name Connect to host. -H, --html Produce HTML output. -X, --xml Produce XML output. --line-numbers
Write line numbers for errors.
(Defaults to on; use --skip-line-numbers to disable.) -L, --skip-line-numbers
Don't write line number for errors. -n, --unbuffered Flush buffer after each query. --column-names Write column names in results.
(Defaults to on; use --skip-column-names to disable.) -N, --skip-column-names
Don't write column names in results. --sigint-ignore Ignore SIGINT (CTRL-C). -o, --one-database Ignore statements except those that occur while the
default database is the one named at the command line. -p, --password[=name]
Password to use when connecting to server. If password is
not given it's asked from the tty. -W, --pipe Use named pipes to connect to server. -P, --port=# Port
number to use for connection or 0 for default to, in
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/services, built-in default (3306). --prompt=name Set the mysql prompt to this value. --protocol=name The protocol to use for connection (tcp, socket, pipe,
memory). -q, --quick Don't cache result, print it row by row. This may slow
down the server if the output is suspended. Doesn't use
history file. -r, --raw Write fields without conversion. Used with --batch. --reconnect Reconnect
if the connection is lost. Disable with
--disable-reconnect. This option is enabled by default.
(Defaults to on; use --skip-reconnect to disable.) -s, --silent Be more silent. Print results with a
tab as separator,
each row on new line. --shared-memory-base-name=name
Base name of shared memory. -S, --socket=name The socket file to use for connection. --server-public-key-path=name
File path to the server public RSA key in PEM format. --get-server-public-key
Get server public key --ssl-mode=name SSL connection mode. --ssl-ca=name CA file in PEM format.
--ssl-capath=name CA directory. --ssl-cert=name X509 cert in PEM format. --ssl-cipher=name SSL cipher to use. --ssl-key=name
X509 key in PEM format. --ssl-crl=name Certificate revocation
list. --ssl-crlpath=name Certificate revocation list path.
--tls-version=name TLS version to use, permitted values are: TLSv1, TLSv1.1,
TLSv1.2, TLSv1.3 --ssl-fips-mode=name
SSL FIPS mode (applies only for OpenSSL); permitted
values are: OFF, ON, STRICT --tls-ciphersuites=name
TLS v1.3 cipher to use. -t, --table Output in table format. --tee=name Append everything into
outfile. See interactive help (\h)
also. Does not work in batch mode. Disable with
--disable-tee. This option is disabled by default. -u, --user=name User for login if not current user.
-U, --safe-updates Only allow UPDATE and DELETE that uses keys. -U, --i-am-a-dummy Synonym for option --safe-updates, -U. -v, --verbose Write more. (-v -v -v gives the table output format). -V, --version
Output version information and exit. -w, --wait Wait and
retry if connection is down. --connect-timeout=# Number of seconds
before connection timeout. --max-allowed-packet=#
The maximum packet length to send to or receive from
server. --net-buffer-length=#
The buffer size for TCP/IP and socket communication. --select-limit=# Automatic limit for SELECT when
using --safe-updates. --max-join-size=# Automatic limit for rows
in a join when using
--safe-updates. --show-warnings Show warnings after every statement. -j, --syslog Log filtered
interactive commands to syslog. Filtering of
commands depends on the patterns supplied via histignore
option besides the default patterns. --plugin-dir=name Directory for client-side plugins. --default-auth=name Default authentication client-side plugin to use. --binary-mode By default, ASCII '[=18=]' is disallowed and '\r\n' is
translated to '\n'. This switch turns off both features,
and also turns off parsing of all clientcommands except
\C and DELIMITER, in non-interactive mode (for input
piped to mysql or loaded using the 'source' command).
This is necessary when processing output from mysqlbinlog
that may contain blobs. --connect-expired-password
Notify the server that this client is prepared to handle
expired password sandbox mode.
Default options are read from the following files in the given order:
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 The following groups
are read: mysql client The following options may be given as the first
argument:
--print-defaults Print the program argument list and exit.
--no-defaults Don't read default options from any option file,
except for login file.
--defaults-file=# Only read default options from the given file #.
--defaults-extra-file=# Read this file after the global files are read.
--defaults-group-suffix=#
Also read groups with concat(group, suffix)
--login-path=# Read this path from the login file.
Variables (--variable-name=value) and boolean options {FALSE|TRUE}
Value (after reading options)
--------------------------------- ---------------------------------------- auto-rehash TRUE auto-vertical-output FALSE bind-address
(No default value) binary-as-hex FALSE
character-sets-dir (No default value) column-type-info
FALSE comments FALSE compress
FALSE database (No default value)
default-character-set auto delimiter
; enable-cleartext-plugin FALSE vertical
FALSE force FALSE histignore
(No default value) named-commands FALSE
ignore-spaces FALSE init-command
(No default value) local-infile FALSE no-beep
FALSE host (No default value) html
FALSE xml FALSE line-numbers
TRUE unbuffered FALSE column-names
TRUE sigint-ignore FALSE port
0 prompt mysql> quick
FALSE raw FALSE reconnect
FALSE shared-memory-base-name (No default value) socket
(No default value) server-public-key-path (No default
value) get-server-public-key FALSE ssl-ca
(No default value) ssl-capath (No default
value) ssl-cert (No default value) ssl-cipher
(No default value) ssl-key (No default
value) ssl-crl (No default value)
ssl-crlpath (No default value) tls-version
(No default value) tls-ciphersuites (No default
value) table FALSE user
root safe-updates FALSE i-am-a-dummy
FALSE connect-timeout 0 max-allowed-packet
16777216 net-buffer-length 16384 select-limit
1000 max-join-size 1000000 show-warnings
FALSE plugin-dir (No default value)
default-auth (No default value) binary-mode
FALSE connect-expired-password FALSE
我建议按照描述的 MySQL8.0 文档进行操作。尝试完全限定--user和--password如下:
shell> mysql --user=user_name --password=pass db_name
您显示的输出是 mysql 客户端的帮助输出。它根本不是 运行 您的 init.sql 脚本。它没有走那么远,因为它不理解你调用客户端的命令。
我不使用 Windows,但我知道 <
输入重定向在 Powershell 中不起作用。您可以用不同的方式 运行 一个 SQL 脚本,而不使用输入重定向:
mysql ...options... -e "source init.sql"
您还应该了解,如果 -p
和密码之间有 space,则 mysql 客户端的 -p
选项将不起作用。
使用其中之一:
mysql -p<password> ...
或者:
mysql --password=<password> ...
但我的偏好是完全避免在命令行中输入用户名和密码。将它们放在选项文件中,如下所述:https://dev.mysql.com/doc/refman/8.0/en/option-files.html
我正在尝试 运行 一个 init.sql
脚本(包括数据库创建、过程创建、table 创建、数据插入)文件,如下所示:
mysql.exe -u root -p <password> <my_db> < init.sql
.
但不知道为什么在调用此行后它会显示如下输出并且数据库没有任何变化?!
配置
- OS:
Windows 10(1809)
- MySQL:
8.0.17
输出:
mysql Ver 8.0.17 for Win64 on x86_64 (MySQL Community Server - GPL) Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.
Usage: mysql [OPTIONS] [database] -?, --help Display this help and exit. -I, --help Synonym for -? --auto-rehash
Enable automatic rehashing. One doesn't need to use 'rehash' to get table and field completion, but startup and reconnecting may take a longer time. Disable with --disable-auto-rehash. (Defaults to on; use --skip-auto-rehash to disable.) -A, --no-auto-rehash No automatic rehashing. One has to use 'rehash' to get table and field completion. This gives a quicker start of mysql and disables rehashing on reconnect. --auto-vertical-output Automatically switch to vertical output mode if the result is wider than the terminal width. -B, --batch Don't use history file. Disable interactive behavior. (Enables --silent.) --bind-address=name IP address to bind to. --binary-as-hex Print binary data as hex
--character-sets-dir=name Directory for character set files. --column-type-info Display column type information. -c, --comments Preserve comments. Send comments to the server. The default is --skip-comments (discard comments), enable with --comments. -C, --compress Use compression in server/client protocol. -#, --debug[=#] This is a non-debug version. Catch this and exit. --debug-check This is a non-debug version. Catch this and exit. -T, --debug-info This is a non-debug version. Catch this and exit. -D, --database=name Database to use. --default-character-set=name Set the default character set. --delimiter=name Delimiter to be used. --enable-cleartext-plugin Enable/disable the clear text authentication plugin. -e, --execute=name Execute command and quit. (Disables --force and history file.) -E, --vertical Print the output of a query (rows) vertically. -f, --force Continue even if we get an SQL error. --histignore=name A colon-separated list of patterns to keep statements from getting logged into syslog and mysql history. -G, --named-commands Enable named commands. Named commands mean this program's internal commands; see mysql> help . When enabled, the named commands can be used from any line of the query, otherwise only from the first line, before an enter. Disable with --disable-named-commands. This option is disabled by default. -i, --ignore-spaces Ignore space after function names. --init-command=name SQL Command to execute when connecting to MySQL server. Will automatically be re-executed when reconnecting. --local-infile Enable/disable LOAD DATA LOCAL INFILE. -b, --no-beep Turn off beep on error. -h, --host=name Connect to host. -H, --html Produce HTML output. -X, --xml Produce XML output. --line-numbers
Write line numbers for errors. (Defaults to on; use --skip-line-numbers to disable.) -L, --skip-line-numbers Don't write line number for errors. -n, --unbuffered Flush buffer after each query. --column-names Write column names in results. (Defaults to on; use --skip-column-names to disable.) -N, --skip-column-names Don't write column names in results. --sigint-ignore Ignore SIGINT (CTRL-C). -o, --one-database Ignore statements except those that occur while the default database is the one named at the command line. -p, --password[=name] Password to use when connecting to server. If password is not given it's asked from the tty. -W, --pipe Use named pipes to connect to server. -P, --port=# Port number to use for connection or 0 for default to, in order of preference, my.cnf, $MYSQL_TCP_PORT, /etc/services, built-in default (3306). --prompt=name Set the mysql prompt to this value. --protocol=name The protocol to use for connection (tcp, socket, pipe, memory). -q, --quick Don't cache result, print it row by row. This may slow down the server if the output is suspended. Doesn't use history file. -r, --raw Write fields without conversion. Used with --batch. --reconnect Reconnect if the connection is lost. Disable with --disable-reconnect. This option is enabled by default. (Defaults to on; use --skip-reconnect to disable.) -s, --silent Be more silent. Print results with a tab as separator, each row on new line. --shared-memory-base-name=name Base name of shared memory. -S, --socket=name The socket file to use for connection. --server-public-key-path=name File path to the server public RSA key in PEM format. --get-server-public-key Get server public key --ssl-mode=name SSL connection mode. --ssl-ca=name CA file in PEM format.
--ssl-capath=name CA directory. --ssl-cert=name X509 cert in PEM format. --ssl-cipher=name SSL cipher to use. --ssl-key=name X509 key in PEM format. --ssl-crl=name Certificate revocation list. --ssl-crlpath=name Certificate revocation list path.
--tls-version=name TLS version to use, permitted values are: TLSv1, TLSv1.1, TLSv1.2, TLSv1.3 --ssl-fips-mode=name SSL FIPS mode (applies only for OpenSSL); permitted values are: OFF, ON, STRICT --tls-ciphersuites=name TLS v1.3 cipher to use. -t, --table Output in table format. --tee=name Append everything into outfile. See interactive help (\h) also. Does not work in batch mode. Disable with --disable-tee. This option is disabled by default. -u, --user=name User for login if not current user.
-U, --safe-updates Only allow UPDATE and DELETE that uses keys. -U, --i-am-a-dummy Synonym for option --safe-updates, -U. -v, --verbose Write more. (-v -v -v gives the table output format). -V, --version Output version information and exit. -w, --wait Wait and retry if connection is down. --connect-timeout=# Number of seconds before connection timeout. --max-allowed-packet=# The maximum packet length to send to or receive from server. --net-buffer-length=# The buffer size for TCP/IP and socket communication. --select-limit=# Automatic limit for SELECT when using --safe-updates. --max-join-size=# Automatic limit for rows in a join when using --safe-updates. --show-warnings Show warnings after every statement. -j, --syslog Log filtered interactive commands to syslog. Filtering of commands depends on the patterns supplied via histignore option besides the default patterns. --plugin-dir=name Directory for client-side plugins. --default-auth=name Default authentication client-side plugin to use. --binary-mode By default, ASCII '[=18=]' is disallowed and '\r\n' is translated to '\n'. This switch turns off both features, and also turns off parsing of all clientcommands except \C and DELIMITER, in non-interactive mode (for input piped to mysql or loaded using the 'source' command). This is necessary when processing output from mysqlbinlog that may contain blobs. --connect-expired-password Notify the server that this client is prepared to handle expired password sandbox mode.Default options are read from the following files in the given order: 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 The following groups are read: mysql client The following options may be given as the first argument: --print-defaults Print the program argument list and exit. --no-defaults Don't read default options from any option file, except for login file. --defaults-file=# Only read default options from the given file #. --defaults-extra-file=# Read this file after the global files are read. --defaults-group-suffix=# Also read groups with concat(group, suffix) --login-path=# Read this path from the login file.
Variables (--variable-name=value) and boolean options {FALSE|TRUE} Value (after reading options) --------------------------------- ---------------------------------------- auto-rehash TRUE auto-vertical-output FALSE bind-address
(No default value) binary-as-hex FALSE character-sets-dir (No default value) column-type-info FALSE comments FALSE compress
FALSE database (No default value) default-character-set auto delimiter
; enable-cleartext-plugin FALSE vertical
FALSE force FALSE histignore
(No default value) named-commands FALSE ignore-spaces FALSE init-command
(No default value) local-infile FALSE no-beep
FALSE host (No default value) html
FALSE xml FALSE line-numbers
TRUE unbuffered FALSE column-names
TRUE sigint-ignore FALSE port
0 prompt mysql> quick
FALSE raw FALSE reconnect
FALSE shared-memory-base-name (No default value) socket
(No default value) server-public-key-path (No default value) get-server-public-key FALSE ssl-ca
(No default value) ssl-capath (No default value) ssl-cert (No default value) ssl-cipher (No default value) ssl-key (No default value) ssl-crl (No default value) ssl-crlpath (No default value) tls-version
(No default value) tls-ciphersuites (No default value) table FALSE user
root safe-updates FALSE i-am-a-dummy
FALSE connect-timeout 0 max-allowed-packet
16777216 net-buffer-length 16384 select-limit
1000 max-join-size 1000000 show-warnings
FALSE plugin-dir (No default value) default-auth (No default value) binary-mode
FALSE connect-expired-password FALSE
我建议按照描述的 MySQL8.0 文档进行操作。尝试完全限定--user和--password如下:
shell> mysql --user=user_name --password=pass db_name
您显示的输出是 mysql 客户端的帮助输出。它根本不是 运行 您的 init.sql 脚本。它没有走那么远,因为它不理解你调用客户端的命令。
我不使用 Windows,但我知道 <
输入重定向在 Powershell 中不起作用。您可以用不同的方式 运行 一个 SQL 脚本,而不使用输入重定向:
mysql ...options... -e "source init.sql"
您还应该了解,如果 -p
和密码之间有 space,则 mysql 客户端的 -p
选项将不起作用。
使用其中之一:
mysql -p<password> ...
或者:
mysql --password=<password> ...
但我的偏好是完全避免在命令行中输入用户名和密码。将它们放在选项文件中,如下所述:https://dev.mysql.com/doc/refman/8.0/en/option-files.html