当前位置: 首页 > 文档资料 > MySQL 中文手册 >

8.3. mysql:MySQL命令行工具

优质
小牛编辑
136浏览
2023-12-01
8.3.1. 选项
8.3.2. mysql命令
8.3.3. 怎样从文本文件执行SQL语句
8.3.4. mysql技巧

mysql是一个简单的SQL外壳(有GNU readline功能)。它支持交互式和非交互式使用。当交互使用时,查询结果采用ASCII表格式。当采用非交互式(例如,用作过滤器)模式时,结果为tab分割符格式。可以使用命令行选项更改输出格式。

如果由于结果较大而内存不足遇到问题,使用--quick选项。这样可以强制mysql从服务器每次一行搜索结果,而不是检索整个结果集并在显示之前不得不将它保存到内存中。使用mysql_use_result()而不是mysql_store_result()来搜索结果集。

使用mysql很简单。从命令解释符提示来调用它:

shell> mysql db_name

或:

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

这样输入一个SQL语句,用‘;’、\g或者\G结尾并按回车键。

你可以这样运行一个脚本:

shell> mysql db_name < script.sql > output.tab

8.3.1. 选项

mysql支持下面的选项:

·---help,-?

显示帮助消息并退出。

·--batch,-B

打印结果,使用tab作为列间隔符,每个行占用新的一行。使用该选项,则mysql不使用历史文件。

·--character-sets -dir=path

字符集的安装目录。参见5.10.1节,“数据和排序用字符集”。

·--compress,-C

压缩在客户端和服务器之间发送的所有信息(如果二者均支持压缩)。

·---database=db_name,-Ddb_name

要使用的数据库。主要在选项文件中有用。

·---debug[=debug_options],-# [debug_options]

写调试日志。debug_options字符串通常为'd:t:o,file_name'。默认为'd:t:o,/tmp/mysql.trace'。

·---debug-info,-T

当程序退出时输出部分调试信息。

·--default-character-set=charset

使用charsetas作为默认字符集。参见5.10.1节,“数据和排序用字符集”。

·--execute=statement,-e statement

执行语句并退出。默认输出格式与用--batch产生的相同。4.3.1节,“在命令行上使用选项”中提供了一些例子。

·--force,-f

即使出现一个SQL错误仍继续。

·--host=host_name,-hhost_name

连接给定主机上的MySQL服务器。

·--html,-H

产生HTML输出。

·--ignore-space,-i

忽视函数名后面的空格。其结果描述参见5.3.2节,“SQL服务器模式”中的IGNORE_SPACE的讨论。

·--local-infile[={0|1}]

为LOAD DATA INFILE启用或禁用LOCAL功能。没有值,该选项启用LOCAL。还可以采用--local-infile=0或--local-infile=1以显式禁用或启用LOCAL。如果服务器不支持,启用LOCAL不会生效。

·--named-commands,-G

命名的命令被启用。允许长格式命令和短格式\*命令。例如,quit和\q均被识别。

·--no-auto-rehash,-A

不自动重新进行哈希运算。该选项使mysql启动得更快,但果你想要完成表和列名,你必须发出rehash命令。

·--no-beep,-b

当发生错误时不要保持。

·--no-named-commands,-g

命名的命令被禁用。只使用\*形式,或者只使用行开头的命名用分号(‘;’)结束的的命令。对于MySQL 3.23.22,默认情况mysql启动时启用该选项。然而,即使使用该选项,长格式命令仍然从第1行工作。

·--no-pager

不使用分页器来显示查询输出。在8.3.2节,“mysql命令”中详细讨论了输出分页。

·--no-tee

不将输出复制到文件中。在8.3.2节,“mysql命令”中详细讨论了Tee文件。

·--one--database,-O

忽视除了为命令行中命名的默认数据库的语句。可以帮助跳过对二进制日志中的其它数据库的更新。

·--pager[=command]

