前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL客户端的进阶操作

MySQL客户端的进阶操作

作者头像
老叶茶馆
发布于 2023-02-18 09:56:31
发布于 2023-02-18 09:56:31
3.6K00
代码可运行
举报
运行总次数:0
代码可运行

引言

作为一个MySQL数据库从业者,我们最常用的工具就是mysql了,然而如何让它变的更好用,你了解吗?

mysql Client Commands

作为连接MySQL数据库的工具,mysql其实有很多非常有用的命令设置,有一些是我们日常使用的,比如\g、\G、\q,也有我们不太常用的\P、\T。今天分享一下我对这些设置的理解,希望能对大家在日常的工作中,有所帮助。

支持哪些设置

mysql提供了help命令,用以说明支持哪些命令的设置,我们先看一下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GreatDB Cluster[(none)]> help ;

For information about Percona products and services, visit:
   http://www.percona.com/
Percona Server manual: http://www.percona.com/doc/percona-server/8.0/
For the MySQL Reference Manual: http://dev.mysql.com/
To buy Percona support, training, or other products, visit:
   https://www.percona.com/

List of all MySQL commands:
Note that all text commands must be first on line and end with ';'
?         (\?) Synonym for 'help'.
clear     (\c) Clear the current input statement.
connect   (\r) Reconnect to the server. Optional arguments are db and host.
delimiter (\d) Set statement 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 an SQL script file. Takes a file name as an argument.
source_decrypt Execute an encrypted script file. Takes file name, decrypt key as arguments.
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.
charset   (\C) Switch to another charset. Might be needed for processing binlog with multi-byte charsets.
warnings  (\W) Show warnings after every statement.
nowarning (\w) Don't show warnings after every statement.
resetconnection(\x) Clean session context.
query_attributes Sets string parameters (name1 value1 name2 value2 ...) for the next query to pick up.

For server side help, type 'help contents'

?

显示帮助信息,列出所有支持的操作命令,这个最简单,就不做进一步说明了。

clear(\c)

MySQL手册介绍为清除当前输入的SQL语句,我个人更愿意理解为撤销已输入SQL的执行。看下面的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GreatDB Cluster[test]> select * from tt1;
+------+------+------+------+
| id   | dd   | c1   | c2   |
+------+------+------+------+
|    1 | aaa  | NULL | NULL |
|    2 | bbb  | NULL | NULL |
|    3 | NULL | NULL | NULL |
|    4 | 8    | NULL | NULL |
|    5 | NULL | NULL | NULL |
+------+------+------+------+
5 rows in set (0.01 sec)

GreatDB Cluster[test]> delete from tt1 
    -> where id = 5 
    -> and c1 is not null
    -> 

当我输入完上面的SQL时,发现逻辑未考虑全,不想执行这个SQL了,怎么办呢?这里有好几种解决办法:你可以ctrl+c 终止命令的执行,也可以关闭当前的mysql客户端,甚至关闭操作命令的电脑。然后有一种标准且简单的方式,就是在命令的最后加上\c,就可以实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GreatDB Cluster[test]> delete from tt1 
    -> where id = 5 
    -> and c1 is not null
    -> \c
GreatDB Cluster[test]>

可以看到,在命令窗口最后输入\c后,SQL不会被执行,并且重新启动新的命令行接收客户端输入。需要注意的是:\c和需要取消的SQL间,不能有分隔符(默认为分号;),否则会先执行分隔符前面的SQL,然后再执行\c,这时就达不到取消已输入SQL执行的效果了。

connect(\r)

重新连接数据库服务端,支持重连过程中,指定database名字和连接主机。

这个功能看起来好像没什么新奇的,客户端执行了SQL,就算连接超时了,默认情况下,自动就会重新连接服务端。

但是在MGR、主从复制场景下,如果所有实例的维护账号都具有相同的用户名、密码、端口,那么通过\r就很方便的切换多个实例进行维护,而不需要重新输入其他连接信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GreatDB Cluster[test]> select @@report_host;
+---------------+
| @@report_host |
+---------------+
| 172.16.50.82  |
+---------------+
1 row in set (0.00 sec)

