17_MySQL自带工具

MySQL数据库不仅提供了数据库的服务器端应用程序,同时还提供了大量的客户端工具程序,如mysql,mysqladmin,mysqldump等等

一、mysql命令

Mysql命令是用的最多的一个命令工具了,为用户提供一个命令行接口来操作管理MySQL 服务器。 语法格式:

Usage: mysql [OPTIONS] [database] 

//获取mysql工具帮助

# mysql --help

1. mysql -e参数

这个参数是告诉

mysql,我要执行“-e”后面的某个命令,而不是要通过mysql连接登录到MySQL Server 上面。此参数在我们写一些基本的MySQL 检查和监控的脚本中非常有用,运维mysql时经常在脚本中使用到它。

语法格式:

#mysql  -hhostname -Pport -uusername -ppassword  -e  相关mysql的sql语句

列子1:查看所有数据库

[root@mysqld01 ~]# mysql -uroot -p -e "show databases"
Enter password: 
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| mytest             |
| performance_schema |
| sys                |
+--------------------+

例子2:通过脚本对数据库进行增删改查操作

[root@mysqld01 ~]# cat mysql.sh 
#!/bin/bash
HOSTNAME="localhost"
PORT="3306"
USERNAME="root"
PASSWORD="123.com"

DBNAME="test1"
TABLENAME="t1"

#创建库
create_db="create database if not exists ${DBNAME}"
mysql -h ${HOSTNAME} -P ${PORT} -u ${USERNAME} -p${PASSWORD} -e "${create_db}" 2>/dev/null
echo "create databases"

#创建表

create_table="create table if not exists  ${TABLENAME} (id int,name char(22))"
mysql -h ${HOSTNAME} -P ${PORT} -u ${USERNAME} -p${PASSWORD} ${DBNAME} -e "${create_table}" 2>/dev/null
echo "create table"

#检查表是否存在
desc_table="desc ${TABLENAME}"
mysql -h ${HOSTNAME} -P ${PORT} -u ${USERNAME} -p${PASSWORD} ${DBNAME} -e "${desc_table}" 2>/dev/null

#插入数据
insert_table="insert into ${TABLENAME} values (1,'zhangsan'),(2,'lisi')"
mysql -h ${HOSTNAME} -P ${PORT} -u ${USERNAME} -p${PASSWORD} ${DBNAME} -e "${insert_table}"  2>/dev/null

#查看数据
select_tble="select * from ${TABLENAME}"
mysql -h ${HOSTNAME} -P ${PORT} -u ${USERNAME} -p${PASSWORD} ${DBNAME} -e "${select_tble}" 2>/dev/null

#update 数据

update="update ${TABLENAME} set name='qin' where id = 1 "
mysql -h ${HOSTNAME} -P ${PORT} -u ${USERNAME} -p${PASSWORD} ${DBNAME} -e "${update}" 2>/dev/null

#查看数据
select_tble="select * from ${TABLENAME}"
mysql -h ${HOSTNAME} -P ${PORT} -u ${USERNAME} -p${PASSWORD} ${DBNAME} -e "${select_tble}" 2>/dev/null

#删除数据
delete="delete from ${TABLENAME}"
mysql -h ${HOSTNAME} -P ${PORT} -u ${USERNAME} -p${PASSWORD} ${DBNAME} -e "${delete}" 2>/dev/null

2. mysql -E 参数

如果在连接时候使用了“-E, --vertical”参数,登入之后的所有查询结果都将以纵列显示,效果和我们在一条query 之后以“\G”结尾一样。

例子:

[root@mysqld01 ~]# mysql -uroot -p123.com -E -e "select * from mysql.user"
mysql: [Warning] Using a password on the command line interface can be insecure.
*************************** 1. row ***************************
                  Host: localhost
                  User: root
           Select_priv: Y
           Insert_priv: Y
           Update_priv: Y
           Delete_priv: Y
           Create_priv: Y
             Drop_priv: Y
           Reload_priv: Y
         Shutdown_priv: Y
          Process_priv: Y
........省略

3.mysql -H “–htm"与 -X " --xml” 参数

在启用这两个参数之后,select出来的所有结果都会按照“Html”与“Xml”格式来输出,在有些场合之下,比如希望Xml或者Html 文件格式导出某些报表文件的时候,是非常方便的。

