当前位置 : 首页 » 文章分类 :  开发  »  MySQL-INFORMATION_SCHEMA

MySQL-INFORMATION_SCHEMA

INFORMATION_SCHEMA 信息库

Chapter 24 INFORMATION_SCHEMA Tables
https://dev.mysql.com/doc/refman/5.7/en/information-schema.html

在 MySQL 5.0 以后的版本中, INFORMATION_SCHEMA 中的表存储了系统相关信息。

information_schema库保存了MySQL服务器所有数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。再简单点,这台MySQL服务器上,到底有哪些数据库、各个数据库有哪些表,每张表的字段类型是什么,各个数据库要什么权限才能访问,等等信息都保存在information_schema表里面。

SCHEMATA表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。

TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。


processlist

24.3.18 The INFORMATION_SCHEMA PROCESSLIST Table
https://dev.mysql.com/doc/refman/5.7/en/information-schema-processlist-table.html

show processlist 显示的信息就来自 information_schema.processlist 表,线程 id 就是表的主键。

processlist表字段含义

id: 就是这个线程的唯一标识,当我们发现这个线程有问题的时候,可以通过 kill 命令,加上这个Id值将这个线程杀掉。
user: 就是指启动这个线程的用户。
host: 记录了发送请求的客户端的 IP 和 端口号。通过这些信息在排查问题的时候,我们可以定位到是哪个客户端的哪个进程发送的请求。
db: 当前执行的命令是在哪一个数据库上。如果没有指定数据库,则该值为 NULL 。
command: 是指此刻该线程正在执行的命令。这个很复杂,下面单独解释
time: (单位秒)表示该线程处于当前状态的时间。
state: 线程的状态,和 Command 对应,下面单独解释。
info: 一般记录的是线程执行的语句。默认只显示前100个字符,也就是你看到的语句可能是截断了的,要看全部信息,需要使用 show full processlist。

processlist表command字段取值

Binlog Dump: 主节点正在将二进制日志 ,同步到从节点
Change User: 正在执行一个 change-user 的操作
Close Stmt: 正在关闭一个Prepared Statement 对象
Connect: 一个从节点连上了主节点
Connect Out: 一个从节点正在连主节点
Create DB: 正在执行一个create-database 的操作
Daemon: 服务器内部线程,而不是来自客户端的链接
Debug: 线程正在生成调试信息
Delayed Insert: 该线程是一个延迟插入的处理程序
Drop DB: 正在执行一个 drop-database 的操作
Execute: 正在执行一个 Prepared Statement
Fetch: 正在从Prepared Statement 中获取执行结果
Field List: 正在获取表的列信息
Init DB: 该线程正在选取一个默认的数据库
Kill : 正在执行 kill 语句,杀死指定线程
Long Data: 正在从Prepared Statement 中检索 long data
Ping: 正在处理 server-ping 的请求
Prepare: 该线程正在准备一个 Prepared Statement
ProcessList: 该线程正在生成服务器线程相关信息
Query: 该线程正在执行一个语句
Quit: 该线程正在退出
Refresh:该线程正在刷表,日志或缓存;或者在重置状态变量,或者在复制服务器信息
Register Slave: 正在注册从节点
Reset Stmt: 正在重置 prepared statement
Set Option: 正在设置或重置客户端的 statement-execution 选项
Shutdown: 正在关闭服务器
Sleep: 正在等待客户端向它发送执行语句
Statistics: 该线程正在生成 server-status 信息
Table Dump: 正在发送表的内容到从服务器
Time: Unused

我们经常看到好多处于 sleep 状态的线程,是因为这是后台服务连接池建立的链接在等待服务给他发送sql来执行。如果按ip group分组,每个ip的count个数就是每个后台服务器的连接池大小。

mysql: show processlist 详解
https://zhuanlan.zhihu.com/p/30743094

查看各ip连接数

从 information_schema 库的 processlist 表中查

select SUBSTRING_INDEX(host,':',1) as ip , count(*)
from information_schema.processlist
group by ip;

通过直接执行mysql命令也可以实现:

mysql -u root -h127.0.0.1 -e"show processlist\G;"| egrep "Host\:" | awk -F: '{ print $2 }'| sort | uniq -c
mysql -u root -h127.0.0.1 --skip-column-names -e"show processlist;"|awk '{print $3}'|awk -F":" '{print $1}'|sort|uniq –c

show processlist 查正在执行的连接(线程)

show processlist;
如果是root帐号,你能看到所有用户的当前连接。如果是其它普通帐号,只能看到自己占用的连接。
show processlist;只列出前100条,如果想全列出请使用 show full processlist;

show processlist 显示的信息都是来自MySQL系统库 information_schema 中的 processlist 表。所以使用下面的查询语句可以获得相同的结果:
select * from information_schema.processlist;


columns

根据表名查有哪些列,及各列的数据类型,以及列是否有索引等。

select *
from information_schema.columns
where table_name='service_conf'

从columns表查询字段名、类型、说明、索引