GreatDB Cluster[test]> \r test 172.16.50.81
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Connection id:    911698
Current database: test

GreatDB Cluster[test]> select @@report_host;
+---------------+
| @@report_host |
+---------------+
| 172.16.50.81  |
+---------------+
1 row in set (0.00 sec)

GreatDB Cluster[test]> 

重连信息中的ip地址,也可以是在/etc/hosts中配置的主机名

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GreatDB Cluster[test]> select @@report_host;
+---------------+
| @@report_host |
+---------------+
| 172.16.50.81  |
+---------------+
1 row in set (0.00 sec)

GreatDB Cluster[test]> \r test greatdb82
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Connection id:    2460607
Current database: test

GreatDB Cluster[test]> select @@report_host;
+---------------+
| @@report_host |
+---------------+
| 172.16.50.82  |
+---------------+
1 row in set (0.00 sec)

GreatDB Cluster[test]>

delimiter(\d)

自定义分隔符,在创建、修改存储过程、函数、触发器、事件、视图都会用到,替换用于替换默认的分号分隔符。

edit(\e)

官网解释说命令用于编辑当前输入SQL命令,默认的编辑器是vi,也可以通过设置环境变量EDITOR来改变成其他的编辑器,比如调整为vim编辑器export EDITOR=$(which vim)

有这个命令后,输出错误的SQL,就不需要再用\c终止了,而是直接在其后加上\e进行编辑,修改成正确的后,再执行。

比如我实际上想要执行的命令中tt2表不存在,那么只需要通过\e更新SQL语句中的表名字就可以继续执行,不需要再重新编辑整条SQL。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GreatDB Cluster[test]> select * from test.tt2 \e

vi中替换表名字的操作就不再演示了,编辑后的执行情况如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GreatDB Cluster[test]> select * from test.tt2 \e 
    -> ;
+------+------+------+------+
| id   | dd   | c1   | c2   |
+------+------+------+------+
|    1 | aaa  | NULL | NULL |
|    2 | bbb  | NULL | NULL |
|    3 | NULL | NULL | NULL |
|    4 | 8    | NULL | NULL |
|    5 | NULL | NULL | NULL |
+------+------+------+------+
5 rows in set (0.01 sec)

GreatDB Cluster[test]>

另外在测试过程中,还发现\e可以对上一次执行的SQL进行编辑,即单独执行\e时,其实是对上次执行的SQL命令做编辑。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GreatDB Cluster[test]> \e
select * from test.tt1

这里有人就会想到,我按向上的方向键,也能编辑上一条SQL呀,何必这么麻烦,这里有下面的SQL情况,有多次换行,或者结构更复杂的SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GreatDB Cluster[test]> select * from test.z1
    -> join test.z2 
    -> using(id)
    -> limit 3;
+------+------+------+
| id   | name | name |
+------+------+------+
|    1 | 11   | 11   |
|    2 | 22   | 22   |
|   11 | 11   | 11   |
+------+------+------+
3 rows in set (0.00 sec)

GreatDB Cluster[test]>

如果按上的方向键,整个SQL语句结构就发生了变化,本来规整的SQL语句,变成了很长的一行,很难调整,但是使用\e就不会有这种情况,会保持之前的输入结构,更方便语句的调整

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GreatDB Cluster[test]> select * from test.z1
    -> join test.z2 
    -> using(id)
    -> limit 3;
+------+------+------+
| id   | name | name |
+------+------+------+
|    1 | 11   | 11   |
|    2 | 22   | 22   |
|   11 | 11   | 11   |
+------+------+------+
3 rows in set (0.00 sec)

GreatDB Cluster[test]> \e

select * from test.z1
join test.z2
using(id)
limit 3

另外,有同学经常苦恼,我昨天才输入的SQL命令,如果需要重新执行,又得输入一遍,其实这里也有一个小技巧,通过快捷键CTRL+R,输入SQL中的关键信息(比如表名字),就能快速翻出对应的SQL,如果匹配出来的行不是想要的SQL,可以继续按CTRL+R继续上翻,直到查找到需要的SQL,当然,也有可能需要的SQL已经被清理出历史记录中,这种情况是无法被找到的。