使用给出的命令来分页查询输出。如果该命令被删除,默认分页器为PAGER环境变量的值。合法pagers是less、more、cat [>filename]等等。该选项只在Unix中工作。不能以批处理模式工作。在8.3.2节,“mysql命令”中详细讨论了输出分页。

·--password[=password],-p[password]

当连接服务器时使用的密码。如果使用短选项形式(-p),选项和密码之间不能有空格。如果在命令行中--password或-p选项后面没有密码值,则提示输入一个密码。在SysV-based UNIX系统中应省略密码,因为密码可以显示在ps的输出中。

·--port=port_num,-Pport_num

用于连接的TCP/IP端口号。

·--prompt=format_str

将提示设置为指定的格式。默认为mysql>。在8.3.2节,“mysql命令”中描述了提示中可以包含的具体顺序。

·--protocol={TCP | SOCKET | PIPE | MEMORY}

使用的连接协议。

·--quick,-q

不缓存每个查询的结果,按照接收顺序打印每一行。如果输出被挂起,服务器会慢下来。使用该选项,mysql不使用历史文件。

·--raw,-r

写列的值而不转义转换。通常结合--batch选项使用。

·--reconnect

如果与服务器之间的连接断开,自动尝试重新连接。每次连接断开后则尝试一次重新连接。要想禁止重新连接,使用--skip-reconnect。

·--safe-updates,--i-am-a-dummy,-U

只允许那些使用键值指定行生效的UPDATE和DELETE语句。如果已经在选项文件中设置了该选项,可以用命令行中的--safe-updates覆盖它。关于该选项的详细信息参见8.3.4节,“mysql技巧”。

·--secure-auth

不向旧(pre-4.1.1)格式的服务器发送密码。这样可以防止不使用新密码格式的服务器的连接。

·--show-warnings

如果每个语句后有警告则显示。该选项适用于交互式和批处理模式。

·--sigint-ignore

忽视SIGINT符号(一般为Control-C的结果)。

·--silent,-s

沉默模式。产生少的输出。可以多次使用该选项以产生更少的输出。

·--skip-column-names,-N

在结果中不写列名。

·--skip-line-numbers,-L

在错误信息中不写行号。当你想要比较包括错误消息的结果文件时有用。

·--socket=path,-Spath

用于连接的套接字文件。

·--tables,-t

用表格式显示输出。这是交互式应用的默认设置,但可用来以批处理模式产生表输出。

·--tee=file_name

将输出拷贝添加到给定的文件中。该选项在批处理模式不工作。在8.3.2节,“mysql命令”中详细讨论了Tee文件。

·--unbuffered,-n

每次查询后刷新缓存区。

·--user=user_name,-uuser_name

当连接服务器时MySQL使用的用户名。

·--verbose,-v

冗长模式。产生更多的输出。可以多次使用该选项以产生更多的输出。(例如,-v -v -v甚至可以在批处理模式产生表输出格式)。

·--version,-V

显示版本信息并退出。

·--vertical,-E

垂直输出查询输出的行。没有该选项,可以用\G结尾来指定单个语句的垂直输出。

·--wait,-w

如果不能建立连接,等待并重试而不是放弃。

·--xml,-X

产生XML输出。

你还可以使用--var_name=value选项设置下面的变量:

·connect_timeout

连接超时前的秒数。(默认值是0)。

·max_allowed_packet

从服务器发送或接收的最大包长度。(默认值是16MB)。

·max_join_size

当使用--safe-updates时联接中的行的自动限制。(默认值是1,000,000)。

·net_buffer_length

TCP/IP和套接字通信缓冲区大小。(默认值是16KB)。

·select_limit

当使用--safe-updates时SELECT语句的自动限制。(默认值是1,000)。

也可以使用--set-variable=var_name=value or -O var_name=value语法来设置变量。不赞成使用该语法

在Unix中,mysql客户程序向历史文件中写入已执行语句的一条记录。默认情况,历史文件名为.mysql_history并在根目录中重建。要想指定不同的文件,应设置MYSQL_HISTFILE环境变量的值。

