# 1.删除缓存
#在服务器上登录
mysql -u root -p
#刷新mysql的缓存
FLUSH HOSTS;
#退出
quit
2
3
4
5
6
7
8
# 2.查看缓冲池的信息
SELECT * from information_schema.INNODB_BUFFER_POOL_STATS;
information_schema
:这是 MySQL 中的一个系统数据库,包含有关数据库系统的元数据,例如表、列、索引、权限等信息。INNODB_BUFFER_POOL_STATS
:这是information_schema
数据库中特定表的名称。如前所述,该表包含有关 MySQL 中 InnoDB 缓冲池的统计信息。
# 3.显示 ddl 频次
在 MySQL 中,"Com
" 命令计数是指执行各种类型的 SQL 命令的次数。例如,"Com_select" 表示执行 SELECT 语句的次数,"Com_insert" 表示执行 INSERT 语句的次数,等等。通过这个查询,您可以查看与特定类型的 SQL 命令相关的计数信息。
SHOW GLOBAL STATUS LIKE 'Com_______';
# 4.查询库表列
#查看库
SELECT * FROM information_schema.schemata order by SCHEMA_NAME;
#查询表
select * from information_schema.tables
where TABLE_SCHEMA ='information_schema'
order by TABLE_SCHEMA;
#查询列
select * from information_schema.columns order by TABLE_SCHEMA;
2
3
4
5
6
7
8
9
10
# 5.索引监控
#查询冗余索引
select * from sys.schema_redundant_indexes;
#查询未使用过的索引
select * from sys.schema_unused_indexes;
#查询索引的使用情况
select index_name,rows_selected,rows_inserted,rows_updated,rows_deleted
from sys.schema_index_statistics
where table_schema='kwan' ;
#查询表的访问量
select table_schema,table_name,sum(io_read_requests+io_write_requests) as io from sys.schema_table_statistics group by table_schema,table_name order by io desc;
#查询占用bufferpool较多的表
select object_schema,object_name,allocated,data from sys.innodb_buffer_stats_by_table order by allocated limit 10;
#查看表的全表扫描情况
select * from sys.statements_with_full_table_scans where db='kwan';
#监控SQL执行的频率
select db,exec_count,query from sys.statement_analysis order by exec_count desc;
#监控使用了排序的SQL
select db,exec_count,first_seen,last_seen,query from sys.statements_with_sorting limit 1;
#监控使用了临时表或者磁盘临时表的SQL
select db,exec_count,tmp_tables,tmp_disk_tables,query
from sys.statement_analysis where tmp_tables>0 or tmp_disk_tables >0
order by (tmp_tables+tmp_disk_tables) desc;
#查看消耗磁盘IO的文件
select file,avg_read,avg_write,avg_read+avg_write as avg_io
from sys.io_global_by_file_by_bytes
order by avg_read limit 10;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 6.查看等待锁的语句
SELECT *
FROM performance_schema.events_statements_history
WHERE thread_id IN (
SELECT b.`THREAD_ID`
FROM sys.`innodb_lock_waits` AS a
, performance_schema.threads AS b
WHERE a.waiting_pid = b.`PROCESSLIST_ID`)
ORDER BY timer_start ASC;
2
3
4
5
6
7
8
# 7.SHOW PROCESSLIST
SHOW PROCESSLIST
是用于查看当前运行在 MySQL 服务器上的所有连接和它们的状态的 SQL 命令。它提供了有关每个连接的详细信息,包括以下参数:
Id
:连接的唯一标识符。每个连接都有一个唯一的 ID,可以用于识别和操作连接。User
:连接的用户名。这是连接到 MySQL 服务器的用户的用户名。Host
:连接的主机地址。这是连接到 MySQL 服务器的客户端主机的 IP 地址或主机名。db
:当前使用的数据库。连接当前正在使用的数据库,如果没有使用任何数据库,则显示为 NULL。Command
:客户端执行的命令。这可以是各种命令,如"Sleep"(空闲状态)、"Query"(执行 SQL 查询)、"Connect"(建立连接)等。Time
:连接的运行时间(以秒为单位)。表示连接自上次查询或命令执行以来的运行时间。State
:连接的当前状态。这个状态字段提供了连接当前正在执行的具体操作的信息。Info
:连接正在执行的 SQL 查询或命令。如果连接正在执行 SQL 查询,这里将显示查询的文本。
通过执行 SHOW PROCESSLIST
命令,你可以了解到当前活动的 MySQL 连接以及它们的状态,这对于诊断和监视 MySQL 服务器的性能和运行状况非常有用。如果需要中断某个连接,你可以使用 KILL
命令,并提供连接的 ID 来终止该连接。
# 8.查询死锁
-- 行锁阻塞情况
select * from sys.innodb_lock_waits;
2
这个系统视图提供了有关 InnoDB 存储引擎中正在等待锁的事务的信息。
InnoDB 是 MySQL 中常用的存储引擎之一,它支持事务和行级锁定,以提供更好的数据完整性和并发性。在多个事务同时访问同一数据时,可能会出现锁定冲突。当一个事务在等待另一个事务持有的锁时,就会发生锁等待(lock wait)。
sys.innodb_lock_waits
视图的目的是帮助您识别当前正在等待锁的事务,以便您能够进行性能监视和故障排除。该视图提供了以下重要的列:
waiting_trx_id
:正在等待锁的事务 ID。waiting_thread_id
:正在等待锁的线程 ID。waiting_query
:正在等待锁的查询语句。waiting_lock_id
:正在等待的锁 ID。waiting_lock_mode
:正在等待的锁模式,例如共享锁或排他锁。blocking_trx_id
:正在持有正在等待锁的事务 ID。blocking_thread_id
:正在持有正在等待锁的线程 ID。blocking_query
:正在持有正在等待锁的查询语句。blocking_lock_id
:正在持有的锁 ID。blocking_lock_mode
:正在持有的锁模式。
通过查询sys.innodb_lock_waits
视图,您可以查看当前存在的锁等待情况,并确定哪些事务在阻塞其他事务的进程,从而帮助您诊断和解决潜在的性能问题。
查看锁信息:
# 查看锁信息
SELECT *
FROM information_schema.INNODB_TRX;
SELECT *
FROM `sys`.`innodb_lock_waits`;
SELECT *
FROM performance_schema.data_locks;
SELECT *
FROM performance_schema.data_lock_waits;
2
3
4
5
6
7
8
9
# 9.查询主从信息
#查询主服务器状态
show master status\G;
#查询从服务器状态
show slave status\G;
2
3
4
5
# 10.查看数据库支持的引擎
#查看引擎
show engines;
2
# 12.Too many connections
报错信息如下:
"SQLState":"08004","vendorCode":1040,"detailMessage": "Data source rejected establishment of connection,message from server: "Too many connections""
解决方案
我们要知道,MySQL 版本的不同,可设置的最大连接数范围也是有所区别的:
- MySQL5.5 ~ 5.7:默认的最大连接数都是 151,上限为:100000
- MySQL5.0 版本:默认的最大连接数为 100,上限为 16384
- MySQL8.0 版本: 默认的最大连接数是 151
查看 MySQL 版本
SELECT VERSION() ;
查看当前 MySQL 最大连接数限制
show variables like 'max_connections';
set global max_connections=1500;
修改 my.cnf 文件
MySQL 重启后会优先使用 my.cnf 配置文件中的配置,用上面命令设置后,若重启 MySQL 服务,则还是会回到 my.cnf 文件中配置的最大连接数(或者默认值)。
# 修改my.cnf文件,在文件中加入如下属性
max_connections=1500
# 然后重启mysql服务
$ service mysqld restart
2
3
4
5
再次去创建数据库连接,就没问题了!
# 13.时区查询
SHOW VARIABLES LIKE "%time_zone%";
输出
Variable_name Value
system_time_zone CST
time_zone SYSTEM
# 14.system_time_zone 参数
system_time_zone
是一个变量,用于表示系统的时区信息。在 Java 中,通过 java.util.TimeZone
类的静态方法 getAvailableIDs()
可以获取所有可用的时区标识符,其中包括 system_time_zone
可能的取值。
以下是一些 system_time_zone
可能的取值示例:
- "America/New_York": 美国东部时间
- "Europe/London": 伦敦时间
- "Asia/Tokyo": 东京时间
- "Pacific/Honolulu": 夏威夷时间
- "Australia/Sydney": 悉尼时间
- "Africa/Cairo": 开罗时间
- "America/Los_Angeles": 美国太平洋时间
- "Europe/Paris": 巴黎时间
- "Asia/Shanghai": 上海时间
- "America/Sao_Paulo": 圣保罗时间
# 15.CST 和 UTC 的区别?
CST 和 UTC 是两种常见的时间标准,它们之间的主要区别在于其基准点和使用方式:
UTC(协调世界时):是国际时间标准,基于原子钟的时间测量,以地球自转为基础。UTC 被认为是世界上的标准时间,不受地理位置的影响。UTC 不考虑夏令时的变化,因此在夏令时生效时,与当地时间可能会有偏差。
CST(中部标准时间):是美国中部地区的标准时间。CST 是以地区的地方时间为基础,通常是指 UTC-6 小时。在夏令时生效期间,中部地区会转换为 CDT(中部夏令时),相对于 UTC 是 UTC-5 小时。
总的来说,CST 和 UTC 的主要区别在于其基准点和使用方式。UTC 是国际标准时间,不受地理位置的影响,而 CST 是美国中部地区的标准时间,以地方时间为基准,可能会受到夏令时的影响。
# 16.解决方案
# 1.进入 mysql 控制台
mysql -u root -p ****
执行如下命令即可,这时候我们再执行 select now();发现时间并没有变回来
SET time_zone = "+08:00";
SET global time_zone = "+08:00";
flush privileges;
2
3
# 2.修改 my.cnf
我们同样的进入到,mysql 所在宿主机,编辑 mysql 配置文件
/etc/mysql/mysql.conf.d/mysqld.cnf
我们在[mysqld]下面加入这样的一句话:
default-time-zone=Asia/Shanghai
# 3.修改 mysql 链接信息
一般我们使用 springBoot 项目,需要在 application.properties 中配置 mysql connector 信息
在 jdbc 链接信息里设置 serverTimezone=Asia/Shanghai
# 17.Public Key Retrieval is not allowed
针对“Public Key Retrieval is not allowed”错误,我们可以采取一些解决方案来解决或避免这一问题的发生:
在 JDBC 连接串中加入 useSSL=false 参数
JDBC 是 Java Database Connectivity 的缩写,用于 Java 程序与数据库进行连接和操作。在 JDBC 连接数据库时,可以通过在连接串中添加参数来配置连接的属性。其中,将 useSSL 参数设置为 false 可以禁用 SSL/TLS 协议,从而避免“Public Key Retrieval is not allowed”错误的发生。
在 JDBC 连接串中加入 allowPublicKeyRetrieval=true 参数
除了禁用 SSL/TLS 协议外,还可以通过在 JDBC 连接串中添加 allowPublicKeyRetrieval 参数并设置为 true 来允许公钥检索。这样一来,即使禁用了 SSL/TLS 协议,客户端仍然可以通过此参数获取服务器的公钥,从而避免“Public Key Retrieval is not allowed”错误。
# 18.drop,truncate,delete 区别?
DROP
:DROP
删除表和数据DROP
是用于删除数据库对象(表、视图、索引、存储过程等)的操作。- 例如,使用
DROP TABLE
语句可以删除一个表,以及与该表相关的数据、索引和约束等。 DROP
操作是一个 DDL(Data Definition Language)命令,因此会立即提交事务,并且不能回滚。执行后数据和对象会永久删除。
TRUNCATE
:TRUNCATE
清空表中的数据,会释放空间,重置主键TRUNCATE
用于快速删除表中的所有数据,但保留表结构。- 与
DELETE
相比,TRUNCATE
操作通常更快,因为它不会逐行删除数据,而是直接删除表中的所有数据。 TRUNCATE
操作是一个 DDL 命令,也会立即提交事务,并且不能回滚。执行后数据会永久删除,但表结构仍然保留。
DELETE
:DELETE
仅仅只是删除表中的数据DELETE
用于从表中删除特定的行,可以根据条件删除满足条件的数据。DELETE
是一个 DML(Data Manipulation Language)命令,因此可以包含在一个事务中,并且可以回滚。DELETE
操作逐行删除数据,并在删除过程中生成事务日志,因此相对较慢,特别是对于大量数据的删除。
02-插入死锁 →