ego(\G)

提交SQL语句到服务器,并且将返回的数据列式显示。

exit(\q)

退出mysql客户端连接。

go(\g)

提交SQL语句到服务器。

pager(\P)

设置pager规则,对查询结果执行pager规则后,再输出结果。这也是一个非常有用的设置,我们常常因为processlist结果太多而不方便查看,需要通过单行grep或者查询information_schema.processlist来实现,有这个工具后,我们看看效果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GreatDB Cluster[test]> show processlist;
+---------+-----------------+--------------------+------+---------+---------+--------------------------------------------------------+----------------------------------+------------+-----------+---------------+
| Id      | User            | Host               | db   | Command | Time    | State                                                  | Info                             | Time_ms    | Rows_sent | Rows_examined |
+---------+-----------------+--------------------+------+---------+---------+--------------------------------------------------------+----------------------------------+------------+-----------+---------------+
|       6 | event_scheduler | localhost          | NULL | Daemon  | 5019248 | Waiting on empty queue                                 | NULL                             | 5019247326 |         0 |             0 |
|      26 | system user     |                    | NULL | Connect | 5018577 | waiting for handler commit                             | Group replication applier module | 5018576436 |         0 |             0 |
|      29 | system user     |                    | NULL | Query   |    1010 | Slave has read all relay log; waiting for more updates | NULL                             |    1010045 |         0 |             0 |
|      30 | system user     |                    | NULL | Query   |    1010 | Waiting for an event from Coordinator                  | NULL                             |    1010045 |         0 |             0 |
|      31 | system user     |                    | NULL | Query   |  100958 | Waiting for an event from Coordinator                  | NULL                             |  100956966 |         0 |             0 |
|      32 | system user     |                    | NULL | Query   |  100958 | Waiting for an event from Coordinator                  | NULL                             |  100956966 |         0 |             0 |
|      33 | system user     |                    | NULL | Connect | 5018577 | Waiting for an event from Coordinator                  | NULL                             | 5018576419 |         0 |             0 |
|      34 | system user     |                    | NULL | Connect | 5018577 | Waiting for an event from Coordinator                  | NULL                             | 5018576418 |         0 |             0 |
|      35 | system user     |                    | NULL | Connect | 5018577 | Waiting for an event from Coordinator                  | NULL                             | 5018576417 |         0 |             0 |
|      36 | system user     |                    | NULL | Connect | 5018577 | Waiting for an event from Coordinator                  | NULL                             | 5018576415 |         0 |             0 |
|      37 | system user     |                    | NULL | Connect | 5018577 | Waiting for an event from Coordinator                  | NULL                             | 5018576413 |         0 |             0 |
|   31568 | greatdb.sys     | localhost          | NULL | Sleep   | 4861529 | NULL                                                   | PLUGIN                           | 4861528879 |         0 |             0 |
| 2460607 | greatdb         | 172.16.50.81:59062 | test | Query   |       0 | init                                                   | show processlist                 |          0 |         0 |             0 |
| 2466518 | greatdb.sys     | localhost          | NULL | Sleep   |       1 | NULL                                                   | PLUGIN                           |        947 |         0 |             1 |
+---------+-----------------+--------------------+------+---------+---------+--------------------------------------------------------+----------------------------------+------------+-----------+---------------+
14 rows in set (0.00 sec)

GreatDB Cluster[test]> \P grep -vE 'system user|Sleep'
PAGER set to 'grep -vE 'system user|Sleep''
GreatDB Cluster[test]> show processlist;
+---------+-----------------+--------------------+------+---------+---------+--------------------------------------------------------+----------------------------------+------------+-----------+---------------+
| Id      | User            | Host               | db   | Command | Time    | State                                                  | Info                             | Time_ms    | Rows_sent | Rows_examined |
+---------+-----------------+--------------------+------+---------+---------+--------------------------------------------------------+----------------------------------+------------+-----------+---------------+
|       6 | event_scheduler | localhost          | NULL | Daemon  | 5019255 | Waiting on empty queue                                 | NULL                             | 5019255045 |         0 |             0 |
| 2460607 | greatdb         | 172.16.50.81:59062 | test | Query   |       0 | init                                                   | show processlist                 |          0 |         0 |             0 |
+---------+-----------------+--------------------+------+---------+---------+--------------------------------------------------------+----------------------------------+------------+-----------+---------------+
14 rows in set (0.01 sec)

