暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL Client链接实用options

原创 Ty 2023-04-20
128


 

MySQL客户端是DBA常用的工具,交互式,短连接方式,直连对应的数据库,进而对数据库进行操作。遇到紧急情况,可以通过Control+C将中断当前语句。这里[client] Options提供了诸多功能,可以有效的提高处理效果。

下面来挖掘下(MySQL8.0版本)一些比较实用的功能,。

–auto-rehash

使用mysql客户端登录的时候,可以读取表信息和列信息,自动补全。如:Linux命令行里,使用Tab键进行自动补全一样。

shell# mysql --help | grep auto
--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.
复制

当配置补全参数登录的时,就需要数据库,表,字段信息全部加载到客户端对应的缓存里。这样导致卡顿慢的等问题,间接的给MySQL服务带来负面影响。所以实际运维场景中不建议使用这个参数。

参数配置:

[mysql]
socket                             = /opt/data/mysql.sock
no-auto-rehash
#或登录的时候指定 -A方式
shell # mysql -uroot -p****** -A
复制

看下实际效果:

shell #mysql -uroot -p****** --auto-rehash Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A mysql> SELECT * FROM t1; +----+--------------+------+------+-------+------+ | id | name | age | addr | addr1 | t0 | +----+--------------+------+------+-------+------+ | 1 | CCC | 10 | NULL | NULL | NULL | | 2 | BBB | 10 | NULL | NULL | NULL | 。。。 | 3 | AAA | 10 | NULL | NULL | NULL | +----+--------------+------+------+-------+------+ 10 rows in set (0.00 sec) mysql> SELECT t1.id -> t1. #这里可以按Tab键二次 t1.addr t1.addr1 t1.age t1.id t1.name t1.t0

复制

–binary-as-hex

此选项,mysql将使用十六进制表示法(0xvalue)显示二进制数据。无论整体输出显示格式是表格、垂直、HTML还是XML,都会出现这种情况。从MySQL 8.0.19开始,当MySQL以交互模式运行时,默认情况下启用此选项。

#默认方式 shell# mysql -uroot -p****** mysql> SELECT CHAR(0x41), UNHEX('41'); +------------------------+--------------------------+ | CHAR(0x41) | UNHEX('41') | +------------------------+--------------------------+ | 0x41 | 0x41 | +------------------------+--------------------------+ 1 row in set (0.00 sec) #禁用binary-as-hex shell# mysql -uroot -p****** --skip-binary-as-hex mysql]> SELECT CHAR(0x41), UNHEX('41'); +------------+-------------+ | CHAR(0x41) | UNHEX('41') | +------------+-------------+ | A | A | +------------+-------------+ 1 row in set (0.00 sec)

复制

从上面对比可以看出,这个参数决定着客户端输出界面,是否能正常显示内容。

–database=db_name, -D db_name

指定要使用的数据库。因为某些用户是只有对对应的数据库有访问权限的。

shell# mysql -uroot -p****** -A  -D db1
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
root@localhost: 10:58:  [db1]>    #直接指导对应的数据库

复制

–execute=statement, -e statement

执行语句并退出,可以是单个语句 或 多个语句。默认输出格式与–batch生成的格式类似。使用此选项,不会记录历史文件.mysql_history。

mysql# mysql -uroot -p****** -e "USE test; SHOW PROCESSLIST;" mysql: [Warning] Using a password on the command line interface can be insecure. +----+------+-----------+------+---------+------+-----------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+-----------+------+---------+------+-----------+------------------+ | 19 | root | localhost | NULL | Query | 0 | executing | show processlist | +----+------+-----------+------+---------+------+-----------+------------------+

复制

–batch

使用制表符作为列分隔符打印结果,每行都在新行上。使用此选项,不会记录历史文件.mysql_history。

mysql# mysql -uroot -p****** -e "USE test; SHOW PROCESSLIST;" --batch mysql: [Warning] Using a password on the command line interface can be insecure. Id User Host db Command Time State Info 21 root localhost test Query 0 executing show processlist

复制

–show-warnings

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

mysql# mysql -uroot -p****** -e "SELECT 1; SHOW PROCESSLISTS; SELECT 2; " mysql: [Warning] Using a password on the command line interface can be insecure. +---+ | 1 | +---+ | 1 | +---+ ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'processlists' at line 1