例子1:将mysql.user表输出为html格式

~]# mysql -uroot -p123.com -H -e "select * from mysql.user" > user.html
[root@mysqld01 ~]# cat user.html 
<TABLE BORDER=1><TR><TH>Host</TH><TH>User</TH><TH>Select_priv</TH><TH>Insert_priv</TH><TH>Update_priv</TH><TH>Delete_priv</TH><TH>Create_priv</TH><TH>Drop_priv</TH><TH>Reload_priv</TH><TH>Shutdown_priv</TH>
........省略

例子2:将mysql.user表输出为xml格式

[root@mysqld01 ~]# mysql -uroot -p123.com -X -e "select * from mysql.user" > user.xml
[root@mysqld01 ~]# cat user.xml 
<?xml version="1.0"?>

<resultset statement="select * from mysql.user
" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <row>
	<field name="Host">localhost</field>
.....省略

4. --prompt=name参数(重要)

“–prompt=name”参数对于做运维的人来说是一个非常重要的参数选项,其主要功能是定制自己的mysql提示符的显示内容。在默认情况下,我们通过mysql登入到数据库之后,mysql的提示符只是一个很简单的内容”mysql>“,没有其他任何附加信息。非常幸运的是mysql通过“–prompt=name”参数给我们提供了自定义提示信息的办法,可以通过配置显示登入的主机地址,登录用户名,当前时间,当前数据库schema,MySQLServer 的一些信息等等。

推荐提示符定义:

"\\u@\\h : \\d \\r:\\m:\\s> "

提示符解释: \u 表示用户名, \h 表示主机名, \d 表示当前数据库,\r小时(12小时制),\m分种,\s秒,\R The current time, in 24-hour military time (0–23)

例子1:

[root@mysqld01 ~]# mysql -uroot -p123.com --prompt="\\u@\\h:\\d \\r:\\m:\\s >"

显示后效果

root@localhost:(none) 07:00:20 >use mytest;
Database changed
root@localhost:mytest 07:01:14 >

例子2:

将–prompt参数写到/etc/my.cnf配置文件里面永久生效,解决了每次进入mysql都要打一遍–prompt参数。

[root@mysqld01 ~]# cat /etc/my.cnf 
[mysqld]
......省略
[client]
prompt="\\u@\\h:\\d \\r:\\m:\\s >"

[root@mysqld01 ~]# systemctl restart mysqld

5. --tee=name参数

“–tee=name”参数也是对运维人员非常有用的参数选项,用来告诉mysql,将所有输入和输出内容都记录进文件。在我们一些较大维护变更的时候,为了方便被查,最好是将整个操作过程的所有输入和输出内容都保存下来。 假如mysql命令行状态下,要进行大量的交互操作,其实可以把这些操作记录在log中进行审计,很简单mysql -u root -p --tee=/path/xxxx.log

例子1:

[root@mysqld01 ~]# mysql -uroot -p123.com --tee=mysql.log
mysql: [Warning] Using a password on the command line interface can be insecure.
Logging to file 'mysql.log'
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.32 Source distribution

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.

root@localhost:(none) 07:12:11 >show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| TEST               |
| mysql              |
| mytest             |
| performance_schema |
| sys                |
| test1              |
+--------------------+
7 rows in set (0.00 sec)

root@localhost:(none) 07:12:16 >exit
Bye

//此时当然当前目录会生成mysql.log文件,里面的内容就是刚刚在数据库里面操作的内容

注: --tee参数是追加文件的 !

[root@mysqld01 ~]# cat mysql.log 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.32 Source distribution

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.

root@localhost:(none) 07:12:11 >show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| TEST               |
| mysql              |
| mytest             |
| performance_schema |
| sys                |
| test1              |
+--------------------+
7 rows in set (0.00 sec)

root@localhost:(none) 07:12:16 >exit

二、mysqladmin 命令

顾名思义,提供的功能都是与MySQL 管理相关的各种功能。如MySQL Server状态检查,各种统计信息的flush,创建/删除数据库,关闭MySQL Server 等等。mysqladmin所能做的事情,虽然大部分都可以通过mysql连接登录上MySQL Server 之后来完成,但是大部分通过mysqladmin来完成操作会更简单更方便。这里将介绍一下经常使用到的几个常用功能。

注:使用mysqladmin命令不能和prompt一起使用。