GreatDB Cluster[test]>

pager后面可以跟很多的shell命令,比如awk、grep、wc ,对结果集的处理,当SQL不方便处理而shell方便处理时,不用再使用-e参数每次都进行连接,然后处理,比如主从结构对Slave_IO_Running、Slave_SQL_Running的监控,可设置pager grep -E 'Slave_IO_Running|Slave_SQL_Running'

pager的另外一个用途:经常有同学问,一些字段中是否有包含某些特定字符串,正常的SQL处理是需要写成col1 like '%abc%' or col2 like '%abc%'...,写出来后SQL结构相对复杂,通过pager设置pager grep -i abc; select * from tab即可方便查看。

nopager(\n)

pager的设置是整个session生命周期内都生效,通过执行nopager进行关闭设置

prompt(\R)

修改mysql客户端的命令行提示信息,支持显示的提示信息非常多,具体可以参见MySQL官网介绍。修改mysql客户端的命令行提示信息,也有好几种方式:

1、设置操作系统环境变量MYSQL_PS1 export MYSQL_PS1= " \D_\h_\p_\u > ",格式为"时间_主机_端口_用户名"

2、通过客户端的命令prompt修改 \R \D_\h_\p_\u >

3、通过my.cnf的[mysql]域进行配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[mysql]
prompt="\R \D_\h_\p_\u > "

4、如果session中通过\R xxx 临时修改了命令行提示信息,可以通过单独执行\R来恢复默认设置。

quit(\q)

退出当前session连接。