如果不想要历史文件,首先删除.mysql_history(如果有),然后使用下面的任何一种方法:

·将MYSQL_HISTFILE变量设到/dev/null。要想在每次登录时让该设置生效,将该设置放入外壳的一个启动文件中。

·创建.mysql_history,作为一个符号链接指向/dev/null:

·shell> ln -s /dev/null $HOME/.mysql_history

只需要执行一次。

8.3.2. mysql命令

mysql将发出的SQL语句发送到待执行的服务器。还有一系列命令mysql可以自己解释。要查看这些命令,在mysql>提示下输入help或\h:

mysql> helpList of all MySQL commands:Note that all text commands must be first on line and end with ';'? (\?) Synonym for `help'.clear     (\c) Clear command.connect   (\r) Reconnect to the server. Optional arguments are db and host.delimiter (\d) Set statement delimiter. NOTE: Takes the rest of the line as new delimiter.edit      (\e) Edit command with $EDITOR.ego       (\G) Send command to mysql server, display result vertically.exit      (\q) Exit mysql. Same as quit.go(\g) Send command to mysql server.help      (\h) Display this help.nopager   (\n) Disable pager, print to stdout.notee     (\t) Don't write into outfile.pager     (\P) Set PAGER [to_pager]. Print the query results via PAGER.print     (\p) Print current command.prompt    (\R) Change your mysql prompt.quit      (\q) Quit mysql.rehash    (\#) Rebuild completion hash.source    (\.) Execute a SQL script file. Takes a file name as an argument.status    (\s) Get status information from the server.system    (\!) Execute a system shell command.tee       (\T) Set outfile [to_outfile]. Append everything into given outfile.use       (\u) Use another database. Takes database name as argument.warnings  (\W) Show warnings after every statement.nowarning (\w) Don't show warnings after every statement.

每个命令有长形式和短形式。长形式对大小写不敏感;短形式敏感。长形式后面可以加一个分号结束符,但短形式不可以。

在delimiter命令中,应避免使用反斜线(‘\’),因为这是MySQL的转义符。

Editnopagerpagersystem命令只在Unix中工作。

status命令提供连接和使用的服务器相关的部分信息。如果用--safe-updates模式运行,status也打印影响查询的MySQL变量的值。

要想记录查询及其输出,应使用tee命令。屏幕上显示的所有数据被追加到给定的文件后面。这对于调试也很有用。可以用--tee选项在命令行中启用该特性,或者用tee命令交互式启用。可以用notee命令交互式禁用tee文件。再次执行tee可以重新启用日志。前面的文件使用时不带任何参数。请注意执行完每个语句后tee可以将查询结果刷新到一个文件中,并且在mysql打印下一个提示前刷新。

用--pager选项,可以用交互式模式使用Unix程序,例如less、more或者其它类似的程序,来浏览或搜索查询结果。如果未指定该选项的值,mysql检查PAGER环境变量的值并将PAGER设为该值。可以用pager命令交互式启用输出分页,并用nopager禁用。该命令采用可选参量;如果给出,分页程序设置为该值。如果没有给出参量,分页器被设置为在命令行中设置的分页器的值,如果未指定分页器,则设置为stdout。

输出分页只适合Unix,因为它使用popen()函数,该函数在Windows中不存在。在Windows中,可以使用tee选项来保存查询输出,尽管在某些情况下浏览输出时不如pager方便。

关于pager命令的一些技巧:

·可以使用它写入一个文件,将结果只输出到该文件中:

·mysql> pager cat > /tmp/log.txt

也可以为将用作分页器的程序传递选项:

mysql> pager less -n -i -S

·注意前面例子中的-S选项。它可以帮助浏览广范围的查询结果。有时太广的结果很难在屏幕上读出来。less的-S选项可以使结果更易于读,因为可以用左、右箭头水平滚动它。还可以在less中交互式使用-S,以关闭或打开水平浏览模式。详细信息请阅读手册中的less页:

·shell> man less

·可以指定很复杂的pager命令来处理查询输出:

·mysql> PAGER cat | tee /dr1/tmp/res.txt \
·  | tee /dr2/tmp/res2.txt | less -n -i -S

在该例子中,该命令将查询结果发送到位于/dr1和/dr2上安装的两个不同的文件系统中的两个不同目录中的两个文件中,但仍然可以通过less将结果显示在屏幕上。

还可以结合使用teepager函数。启用一个tee文件并将pager设置为less,能够使用less程序浏览结果,并且仍然可以同时将内容添加到一个文件中。结合pager命令使用的Unixteemysql嵌入式tee命令的差别是即使没有可用的Unixtee,嵌入式tee仍然可以工作。嵌入式tee还可以记录在屏幕上输出的内容,而结合pager命令使用的Unixtee不能记录那么多的内容。并且,可以从MySQL中交互式打开或关闭tee文件日志。当你想要将部分查询记录到一个文件中时很有用,但其它不适合。

默认mysql>提示符可以重新配置。定义提示符的字符串可以包含下面的特殊序列:

选项

描述

\v

服务器版本

\d

当前的数据库

\h

服务器主机

\p

当前的TCP/IP端口或套接字文件

\u

你的用户名

\U

你的全user_name@host_name账户名

\\

‘\’反斜线字符

\n

新行字符

\t

Tab字符

\

空格(反斜线后面的空格)

\_

空格

\R

当前的时间,24-小时军用时间(0-23)

\r

当前的时间,标准12-小时(1-12)

\m

当前时间的分钟

\y

当前的年,两位

\Y

当前的年,四位

\D

当前的日期

\s

当前时间的秒

\w

当前周的天,3字符格式(Mon,Tue,...)

\P

am/pm

\o

当前的月,数字格式

\O

当前的月,3字符格式(Jan,Feb,...)

\c

随发出的每个语句递增的计数

\S

分号

\'

单引号

\"

双引号

‘\’后面跟随的其它字母则变为该字母。

如果不用任何参量指定提示命令,mysql将提示重新设置位默认mysql>。

可以用几种方式设置提示:

·使用环境变量

可以用MYSQL_PS1环境变量来设置提示字符串。例如:

shell> export MYSQL_PS1="(\u@\h) [\d]> "

·使用选项文件

可以在MySQL选项文件中的[mysql]组设置提示,例如根目录中的/etc/my.cnf或.my.cnf文件。例如:

[mysql]
prompt=(\\u@\\h) [\\d]>\\_

在该例子中,请注意反斜线是双线。如果使用选项文件中的prompt选项来设置提示,当使用特殊提示选项时,建议使用双反斜线。在允许的提示选项和选项文件中可识别的特殊转义序列中有部分重叠。(这些序列列于4.3.2节,“使用选项文件”)。如果使用单反斜线,会遇到问题。例如,\s被解释为空格而不是当前的秒值。下面的例子显示了如何在选项文件中定义提示以包括当前的时间,格式为HH:MM:SS>:

[mysql]
prompt="\\r:\\m:\\s> "

·使用命令行选项

可以在mysql的命令行中设置--prompt选项。例如:

shell> mysql --prompt="(\u@\h) [\d]> "
(user@host) [database]>

·交互式

你可以使用prompt(或\R)命令交互地更改提示。例如:

mysql> prompt (\u@\h) [\d]>\_
PROMPT set to '(\u@\h) [\d]>\_'
(user@host) [database]>
(user@host) [database]> prompt
Returning to default PROMPT of mysql>
mysql>

8.3.3. 怎样从文本文件执行SQL语句

mysql客户程序一般交互使用:

shell> mysql db_name

还可以将SQL语句放到一个文件中然后告诉mysql从该文件读取输入。要想实现,创建一个文本文件text_file,并包含你想要执行的语句。然后按如下所示调用mysql

shell> mysql db_name < text_file

还可以用一个USEdb_name语句启动文本文件。在这种情况下,不需要在命令行中指定数据库名:

shell> mysql < text_file

如果正运行mysql,可以使用source或\.命令执行SQL脚本文件:

mysql> source filename
mysql> \. filename

有时想要使用脚本来向用户显示进度信息;为此可以插入下述行:

SELECT '<info_to_display>' AS ' ';

将输出<info_to_display>。

关于批处理模式的详细信息,参见3.5节,“在批处理模式下使用mysql”。

8.3.4. mysql技巧

8.3.4.1. 垂直显示查询结果
8.3.4.2. 使用--safe-updates选项
8.3.4.3. 禁用mysql自动连

该节描述了可以帮助你更有效使用mysql的一些技术。

8.3.4.1. 垂直显示查询结果

一些查询结果如果垂直显示而不用通常的水平表格式显示,则更容易读取。用\G而不用分号结束查询可以垂直显示查询。例如,包括新行的更长的文本值垂直输出时通常更容易读取:

mysql> SELECT * FROM mails WHERE LENGTH(txt) < 300 LIMIT 300,1\G*************************** 1. row ***************************  msg_nro: 3068     date: 2000-03-01 23:29:50time_zone: +0200mail_from: Monty    reply: monty@no.spam.com  mail_to: "Thimble Smith" <tim@no.spam.com>      sbj: UTF-8      txt: >>>>> "Thimble" == Thimble Smith writes:Thimble> Hi.  I think this is a good idea.  Is anyone familiarThimble> with UTF-8 or Unicode? Otherwise, I'll put this on myThimble> TODO list and see what happens.Yes, please do that.Regards,Monty     file: inbox-jani-1     hash: 1904029441 row in set (0.09 sec)

8.3.4.2. 使用--safe-updates选项

对于新手,有一个有用的启动选项--safe-updates(或--i-am-a-dummy,具有相同的效果)。当你已经发出一个DELETE FROM tbl_name语句但忘记了WHERE子句时很有用。通常情况,这样的语句从表中删除所有行。用--safe-updates,可以通过指定可以识别它们的键值只删除某些行。这样可以帮助防止事故。

若使用--safe-updates选项,mysql连接MySQL服务器时发出下面的语句:

SET SQL_SAFE_UPDATES=1,SQL_SELECT_LIMIT=1000, SQL_MAX_JOIN_SIZE=1000000;

参见13.5.3节,“SET语法”。

SET语句有下面的效果:

·不允许你执行UPDATE或DELETE语句,除非在WHERE子句中指定一个键值约束或提供一个LIMIT子句(或二者皆使用)。例如:

·UPDATE tbl_name SET not_key_column=val WHERE key_column=val;
· 
·UPDATE tbl_name SET not_key_column=val LIMIT 1;

·所有大的SELECT结果自动限制到1,000行,除非语句包括一个LIMIT子句。

·放弃可能需要检查1,000,000多行组合的多表SELECT语句。

要将限制指定为1,000和1,000,000之外的值,可以使用--select_limit和--max_join_size选项覆盖默认值:

shell> mysql --safe-updates --select_limit=500 --max_join_size=10000

8.3.4.3. 禁用mysql自动连

如果mysql客户程序发送查询时断开与服务器的连接,它立即并自动尝试重新连接服务器并再次发送查询。然而,即使mysql重新连接成功,你的第1个连接也已经结束,并且以前的会话对象和设定值被丢失:包括临时表、自动提交模式,以及用户和会话变量。该行为很危险,如下面的例子所示,服务器将在你不知道的情况下关闭并重启:

mysql> SET @a=1;
Query OK, 0 rows affected (0.05 sec)
 
mysql> INSERT INTO t VALUES(@a);
ERROR 2006: MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    1
Current database: test
 
Query OK, 1 row affected (1.30 sec)
 
mysql> SELECT * FROM t;
+------+
| a    |
+------+
| NULL |
+------+
1 row in set (0.05 sec)

@a用户变量已经随连接丢失,并且重新连接后它也没有定义。如果有必要在连接断开时终止mysql并提示错误,你可以用--skip-reconnect选项启动mysql客户程序。