SELECT COLUMN_NAME                      字段名,
       DATA_TYPE                        类型,
       COLUMN_COMMENT                   说明,
       case column_key
           when 'PRI' then '主键索引'
           when 'UNI' then '唯一索引'
           when 'MUL' then '索引'
       end '是否索引'
FROM INFORMATION_SCHEMA.COLUMNS
where table_schema = 'db_name'
  and table_name = 'table_name';

从columns表中查表有哪些索引列

select column_name, column_type, column_key
from information_schema.columns
where table_schema='数据库名'
and TABLE_NAME='表名';

tables

4.25 The INFORMATION_SCHEMA TABLES Table
https://dev.mysql.com/doc/mysql-infoschema-excerpt/5.7/en/information-schema-tables-table.html

table_schema 表所属的数据库名
table_name 表名
table_rows 记录行数
data_length 数据总大小,以字节为单位,除1024为K,除1048576为M
index_length 索引总大小,以字节为单位,除1024为K,除1048576为M

table_rows 行数

表的行数。
对于 MyISAM 存储引擎,由于 MyISAM 存储了每个表的精确 count 值,所以这个值也是准确的。
对于 InnoDB 存储引擎,这个值是近似的,和真实值可能相差 40% 到 50%

create_time 表创建时间

information_schema.tables.create_time 表创建时间
在MySQL 5.0以后的版本中,也可以查询 INFORMATION_SCHEMA 库中的 TABLES 表中的 CREATE_TIME 字段来看表的创建时间,
即information_schema.tables.create_time

或者,可以使用SHOW TABLE STATUS命令显示表的相关信息。
例如,对于mysql数据库中的user表:
SHOW TABLE STATUS LIKE 'user'

注意:在innoDB引擎中,information_schema.tables.create_time 是表结构最后一次被 ALTER TABLE 语句更新的时间,比如用 ALTER TABLE 改变一个列的默认值时此字段会被更新。
但MyISAM引擎又不同,ALTER TABLE时不会更新此字段。
如果想看表的精确创建时间,应该看数据库文件系统中表的 .frm 文件的创建时间。但Linux系统中文件是不保存创建时间的,所以也没法看到。

When was my table last ALTERed?
https://stackoverflow.com/questions/9537248/when-was-my-table-last-altered

data_length 表大小

information_schema.tables.data_length 表大小,以字节为单位,除1024为K,除1048576为M

查看各个数据库占空间大小

select
       TABLE_SCHEMA '数据库名',
       sum(data_length)/1024/1024 '数据大小MB',
       sum(index_length)/1024/1024 '索引大小MB',
       sum(data_length)/1024/1024 + sum(index_length)/1024/1024 '总大小MB',
       sum(TABLE_ROWS) '行数'
from information_schema.tables
group by TABLE_SCHEMA
ORDER BY `总大小MB` desc;

看数据库各个表占空间大小

看数据库各个表占空间大小,倒序排列,单位MB

select 
    table_name as '表名', 
    table_rows as '行数', 
    data_length/1024/1024 as '数据大小MB', 
    index_length/1024/1024 as '索引大小MB', 
    (data_length+index_length)/1024/1024 as '总大小MB'
from information_schema.tables
where table_schema='user'
order by `总大小MB` desc;

结果
+——————-+————+————-+————–+—————-+
| 表名 | 行数 | 数据大小MB | 索引大小MB | 总大小MB |
+——————-+————+————-+————–+—————-+
| t_pic_record_53 | 16789760 | 28617736192 | 3438280704 | 30571.00000000 |
| t_user_record_94 | 160953 | 50921472 | 29556736 | 76.75000000 |
| t_user_record_2 | 160225 | 50921472 | 29556736 | 76.75000000 |
| t_user_record_56 | 160505 | 49872896 | 29556736 | 75.75000000 |
| t_user_record_84 | 160393 | 49872896 | 29556736 | 75.75000000 |
| t_user_record_69 | 159945 | 49872896 | 29556736 | 75.75000000 |

index_length 索引大小

information_schema.tables.index_length 索引大小,以字节为单位,除1024为K,除1048576为M


innodb_trx 事务

MySQL 5.5 中,information_schema 库中新增了三个关于锁的表,亦即 innodb_trx、innodb_locks 和 innodb_lock_waits。
其中 innodb_trx 表记录当前运行的所有事务,innodb_locks 表记录当前出现的锁,innodb_lock_waits 表记录锁等待的对应关系。

innodb_trx 表各字段含义