1. ping参数

ping 命令可以很容易检测MySQL Server 是否还能正常提供服务 mysql本机上测试:

[root@mysqld01 ~]# mysqladmin -uroot -p123.com ping
mysqld is alive

2. status参数

status 命令可以获取当前MySQL Server 的几个基本的状态值

[root@mysqld01 ~]# mysqladmin -uroot -p status
Enter password: 
Uptime: 335  Threads: 1  Questions: 11  Slow queries: 0  Opens: 108  Flush tables: 1  Open tables: 101  Queries per second avg: 0.032

Uptime:是mysql服务器运行的秒数。

Threads:活跃线程的数量即开启的会话数。

Questions: 服务器启动以来客户的问题(查询)数目 (只要跟mysql作交互,不管查询表,还是查询服务器状态都记一次)

Slow queries:是慢查询的数量。

Opens:mysql已经打开的数据库表的数量

Flush tables: mysql已经执行的flush tables,refresh和reload命令的数量。 注:flush tables //刷新表(清除缓存)reload 重载授权表 refresh 洗掉所有表并关闭和打开日志文件

open:打开数据库的表的数量,以服务器启动开始。

Queries per second avg:select语句平均查询时间 Memory in use分配的内存(只有在MySQL用–withdebug编译时可用) Max memory used分配的最大内存(只有在MySQL用–with-debug编译时可用)

3. processlist参数

processlist参数获取当前数据库的连接线程信息

[root@mysqld01 ~]# mysqladmin -uroot -p processlist
Enter password: 
+----+------+-----------+----+---------+------+----------+------------------+
| Id | User | Host      | db | Command | Time | State    | Info             |
+----+------+-----------+----+---------+------+----------+------------------+
| 9  | root | localhost |    | Query   | 0    | starting | show processlist |
+----+------+-----------+----+---------+------+----------+------------------+

4. kill参数

processlist参数查到的id可以使用kill命令杀掉

[root@mysqld01 ~]# mysqladmin -uroot -p processlist
Enter password: 
+----+------+-----------+----+---------+------+----------+------------------+
| Id | User | Host      | db | Command | Time | State    | Info             |
+----+------+-----------+----+---------+------+----------+------------------+
| 11 | root | localhost |    | Sleep   | 7    |          |                  |
| 12 | root | localhost |    | Query   | 0    | starting | show processlist |
+----+------+-----------+----+---------+------+----------+------------------+
[root@mysqld01 ~]# mysqladmin -uroot -p kill 11
Enter password: 
[root@mysqld01 ~]# mysqladmin -uroot -p processlist
Enter password: 
+----+------+-----------+----+---------+------+----------+------------------+
| Id | User | Host      | db | Command | Time | State    | Info             |
+----+------+-----------+----+---------+------+----------+------------------+
| 14 | root | localhost |    | Query   | 0    | starting | show processlist |
+----+------+-----------+----+---------+------+----------+------------------+

利用上面的这些参数可以编写一些简单的脚本


#获取mysql当前状态值
mysqladmin -uroot -p123.com -h localhost status

#获取数据库当前连接信息
mysqladmin -uroot -p123.com -h localhost processlist

#获取数据库当前的连接数
mysql -uroot -p123.com -BNe "select host,count(host) from processlist group by host" information_schema

#显示mysql的启动时长
mysql -uroot -p123.com -e "SHOW STATUS LIKE '%uptime%'" | awk '/ptime/{ calc = $NF/3600;print $(NF-1), calc"Hour"}'

#查看数据库所有库大小
mysql -uroot -p123.com -e 'select table_schema,round(sum(data_length+index_length)/1024/1024,4) from information_schema.tables group by table_schema '

三、mysqldump和mysqlbinlog

  1. mysqldump: 这个工具其功能就是将MySQL Server中的数据以SQL 语句的形式从数据库中dump 成文本文件。mysqldump是做为MySQL 的一种逻辑备份工具

  2. mysqlbinlog: mysqlbinlog程序的主要功能就是分析MySQL Server 所产生的二进制日志(也就是binlog)。通过mysqlbinlog,我们可以解析出binlog中指定时间段或者指定日志起始和结束位置的内容解析成SQL 语句。

四、mysqlslap性能测试