复制

备注:遇到错误就不会继续执行。前面的语句是执行成功的。客户端导入sql文件时,出错不想继续执行,就可以添加这个参数。

–html, -H / --xml, -X

生成HTML/XML并输出。可以直接生成html/XML代码。结合代码实现普遍的web方式展示。

shell# mysql -uroot -p123456 -H mysql> show databases; <TABLE BORDER=1><TR><TH>Database</TH></TR> <TR><TD>db1</TD></TR> <TR><TD>db2</TD></TR> <TR><TD>db3</TD></TR> <TR><TD>information_schema</TD></TR> <TR><TD>mysql</TD></TR> <TR><TD>performance_schema</TD></TR> <TR><TD>worldb</TD></TR> </TABLE>29 rows in set (0.00 sec)

复制

shell# mysql -uroot -p****** -X mysql> show databases; <?xml version="1.0"?> <resultset statement="show databases;" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <row> <field name="Database">db1</field> </row> <row> <field name="Database">db2</field> </row> <row> <field name="Database">db3</field> </row> <row> <field name="Database">information_schema</field> </row> <row> <field name="Database">mysql</field> </row> <row> <field name="Database">performance_schema</field> </row> <row> <field name="Database">sys</field> </row> <row> <field name="Database">worldb</field> </row> </resultset>

复制

–ignore-spaces, -i

允许在函数名和字符之间使用空格。这会导致内置函数名被视为保留字。跟sql-mode的IGNORE_SPACE同等效果。
比如:

shell# mysql -uroot -p****** -i mysql> show variables like '%sql_mode%'; +---------------+-----------------------------------------------------------+ | Variable_name | Value | +---------------+-----------------------------------------------------------+ | sql_mode | IGNORE_SPACE,STRICT_TRANS_TABLES,。。。 +---------------+-----------------------------------------------------------+ 1 row in set (0.01 sec) #count是关键字 需要使用间隔号 mysql> CREATE TABLE count (i INT); ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'count (i INT)' at line 1 mysql> CREATE TABLE `count`(i INT); Query OK, 0 rows affected (0.01 sec)

复制

–line-numbers

写入错误的行号。用mysql客户端导入一些sql文件的候还是非常有用的。

shell# mysql -uroot -p******  --line-numbers <  b.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1062 (23000) at line 6: Duplicate entry '1' for key 'ttt.PRIMARY'
#显示第6行导入数据,主键冲突


shell# vim b.sql
  1 use db1;
  2 insert into ttt(id) values(1);
  3 insert into ttt(id) values(2);
  4 insert into ttt(id) values(3);
  5 insert into ttt(id) values(4);
~~6 insert into ttt(id) values(1);
  7 insert into ttt(id) values(5);
  8 

shell#  sed -n "6p"  b.sql
insert into ttt(id) values(1);
复制

–select-limit --sql_safe_updates

SELECT语句返回的限制行数。这样有效的限制客户端返回行数过多,刷屏问题。

shell> mysql -uroot -p******  --select-limit=3 --safe-updates

mysql> select * from t1;
+----+------+------+------+-------+------+
| id | name | age  | addr | addr1 | t0   |
+----+------+------+------+-------+------+
|  1 | CCC  |   10 | NULL | NULL  | NULL |
|  2 | BBB  |   10 | NULL | NULL  | NULL |
+----+------+------+------+-------+------+

mysql> SHOW VARIABLES  WHERE Variable_name in('sql_safe_updates','sql_select_limit');
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| sql_safe_updates | ON    |
| sql_select_limit | 3     |
+------------------+-------+
2 rows in set (0.00 sec)
复制

–reconnect

MySQL客户端登录时,如果与服务器的连接丢失,自动尝试重新连接。每次连接丢失时都会进行一次重新连接尝试。要限制重新连接行为,使用–skip-reconnect

mysql> show processlist; ERROR 4031 (HY000): The client was disconnected by the server because of inactivity. See wait_timeout and interactive_timeout for configuring this behavior. No connection. Trying to reconnect... Connection id: 18 Current database: *** NONE *** +----+------+-----------+------+---------+------+-----------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+-----------+------+---------+------+-----------+------------------+ | 18 | root | localhost | NULL | Query | 0 | executing | show processlist | +----+------+-----------+------+---------+------+-----------+------------------+ 1 row in set (0.00 sec)