trx_id:事务ID。
trx_state:事务状态,有以下几种状态:RUNNING、LOCK WAIT、ROLLING BACK 和 COMMITTING。
trx_started:事务开始时间。
trx_requested_lock_id 事务当前正在等待锁的标识,可以和 INNODB_LOCKS 表 JOIN 以得到更多详细信息。
trx_wait_started:事务开始等待的时间。
trx_weight:事务的权重,反映(但不一定是确切的计数)更改的行数和事务锁定的行数。要解决死锁,请 InnoDB 选择权重最小的事务作为回滚的“ 受害者 ”。无论更改和锁定行的数量如何,已更改非事务表的事务都被认为比其他事务更重。
trx_mysql_thread_id:事务线程 ID,可以和 PROCESSLIST 表的id字段 JOIN。
trx_query:事务正在执行的 SQL 语句。
trx_operation_state:事务当前操作状态。
trx_tables_in_use:当前事务执行的 SQL 中使用的表的个数。
trx_tables_locked:当前执行 SQL 的行锁数量。
trx_lock_structs:事务保留的锁数量。
trx_lock_memory_bytes:事务锁住的内存大小,单位为 BYTES。
trx_rows_locked:事务锁住的记录数。包含标记为 DELETED,并且已经保存到磁盘但对事务不可见的行。
trx_rows_modified:事务更改的行数。
trx_concurrency_tickets:事务并发票数。
trx_isolation_level:当前事务的隔离级别。
trx_unique_checks:是否打开唯一性检查的标识。
trx_foreign_key_checks:是否打开外键检查的标识。
trx_last_foreign_key_error:最后一次的外键错误信息。
trx_adaptive_hash_latched:自适应散列索引是否被当前事务锁住的标识。
trx_adaptive_hash_timeout:是否立刻放弃为自适应散列索引搜索 LATCH 的标识。

MySQL 5.5 InnoDB 锁等待
https://dbarobin.com/2015/01/27/innodb-lock-wait-under-mysql-5.5/


innodb_locks 锁

INNODB_LOCKS:提供有关InnoDB 事务已请求但尚未获取的每个锁的信息,以及事务持有的阻止另一个事务的每个锁。

LOCK_ID 一个唯一的锁ID号,内部为 InnoDB。
LOCK_TRX_ID 持有锁的事务的ID
LOCK_MODE 如何请求锁定。允许锁定模式描述符 S,X, IS,IX, GAP,AUTO_INC,和 UNKNOWN。锁定模式描述符可以组合使用以识别特定的锁定模式。
LOCK_TYPE 锁的类型
LOCK_TABLE 已锁定或包含锁定记录的表的名称
LOCK_INDEX 索引的名称,如果LOCK_TYPE是 RECORD; 否则 NULL
LOCK_SPACE 锁定记录的表空间ID,如果 LOCK_TYPE是RECORD; 否则NULL
LOCK_PAGE 锁定记录的页码,如果 LOCK_TYPE是RECORD; 否则NULL。
LOCK_REC 页面内锁定记录的堆号,如果 LOCK_TYPE是RECORD; 否则NULL。
LOCK_DATA 与锁相关的数据(如果有)。如果 LOCK_TYPE是RECORD,是锁定的记录的主键值,否则NULL。此列包含锁定行中主键列的值,格式为有效的SQL字符串。如果没有主键,LOCK_DATA则是唯一的InnoDB内部行ID号。如果对键值或范围高于索引中的最大值的间隙锁定,则LOCK_DATA 报告supremum pseudo-record。当包含锁定记录的页面不在缓冲池中时(如果在保持锁定时将其分页到磁盘),InnoDB不从磁盘获取页面,以避免不必要的磁盘操作。相反, LOCK_DATA设置为 NULL。


innodb_lock_waits

INNODB_LOCK_WAITS:包含每个被阻止InnoDB 事务的一个或多个行,指示它已请求的锁以及阻止该请求的任何锁。

列名 描述
REQUESTING_TRX_ID 请求(阻止)事务的ID。
REQUESTED_LOCK_ID 事务正在等待的锁的ID。
BLOCKING_TRX_ID 阻止事务的ID。
BLOCKING_LOCK_ID 由阻止另一个事务继续进行的事务所持有的锁的ID


key_column_usage

这个表中存储 键 和 约束 的信息,列含义如下:

CONSTRAINT_CATALOG 约束所属的目录名称,该值始终为 def

CONSTRAINT_SCHEMA 约束所属的数据库名称

CONSTRAINT_NAME 约束的名字

TABLE_CATALOG 约束所在表所属的目录名称,该值始终为 def

TABLE_SCHEMA 约束所在表的数据库名称

TABLE_NAME 约束所在的表的名称

COLUMN_NAME 拥有约束的列的名称,如果是外键约束,名称是该外键列,不是所引用的列

ORDINAL_POSITION 约束中列的位置,不是列在表中的位置,从1开始标记

POSITION_IN_UNIQUE_CONSTRAINT ,如果是唯一或者主键约束,值为NULL,如果是外键约束,该值为被引用表的列的位置

REFERENCED_TABLE_SCHEMA 被引用的表的数据库名称

REFERENCED_TABLE_NAME 被引用的表的名称

REFERENCED_COLUMN_NAME被引用的列的名称


上一篇 MySQL-Server 服务端管理

下一篇 MySQL-Programs 程序

阅读
评论
3.1k
阅读预计12分钟
创建日期 2021-07-19
修改日期 2023-05-17
类别

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论