auto-rehash(#)

在使用mysql客户端连接服务器时,默认情况下会自动收集一些元数据信息,在后续输入SQL命令时可以通过tab键补齐命令,比如补齐表名字、列名字。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GreatDB Cluster[test]> select * from tt(此时按tab键)
tt1     tt1.c1  tt1.c2  tt1.dd  tt1.id  ttt     ttt.id

但是如果在session中新建了表,或者给表上新增了字段,是无法通过tab键补齐的,这时通过\#命令刷新元数据信息,之后就能对新的DDL结构进行补齐

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GreatDB Cluster[test]> create table tt2 as select * from tt1;
Query OK, 5 rows affected (0.09 sec)
Records: 5  Duplicates: 0  Warnings: 0

GreatDB Cluster[test]> select * from tt(此时按tab键)
tt1     tt1.c1  tt1.c2  tt1.dd  tt1.id  ttt     ttt.id  
GreatDB Cluster[test]> \#
GreatDB Cluster[test]> select * from tt(此时按tab键)
tt1     tt1.c1  tt1.c2  tt1.dd  tt1.id  tt2     tt2.c1  tt2.c2  tt2.dd  tt2.id  ttt     ttt.id  
GreatDB Cluster[test]> select * from tt

source(\.)

命令后需要跟一个文件名,\. filename会对filename文件中的内容按标准SQL进行解析执行。

status(\s)

输出本次连接的相关信息及服务器的一些信息,如果连接时指定了--safe-updates,还会输出查询限制相关的信息,\s输出了很多有用的信息,可仔细阅读。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[#8#root@greatdb81 ~ 20:26:13]8 m5 3306 --safe-updates 
greatsql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 916197
Server version: 8.0.25-15-greatdbcluster5.1.8-RC-6 GreatDB Cluster, Release RC-6, Revision 60ab7f36025

Copyright (c) 2009-2021 BEIJING GREAT OPENSOURCE SOFTWARE TECHNOLOGY CO.,LTD. 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

GreatDB Cluster[(none)]> \s
--------------
/greatdb/svr/greatdb/bin/greatsql  Ver 8.0.25-15-greatdbcluster5.1.8-RC-6 for Linux on x86_64 (GreatDB Cluster, Release RC-6, Revision 60ab7f36025)

Connection id:  916197
Current database: 
Current user:  greatdb@127.0.0.1
SSL:   Cipher in use is ECDHE-RSA-AES128-GCM-SHA256
Current pager:  stdout
Using outfile:  ''
Using delimiter: ;
Server version:  8.0.25-15-greatdbcluster5.1.8-RC-6 GreatDB Cluster, Release RC-6, Revision 60ab7f36025
Protocol version: 10
Connection:  127.0.0.1 via TCP/IP
Server characterset: utf8mb4
Db     characterset: utf8mb4
Client characterset: utf8mb4
Conn.  characterset: utf8mb4
TCP port:  3306
Binary data as:  Hexadecimal
Uptime:   51 days 9 hours 5 min 13 sec

Threads: 16  Questions: 4354604  Slow queries: 339  Opens: 19188  Flush tables: 3  Open tables: 6095  Queries per second avg: 0.980

Note that you are running in safe_update_mode:
UPDATEs and DELETEs that don't use a key in the WHERE clause are not allowed.
(One can force an UPDATE/DELETE by adding LIMIT # at the end of the command.)
SELECT has an automatic 'LIMIT 1000' if LIMIT is not used.
Max number of examined row combination in a join is set to: 1000000

--------------

GreatDB Cluster[(none)]>

system(!)

使用默认命令解释器执行给定命令,简单的说就是返回到操作系统执行\!之后的命令,比如下面

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GreatDB Cluster[(none)]> \! date
20221116日 星期三 20:32:34 CST
GreatDB Cluster[(none)]> \! pwd
/root
GreatDB Cluster[(none)]> \! cd /greatdb
GreatDB Cluster[(none)]> \! vmstat -w
procs -----------------------memory---------------------- ---swap-- -----io---- -system-- --------cpu--------
 r  b         swpd         free         buff        cache   si   so    bi    bo   in   cs  us  sy  id  wa  st
 1  0            0       358508            0      3117236    0    0   486    20    0    0   5   3  92   0   0
GreatDB Cluster[(none)]>

在8.0.19之前,只支持在unix系统中使用该命令,到8.0.19后,在windows中也支持了该命令。

tee(\T)

将所有执行的SQL命令及输出结果保存到指定文件中。这在调测、生产维护过程中,都是非常有用的一个功能,特别是一些安全要求高的环境中,控制台只能显示几十行命令时,想要查找之前执行的命令及执行的结果比较难,此时就能用上\T了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GreatDB Cluster[(none)]> \T /root/a.log
Logging to file '/root/a.log'
GreatDB Cluster[(none)]> select * from test.tt1;
+------+------+------+------+
| id   | dd   | c1   | c2   |
+------+------+------+------+
|    1 | aaa  | NULL | NULL |
|    2 | bbb  | NULL | NULL |
|    3 | NULL | NULL | NULL |
|    4 | 8    | NULL | NULL |
|    5 | NULL | NULL | NULL |
+------+------+------+------+
5 rows in set (0.01 sec)

GreatDB Cluster[(none)]> \! cat /root/a.log
GreatDB Cluster[(none)]> select * from test.tt1;
+------+------+------+------+
| id   | dd   | c1   | c2   |
+------+------+------+------+
|    1 | aaa  | NULL | NULL |
|    2 | bbb  | NULL | NULL |
|    3 | NULL | NULL | NULL |
|    4 | 8    | NULL | NULL |
|    5 | NULL | NULL | NULL |
+------+------+------+------+
5 rows in set (0.01 sec)

GreatDB Cluster[(none)]> 

如果想要记录每个人登录数据库,做了哪些操作,由于tee不支持根据当前时间动态产生日志文件名,我们可以这样设置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## 首先创建一个log目录
mkdir -p /greatdb/logs/client/

## 然后设置环境变量,为了连接安全,建议使用--login-path的方式进行登录,我这里使用的是gdb1登录。

echo "alias mlogin='mysql --login-path=gdb1 --tee /greatdb/logs/client/\$(date +%Y-%m-%d_%H-%M-%S).log'" >> ~/.bashrc; source ~/.bashrc

[#15#root@greatdb81 /greatdb/logs/client 20:48:53]15 echo "alias mlogin='mysql --login-path=gdb1 --tee /greatdb/logs/client/$(date +\"%Y-%m-%d_%H-%M\").log'" >> ~/.bashrc; source ~/.bashrc

## 通过设置的alias登录数据库

[#16#root@greatdb81 /greatdb/logs/client 20:49:43]16 mlogin 
Logging to file '/greatdb/logs/client/2022-11-16_20-49.log'
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 916482
Server version: 8.0.25-15-greatdbcluster5.1.8-RC-6 GreatDB Cluster, Release RC-6, Revision 60ab7f36025

Copyright (c) 2000, 2020, 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.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show tables from tpcc;
+------------------+
| Tables_in_tpcc   |
+------------------+
| bmsql_config     |
| bmsql_customer   |
| bmsql_district   |
| bmsql_history    |
| bmsql_item       |
| bmsql_new_order  |
| bmsql_oorder     |
| bmsql_order_line |
| bmsql_stock      |
| bmsql_warehouse  |
| datatypes1       |
| datatypes10      |
| datatypes11      |
| datatypes2       |
| datatypes3       |
| datatypes4       |
| datatypes5       |
| datatypes6       |
| datatypes7       |
| datatypes8       |
| datatypes9       |
+------------------+
21 rows in set (0.00 sec)

mysql>

我们发现指定的日志目录中,已经有了日志文件,并且记录了所有执行的SQL及输出结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[#9#root@greatdb81 ~ 20:51:43]9 cd /greatdb/logs/client/
[#10#root@greatdb81 /greatdb/logs/client 20:51:48]10 ll
总用量 8
-rw-r--r-- 1 root root  627 1116 20:48 2022-11-16_20-48.log
-rw-r--r-- 1 root root 3214 1116 20:50 2022-11-16_20-49.log
[#11#root@greatdb81 /greatdb/logs/client 20:51:48]11

notee(\t)

取消\T设置,不再记录操作信息到日志文件中。

use(\u)

切换当前连接的database。

warnings(\W)

在执行完SQL语句后,立即显示warning信息,不需要再手动执行show warnings;了。

nowarnings(\w)

在执行完SQL语句后,不立即显示warning信息,需要手动执行show warnings;才会显示warning信息。

resetconnection(\x)

以新连接的状态重新连接到服务器,并且进行一些信息的清理及复位,不需要再次进行权限验证。主要影响如下信息:

  1. 回滚所有活动的事务,并重置自动提交模式。
  2. 所有DML锁均已释放。
  3. 所有TEMPORARY table 均已关闭(并删除)。
  4. 会话系统变量将重新初始化。
  5. 用户变量设置丢失。
  6. 准备好的语句被释放。
  7. HANDLER关闭。
  8. LAST_INSERT_ID 置为 0。
  9. 用 GET_LOCK 释放。

可以参考8.0.26的代码libmysql.cc中4429~4444行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int STDCALL mysql_reset_connection(MYSQL *mysql) {
  DBUG_TRACE;
  if (simple_command(mysql, COM_RESET_CONNECTION, nullptr, 0, 0))
    return 1;
  else {
    mysql_detach_stmt_list(&mysql->stmts, "mysql_reset_connection");
    /* reset some of the members in mysql */
    mysql->insert_id = 0;
    mysql->affected_rows = ~(uint64_t)0;
    free_old_query(mysql);
    mysql->status = MYSQL_STATUS_READY;
    mysql_extension_bind_free(MYSQL_EXTENSION_PTR(mysql));
    return 0;
  }
}

query_attributes

通过query_attributes var1 value1 var2 value2来设置变量,然后通过mysql_query_attribute_string('var1')返回变量值value1,目前来看,并没有发现特殊的使用方法,毕竟我们也可以通过set @var1='value1'来设置。

使用体验

mysql Client Commands在某些场景下,可以极大的提高我们的操作效率,相对于完整的命令ego、pager、edit等,我更喜欢使用他们的简写命令\G、\P、\e,因为有时候完整命令不确定如何正确使用,会导致不生效,但是简写命令,是一定会生效的。

参考文章

  • MySQL 8.0 Reference Manual 4.5.1.2 mysql Client Commands(https://dev.mysql.com/doc/refman/8.0/en/mysql-commands.html)
  • MySQL 8.0 Reference Manual 9.6 Query Attributes(https://dev.mysql.com/doc/refman/8.0/en/query-attributes.html)

Enjoy MySQL :)


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-02-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 老叶茶馆 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
十道海量数据处理面试题与十个方法大总结
海量就是数据量太大,所以导致要么是无法在较短时间内迅速解决,要么是无法一次性装入内存。
全栈程序员站长
2022/09/09
1.6K0
十道海量数据处理面试题与十个方法大总结
海量数据处理
题目:两个文件各存50亿个url,每个url64个字节,内存限制4G,找出A,B共同的url
ClearSeve
2022/02/11
1.5K0
教你如何迅速秒杀掉:99%的海量数据处理面试题
   一般而言,标题含有“秒杀”,“99%”,“史上最全/最强”等词汇的往往都脱不了哗众取宠之嫌,但进一步来讲,如果读者读罢此文,却无任何收获,那么,我也甘愿背负这样的罪名,:-),同时,此文可以看做是对这篇文章:十道海量数据处理面试题与十个方法大总结的一般抽象性总结。
bear_fish
2018/09/20
1.4K0
教你如何迅速秒杀掉:99%的海量数据处理面试题
海量数据处理问题
1.给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?
我脱下短袖
2019/12/20
1.3K0
海量数据处理 - 找出最大的n个数(top K问题)
来源 | CSDN| 作者 | yofer张耀琦 前言 前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个
Tanyboye
2018/07/02
5.3K0
海量数据处理常用技术概述
在解决海量数据的问题的时候,我们需要什么样的策略和技术,是每一个人都会关心的问题。今天我们就梳理一下在解决大数据问题 的时候需要使用的技术,但是注意这里只是从技术角度进行分析,只是一种思想并不代表业界的技术策略。
MavenTalker
2019/07/19
1.4K0
海量数据处理常用技术概述
海量数据处理问题知识点复习手册
https://blog.csdn.net/v_july_v/article/details/6279498
Rude3Knife的公众号
2019/08/07
5330
海量数据处理问题知识点复习手册
面试系列:十个海量数据处理方法大总结
本文将简单总结下一些处理海量数据问题的常见方法。当然这些方法可能并不能完全覆盖所有的问题,但是这样的一些方法也基本可以处理绝大多数遇到的问题。下面的一些问题基本直接来源于公司的面试笔试题目,方法不一定最优,如果你有更好的处理方法,欢迎讨论。
王知无-import_bigdata
2019/07/09
1.5K0
入门 | 海量数据处理算法总结【超详解】
作者 | Angel_Kitty ➤1. Bloom Filter 【Bloom Filter】 Bloom Filter(BF)是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。它是一个判断元素是否存在集合的快速的概率算法。Bloom Filter有可能会出现错误判断,但不会漏掉判断。也就是Bloom Filter判断元素不再集合,那肯定不在。如果判断元素存在集合中, 有一定的概率判断错误。因此,Bloom Filter不适合那些“零错误”的应用场
AI科技大本营
2018/04/26
2K0
入门 | 海量数据处理算法总结【超详解】
海量数据处理问题知识点复习手册
https://blog.csdn.net/v_july_v/article/details/6279498
蛮三刀酱
2019/03/26
4500
海量数据处理问题知识点复习手册
海量数据处理方案
所谓的海量数据从字面上理解就是数据多到已经用大海来形容了,它指的就是数据量太大,无法在较短时间内迅速解决,无法一次性装入内存。
政采云前端团队
2023/09/22
2300
海量数据处理方案
大数据算法面试题
首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到ip是32位的,最多有个2^32个ip。同样可以采用映射的方法,比如模1000,把整个大文件映射为1000个小文件,在找出每个小文件中出现频率最大的ip(可以采用hash_map进行频率统计,然后再找出频率最大的几个)及相应的频率。然后再在这1000个最大的ip中,找出那个频率最大的ip,即为所求。
张哥编程
2025/01/19
1430
海量数据处理——从Top K引发的思考
如今互联网产生的数据量已经达到PB级别,如何在数据量不断增大的情况下,依然保证快速的检索或者更新数据,是我们面临的问题。所谓海量数据处理,是指基于海量数据的存储、处理和操作等。因为数据量太大无法在短时间迅速解决,或者不能一次性读入内存中。
MavenTalker
2019/07/19
8010
海量数据处理——从Top K引发的思考
十道海量数据处理面试题与十个方法总结 【面试+提高】
十道海量数据处理面试题与十个方法总结 一、十道海量数据处理面试题 1、海量日志数据,提取出某日访问百度次数最多的那个IP。   此题,在我之前的一篇文章算法里头有所提到,当时给出的方案是:IP的数目还是有限的,最多2^32个,所以可以考虑使用hash将ip直接存入内存,然后进行统计。   再详细介绍下此方案:首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个2^32个IP。同样可以采用映射的方法,比如模1000,把整个大文件映射为1000个小文件,再找出
Java帮帮
2018/03/19
4.8K0
海量数据处理面试题集锦
本博客内曾经整理过有关海量数据处理的10道面试题(十道海量数据处理面试题与十个方法大总结),此次除了重复了之前的10道面试题之后,重新多整理了7道。仅作各位参考,不作它用。
全栈程序员站长
2022/09/10
6820
海量数据处理面试题集锦
海量数据处理-Python
有参考如下资源: 【原创】Python处理海量数据的实战研究 python3利用归并算法对超过内存限制的超大文件进行排序 Trie树的构建和应用 海量数据处理技巧 Python实现字典树 Python bitmap数据结构算法具体实现 python BitMap实现 布隆过滤器(Bloom Filter)原理及python实现
用户2225445
2022/11/12
1.4K0
海量数据处理-Python
分治:hash + 堆 归并 快排 处理大数据
搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门),请你统计最热门的10个查询串,要求使用的内存不能超过1G。
Tim在路上
2020/08/04
9340
top K 问题
  在海量数据中找出出现频率最高的前K个数,或者从海量数据中找出最大的前K个数,这类问题被称为top K问题,例如搜索引擎中,同济最热门的10个查询词,在歌曲库中统计下载量频率最高的前10个数据。   针对这类问题,通常比较好的方案是分治+Trie树/hash+小顶堆,即将数据集按照hash方法分解成多个小数据集,然后使用Trie树或者hash统计每个小数据集中的query词频,之后用小顶堆求出每个数据集中出现频率最高的前K个数,最后在所有的top K中求出最终的top K。   例如,1亿个浮点数,如何
Mister24
2018/05/14
1.4K0
由散列表到BitMap的概念与应用(三):海量数据处理
遍历文件a,对每个url求取hash(url)%1000,然后根据所取得的值将url分别存储到1000个小文件(记为a0,a1,…,a999,每个小文件约300M),为什么是1000?主要根据内存大小和要分治的文件大小来计算,我们就大致可以把320G大小分为1000份,每份大约300M。
aoho求索
2018/12/07
9700
C++哈希应用-位图/布隆过滤器/海量数据处理
C++位图/布隆过滤器/海量数据处理 零、前言 一、位图 1、位图概念 2、位图接口的介绍以及实现 3、位图的应用 二、布隆过滤器 1、布隆过滤器概念和介绍 2、布隆过滤器的操作及实现 3、布隆过滤器的分析 三、海量数据处理 零、前言 本章主要讲解C++中对哈希的应用有关方面的内容,位图,布隆,海量数据处理 一、位图 1、位图概念 位图概念: 位图其实就是哈希的变形,同样通过映射来处理数据,只不过位图本身并不存储数据,而是存储标记 通过一个比特位来标记这个数据是否存在,1代表存在,0代表不
用户9645905
2022/11/30
5390
C++哈希应用-位图/布隆过滤器/海量数据处理
相关推荐
十道海量数据处理面试题与十个方法大总结
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档