复制

备注:这里有可能执行的sql语句失效 或则 重新执行。有一定的隐患。 比如:执行的语句因为断开链接再次执行。

–tee

将输出副本附加到给定文件。此选项仅在交互模式下有效

shell# mysql -uroot -p******  --tee /tmp/mysql.log
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| db1                |
| information_schema |
。。。
| performance_schema |
| mysql              |
| worldb             |
+--------------------+
29 rows in set (0.01 sec)
复制

tee输出日志信息:

shell# cat /tmp/mysql.log
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 22
Server version: 8.0.32 MySQL Community Server - GPL

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

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.

root@localhost: 12:17:  [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| db1                |
| information_schema |
。。。
| performance_schema |
| mysql              |
| worldb             |
+--------------------+
29 rows in set (0.00 sec)

复制

–syslog, -j

该选项使mysql向系统日志记录语句。在Unix上,这是syslog;在Windows上,它是Windows事件日志。记录的消息显示的目标取决于系统。在Linux上,通常是/var/log/messages文件。

shell# mysql -uroot -p****** --syslog mysql> show databases; +--------------------+ | Database | +--------------------+ | db1 | | information_schema | 。。。 | performance_schema | | mysql | | worldb | +--------------------+ 29 rows in set (0.01 sec)

复制

系统日志记录信息:

shell# tail -f  /var/log/messages 
Mar 15 12:11:40 schouse MysqlClient[186056]: SYSTEM_USER:'kevindba', MYSQL_USER:'root', CONNECTION_ID:20, DB_SERVER:'--', DB:'--', QUERY:'exit'
Mar 15 12:11:52 schouse MysqlClient[186059]: SYSTEM_USER:'kevindba', MYSQL_USER:'root', CONNECTION_ID:21, DB_SERVER:'--', DB:'--', QUERY:'show databases;'

复制

–pager[=command]

使用给定的命令对查询输出分页。如less、more、cat [> filename]等等。此选项仅适用于Unix,且仅适用于交互模式。

shell# mysql -uroot -p******   --pager=less
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| db1                |
| information_schema |
。。。
| performance_schema |
| mysql              |
| worldb             |
+--------------------+
(END)

复制

–init-command=str

连接到服务器后要执行的SQL语句。如下面简单的用户登录记录。

shell]# mysql -uroot -p****** --init-command="insert into db1.login_tbl(login) values(user())" mysql> select * from db1.login_tbl; +----+----------------+---------------------+ | id | login | create_time | +----+----------------+---------------------+ | 1 | root@localhost | 2023-03-21 10:50:42 | +----+----------------+---------------------+ 1 row in set (0.00 sec)

复制

–quick, -q
迫使mysql每次从服务器检索一行结果,而不是检索整个结果集,并在显示之前将其缓冲到内存中。这是通过使用客户端/服务器库中的mysql_use_result() C API函数而不是mysql_store_result()返回结果集来完成的。如果遇到由于内存不足而无法运行大型结果集的问题,非常有效。

–no-defaults

不读取任何选项文件。主要是防止/etc/my.cnf文件下[mysql][client]配置信息,导致链接错误或则 一些限制。比如:sock配置,max_allowed_packet,buffer,用户等

–login-path

免密码登录方式,通过mysql_config_editor信息,从.mylogin.cnf读取登录路径选项。

–load-data-local-dir --local-infile

LOAD DATA相关命令,一个是读取LOCAL语句中命名的文件的目录,-infile启用或禁用功能

–password1、–password2和–password3

用于指定多个密码password1、password2和password3。对于使用C API的应用程序,mysql_options4() C API函数的新MYSQL_OPT_USER_PASSWORD选项启用了相同的功能。
这部分功能在MySQL8.0.27企业版现在支持使用智能卡、安全密钥和生物识别阅读器等设备对MySQL服务器进行身份验证。该认证方法基于FIDO (Fast Identity Online)标准有关。

参考:

https://dev.mysql.com/doc/refman/8.0/en/mysql-command-options.html

墨力计划mysql

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论