​ Mysqlslap性能测试MySQL二种存储引擎 mysqlslap是mysql自带的基准测试工具,优点:查询数据,语法简单,灵活容易使用,该工具可以模拟多个客户端同时并发的向服务器发出查询更新,给出了性能测试数据而且提供了多种引擎的性能比较。

​ mysqlslap为mysql性能优化前后提供了直观的验证依据,建议系统运维和DBA人员应该掌握一些常见的压力测试工具,才能准确的掌握线上数据库支撑的用户流量上限及其抗压性等问题。 现在看一下这个压力测试工具mysqlslap,关于他的选项手册上以及–help介绍的很详细。 这里解释一下一些常用的选项。

–concurrency代表并发数量,多个可以用逗号隔开。例如:concurrency=50,100,200 --engines代表要测试的引擎,可以有多个,用分隔符隔开。

–iterations代表要运行这些测试多少次,即运行多少次后,得到结果。

–auto-generate-sql 代表用系统自己生成的SQL脚本来测试。

–auto-generate-sql-load-type 代表要测试的是读还是写还是两者混合的(read,write,update,mixed)

–number-of-queries 代表总共要运行多少次查询。每个客户运行的查询数量可以用查询总数/并发数来计算。比如倒数第二个结果2=200/100。

–debug-info 代表要额外输出CPU以及内存的相关信息(注:只有在MySQL用–with-debug编译时可)。

–number-int-cols 代表测试表中的INTEGER类型的属性有几个。

–number-char-cols代表测试表的char类型字段的数量。

–create-schema 代表自己定义的模式(在MySQL中也就是库即创建测试的数据库)。

–query 代表自己的SQL脚本。

–only-print如果只想打印看看SQL语句是什么,可以用这个选项。

–csv=name 生产CSV格式数据文件

注:不同版本默认最大连接数不差别。一般生产环境是不够的,在my.cnf[mysqld]下添加 max_connections=1024 增加到1024,重启Mysql。 修改my.cnf文件并重启mysqld服务查看修改后的最大连接数

查看Mysql默认使用存储引擎,如下查看: mysql> show engines;

例子1:

[root@mysqld01 ~]# mysqlslap --defaults-file=/etc/my.cnf --concurrency=100,200 \
--iterations=1 --number-int-cols=20 --number-char-cols=30 \
-auto-generate-sql --auto-generate-sql-add-autoincrement \
--auto-generate-sql-load-type=mixed --engine=myisam,innodb \
--number-of-queries=2000 -uroot -p123.com --verbose 

显示结果:

Benchmark
	Running for engine myisam
	Average number of seconds to run all queries: 0.299 seconds
	Minimum number of seconds to run all queries: 0.299 seconds
	Maximum number of seconds to run all queries: 0.299 seconds
	Number of clients running queries: 100
	Average number of queries per client: 20

Benchmark
	Running for engine myisam
	Average number of seconds to run all queries: 0.361 seconds
	Minimum number of seconds to run all queries: 0.361 seconds
	Maximum number of seconds to run all queries: 0.361 seconds
	Number of clients running queries: 200
	Average number of queries per client: 10

Benchmark
	Running for engine innodb
	Average number of seconds to run all queries: 0.477 seconds
	Minimum number of seconds to run all queries: 0.477 seconds
	Maximum number of seconds to run all queries: 0.477 seconds
	Number of clients running queries: 100
	Average number of queries per client: 20

Benchmark
	Running for engine innodb
	Average number of seconds to run all queries: 0.476 seconds
	Minimum number of seconds to run all queries: 0.476 seconds
	Maximum number of seconds to run all queries: 0.476 seconds
	Number of clients running queries: 200
	Average number of queries per client: 10

测试说明:模拟测试两次读写并发,第一次100,第二次200,自动生成SQL脚本,测试表包含20个init字段,30个char字段,每次执行2000查询请求。测试引擎分别是myisam,innodb。

测试结果说明: Myisam引擎第一次100客户端同时发起增查用0.299/s,第二次200客户端同时发起增查用0.361/s

Innodb引擎第一次100客户端同时发起增查用0.477,第二次200客户端同时发起增查用0.476/s 由此可见MyISAM存储引擎处理性能是最好的,也是最常用的,但不支持事务。InonDB存储引擎提供了事务型数据引擎(ACID),在事务型引擎里使用最多的。具有事务回滚,系统修复等特点。

例子2:

Mysqlslap测试工具生产CSV格式数据文件并转换成图表形式

[root@mysqld01 ~]# mysqlslap --defaults-file=/etc/my.cnf --concurrency=100,200 \
--iterations=1 --number-int-cols=20 --number-char-cols=30 -auto-generate-sql \
--auto-generate-sql-add-autoincrement --auto-generate-sql-load-type=mixed \
--engine=myisam,innodb  --number-of-queries=2000 -uroot -p123.com --verbose \
--csv=/root/a.csv

将a.csv拷贝到windows主机上,打开并生成图表

例子3:

使用自己定义的SQL 脚本或语句来测试 ,这里我们编写一个生成表的脚本去完成 脚本内容如下:

[root@mysqld01 sh]# cat mysql.sh 
#!/bin/bash
HOSTNAME="localhost"
PORT="3306"
USERNAME="root"
PASSWORD="123.com"
DBNAME="test1"
TABLENAME="tb1"
#create database
mysql -h ${HOSTNAME} -P ${PORT} -u ${USERNAME} -p${PASSWORD} -e "drop database if exists ${DBNAME}"
create_db_sql="create database if not exists ${DBNAME}"
mysql -h ${HOSTNAME} -P ${PORT} -u ${USERNAME} -p${PASSWORD} -e "${create_db_sql}"
#create table
create_table_sql="create table if not exists ${TABLENAME}(stuid int not null primary key,stuname varchar(20) not null,stusex char(1) not null,cardid varchar(20) not null,birthday datetime,entertime datetime,address varchar(100) default null)"
mysql -h ${HOSTNAME} -P ${PORT} -u ${USERNAME} -p${PASSWORD} ${DBNAME} -e "${create_table_sql}"
#insert data to table
i=1
while [ $i -le 20000 ]
do 
insert_sql="insert into ${TABLENAME} values ($i,'zhangsan','1','1234567890123456','1999-10-10','2016-9-3','zhongguo beijingshichangpinqu')"
mysql -h ${HOSTNAME} -P ${PORT} -u ${USERNAME} -p${PASSWORD} ${DBNAME} -e "${insert_sql}"
let i++
done
#select data
select_sql="select count(*) from ${TABLENAME}"
mysql -h ${HOSTNAME} -P ${PORT} -u ${USERNAME} -p${PASSWORD} ${DBNAME} -e "${select_sql}"
[root@mysqld01 sh]# sh mysql.sh

//执行mysqlslap工具进行测试

[root@mysqld01 sh]# mysqlslap --defaults-file=/etc/my.cnf --concurrency=10,20 \
--iterations=1 --create-schema='test1' \
--query='select * from test1.tb1' --engine=myisam,innodb --number-of-queries=2000 \
-uroot -p123.com –verbose

//测试结果为:

Benchmark
	Running for engine myisam
	Average number of seconds to run all queries: 37.563 seconds
	Minimum number of seconds to run all queries: 37.563 seconds
	Maximum number of seconds to run all queries: 37.563 seconds
	Number of clients running queries: 10
	Average number of queries per client: 200

Benchmark
	Running for engine myisam
	Average number of seconds to run all queries: 36.475 seconds
	Minimum number of seconds to run all queries: 36.475 seconds
	Maximum number of seconds to run all queries: 36.475 seconds
	Number of clients running queries: 20
	Average number of queries per client: 100

Benchmark
	Running for engine innodb
	Average number of seconds to run all queries: 37.788 seconds
	Minimum number of seconds to run all queries: 37.788 seconds
	Maximum number of seconds to run all queries: 37.788 seconds
	Number of clients running queries: 10
	Average number of queries per client: 200

Benchmark
	Running for engine innodb
	Average number of seconds to run all queries: 35.693 seconds
	Minimum number of seconds to run all queries: 35.693 seconds
	Maximum number of seconds to run all queries: 35.693 seconds
	Number of clients running queries: 20
	Average number of queries per client: 100

注:通过mysqlslap工具对mysql server进行压力测试,可以通过–concurrency、–number-of-queries等选项的值查看每次测试的结果,通过反复测试、优化得出mysql server的最大并发数。 如果mysqlslap工具输出结果为Segmentation fault (core dumped)基本表示走超出mysql server的负载。

猜你喜欢

转载自blog.csdn.net/weixin_45310323/article/details/112517146