1. 数据库总体运行情况
1.1. 数据库字符集与Collation
SELECT schema_name,
default_character_set_name AS 'charset',
default_collation_name AS 'collation'
FROM information_schema.schemata
WHERE schema_name = SCHEMA();
/* WHERE SCHEMA_NAME = 'database_name'; */
-
修改数据库字符集
ALTER DATABASE 数据库名(实例名) DEFAULT CHARACTER SET 字符集 COLLATE 排序规则;
-
示例
ALTER DATABASE easytongdb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
1.2. 数据库中某张表所用的字符集
SHOW CREATE TABLE 表名(或 实例名.表名);
- 修改当前数据库中所有表的字符集和排序规则(修改所有表的字符集为utf8mb4)
SELECT CONCAT('ALTER TABLE ', t.table_schema, '.', t.table_name, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;') FROM information_schema.tables t WHERE t.table_schema = SCHEMA();
1.3. 查看表中所有列的字符集
SHOW FULL COLUMNS FROM 表名(或 实例名.表名);
-
查询当前数据库中所有列的字符集和排序规则
SELECT c.table_name AS '表名称', c.column_name AS '字段名称', c.character_set_name AS '字符集', c.collation_name AS '排序规则' FROM information_schema.`columns` c WHERE c.table_schema = SCHEMA();
-
修改当前数据库中所有列的字符集和排序规则(将gbk的字符集转换成utf8mb4字符集)
SELECT c.table_schema AS '数据库', c.table_name AS '表名', c.column_name AS '字段名', c.character_set_name AS '字符集', c.collation_name AS '排序规则', CONCAT('ALTER TABLE ', c.table_schema, '.', c.table_name, ' MODIFY COLUMN ', c.column_name, ' ', c.column_type, ' CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci ', CASE WHEN c.column_default IS NOT NULL THEN CONCAT(' DEFAULT ', c.column_default) ELSE ' ' END, CASE WHEN c.is_nullable = 'NO' THEN ' NOT NULL ' ELSE ' ' END , ';' ) AS'修正SQL' FROM information_schema.columns c WHERE c.table_schema = SCHEMA() AND c.character_set_name = 'gbk';
1.4. 查看数据库使用端口
show variables like 'port';
1.5. 查看当前数据库数据大小、索引大小以及总大小
SELECT concat(round(sum(data_length)/(1024*1024),2),' MB') AS 'DbData Size',
concat(round(sum(index_length)/(1024*1024),2),' MB') AS 'DbIndex Size',
concat(round(sum(a.data_length)/(1024*1024),2) +
round(sum(a.index_length)/(1024*1024),2),' MB') AS 'DbTotal Size'
FROM information_schema.tables a
WHERE a.table_schema=SCHEMA();
1.6. 查看数据库的所有用户信息
SELECT DISTINCT concat('''',user,'''@''',host,''';') AS users
FROM mysql.user;
1.7. 查看某个具体用户的权限
show grants for 'root'@'localhost';
1.8. 获取当前会话/进程用户名
SELECT CURRENT_USER();
或:
SELECT SESSION_USER();
1.9. 获取当前会话/进程ID
SELECT connection_id();
1.10. 查看数据库连接的用户情况
1.11. 查询用户正在执行的SQL语句
SELECT *
FROM information_schema.PROCESSLIST
WHERE info IS NOT NULL;
1.12. kill正在执行SQL的进程
KILL [CONNECTION | QUERY] thread_id;
2. 数据库用户、权限及配置
2.1. 查询所有用户
SELECT user,host, CONCAT('User: ''',user,'''@''',host,''';') AS user_detail
FROM mysql.user;
2.2. 查看数据库中具体某个用户的权限
SHOW GRANTS FOR 'username'@'host';
授予某个字段的权限,权限信息保存在mysql.columns_priv表中
SELECT * FROM mysql.columns_priv;
2.3. 赋予和回收删除数据库的权限
-- 赋予删除数据库权限
GRANT DROP ON databasename.* TO 'username'@'host';
-- 回收删除数据库权限
REVOKE DROP ON databasename.* FROM 'username'@'host';
2.4. 赋予用户查询information_schema数据库权限
任何用户都有information_schema
下的表或者视图的访问权限, 但是有些视图或者表需要一些特殊的权限,比如说innodb_locks
表就需要用户具有 process
权限才能访问。
GRANT PROCESS ON *.* TO 'username'@'host';
3. 日志
3.1. 查看日志开启状态
show variables like 'log_%';
3.2. 查看所有binlog日志列表
show master logs;
- 示例
MariaDB [(none)]> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000480 | 342 |
+------------------+-----------+
3.3. 查看最新一个binlog日志的编号名称,及其最后一个操作事件结束点
show master status;
- 示例
MariaDB [(none)]> show master status;
+------------------+----------+---------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+---------------+------------------+
| mysql-bin.000480 | 342 | paymentdb_nsd | |
+------------------+----------+---------------+------------------+
3.4. 刷新log日志,立刻产生一个新编号的binlog日志文件,跟重启一个效果
flush logs;
- 示例
MariaDB [(none)]> flush logs;
MariaDB [(none)]> show master status;
+------------------+----------+---------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+---------------+------------------+
| mysql-bin.000481 | 385 | paymentdb_nsd | |
+------------------+----------+---------------+------------------+
MariaDB [(none)]> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000480 | 389 |
| mysql-bin.000481 | 385 |
+------------------+-----------+
3.5. 使用命令mysqlbinlog去解析mysql日志文件
mysqlbinlog --no-defaults --database=easytongwlwdb -vv --base64-output=decode-rows --start-datetime='2022-03-15 18:10:00' --stop-datetime='2022-03-15 18:40:00' ./mysql-bin.000572 > /tmp/parse-mysql-bin.000572.txt
3.6. 慢查询日志参数
-- 慢查询日志是否开启以及日志记录的位置
show variables like '%slow_query_log%';
-- 慢查询sql的设置时间,默认10s,sql执行时间大于该时间时才会被记录到慢查询日志中
show variables like 'long_query_time';
-- 慢查询日志存储方式
show variables like '%log_output%';
-- 未使用索引的查询是否记录到慢查询日志
show variables like 'log_queries_not_using_indexes';
- 示例
MariaDB [(none)]> show variables like '%slow_query_log%';
+---------------------+-----------------------------------+
| Variable_name | Value |
+---------------------+-----------------------------------+
| slow_query_log | ON |
| slow_query_log_file | /data/etmaridb/log/mysql-slow.log |
+---------------------+-----------------------------------+
MariaDB [(none)]> show variables like 'long_query_time';
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| long_query_time | 0.500000 |
+-----------------+----------+
MariaDB [(none)]> show variables like '%log_output%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output | FILE |
+---------------+-------+
MariaDB [(none)]> show variables like 'log_queries_not_using_indexes';
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| log_queries_not_using_indexes | OFF |
+-------------------------------+-------+
3.7. 错误日志文件路径
show variables like 'log_error';
- 示例
MariaDB [(none)]> show variables like 'log_error';
+---------------+------------------------------+
| Variable_name | Value |
+---------------+------------------------------+
| log_error | /data/etmaridb/log/error.log |
+---------------+------------------------------+
4. 性能参数
参考:https://www.cnblogs.com/zengkefu/p/5608096.html
4.1. 读写比例
show global status like 'com_select'; 获得服务器启动到目前查询操作执行的次数;
show global status like 'com_insert'; 获得服务器启动到目前插入操作执行的次数;
show global status like 'com_update'; 获得服务器启动到目前更新操作执行的次数;
show global status like 'com_delete'; 获得服务器启动到目前删除操作执行的次数;
- 计算读百分比
select concat(com_select / (com_select+com_insert+com_update+com_delete)* 100,'%');
- 计算写百分比
select concat(com_insert+com_update+com_delete / (com_select+com_insert+com_update+com_delete) * 100,'%');
通过检查数据库读写比例,可反映出应用是读密集型还是写密集型。
4.2. 慢查询比例
开启慢查询日志:
slow_query_log = 1 # 开启慢查询日志
log_output = FILE|TABLE # 指定日志存储方式,默认为 file
slow_query_log_file = slow-query.log # 指定慢查询日志文件位置
long_query_time = 1 # 执行及响应时间超过该参数设置的值记录日志
show global status like 'Slow_queries '; # 获得服务器启动到目前慢查询操作记录的次数;
注意,慢查询包括 select 、 update 以及 delete ,没有 insert。
计算慢查询比例:
select concat(Slow_queries / (Com_select+Com_update+Com_delete) * 100,'%');
通过计算慢查询比例,可反映出数据库运行效能。
4.3. 连接数检查
show global status like 'max_connections'; # 获得数据库运行的最大连接数 //允许的最大连接数
show global status like 'Max_used_connections'; # 获得最大一次的连接数 //最大突发并行连接数
show global status like 'connections'; # 获得数据库运行到目前,总共被连接了多少次 //登陆的次数
show global status like 'Threads_connected'; # 获得当前连接数
show global status like 'Threads_running'; # 获得当前正在运行的连接数
计算当前连接数的比例:
select concat(Threads_connected / max_connections *100,'%'); # 计算最大一次的连接数比例:
select concat(Max_used_connections / max_connections *100,'%');# 通过连接数检查,可得知数据库在不同时间段被请求的压力
4.4. 线程缓存
show global status like 'Connections'; # 获得数据库运行到目前,总共被连接了多少次
show global status like 'Threads_created'; # 获得数据库运行到目前,创建连接线程的次数
计算连接线程缓存命中率:
select concat((Connections-Threads_created) / Connections × 100,'%');
通过计算连接线程缓存命中率,可反映出连接线程的命中情况,命中率越大越好。
如果命中率过低,则表示缓存连接线程的数量过少,可以考虑加大 thread_cache_size 的值。
4.5. 表缓存
show global status like 'Table_open_cache_misses'; # 新打开的表的次数。 不命中
show global status like 'Table_open_cache_hits'; # 从表缓存中拿已打开的表的次数,该状态变量 5.6 才开始存在 命中
show global status like 'Opened_tables'; # 打开表的总次数
通过已知自己数据库中有多少表,再观察 Opened_tables 的值,可以得知表缓存的数量是否合理,如果打开表的次数大于数据库中已有的表数量,则表示 table_open_cache 的值不够,可以考虑加大。
计算表缓存的命中率:
select concat(Table_open_cache_hits /(Table_open_cache_misses + Table_open_cache_hits) * 100,'%');
通过计算表缓存的命中率,可反映出表缓存的情况,该比例越大越好。
4.6. 临时表
show global status like 'Created_tmp_disk_tables'; # 查看在磁盘上创建临时表的次数
show global status like 'Created_tmp_tables'; # 查看创建临时表的总次数,包括在内存中和磁盘。
如果发现在磁盘上创建临时表的次数过多,则表示临时表的缓存区内存不够,可以考虑加大 tmp_table_size 和 max_heap_table_size 的值。
计算在磁盘上创建临时表的比例:
select concat(Created_tmp_disk_tables / Created_tmp_tables * 100,'%');
通过计算在磁盘上创建临时表的比例,可反映出数据库的使用临时表的情况,该比例越小越好。
4.7. 额外的排序
show global status like 'Sort_merge_passes'; # 在磁盘中进行额外排序的次数
show global status like 'Sort_scan'; # 通过表扫描进行排序的总次数,也就是额外排序的总次数
如果发现在磁盘上进行排序的次数过多,则表示排序缓冲区内存不够,可以考虑加大 sort_buffer_size 的值。
计算磁盘排序的比例:
select concat(Sort_merge_passes / Sort_scan * 100,'%');
通过计算在磁盘上进行额外排序的比例,可反映出数据库排序的情况,该比例越小越好。
4.8. binlog 缓冲
show global status like 'Binlog_cache_disk_use'; # 在磁盘上创建临时文件用于保存 binlog 的次数
show global status like 'Binlog_cache_use'; # 缓冲 binlog 的总次数,包括 binlog 缓冲区和在磁盘上创建临时文件保存 binlog 的总次数
如果发现在磁盘上创建临时文件保存 binlog 的次数过多,则表示 binlog 缓冲区内存不够,可以考虑加大 binlog_cache_size 的值。
计算在磁盘上创建临时文件保存 binlog 的比例:
select concat(Binlog_cache_disk_use / Binlog_cache_use * 100,'%');
通过计算在磁盘上创建临时文件保 binlog 的比例,可反映出数据库 binlog 的情况,该比例越小越好。
4.9. redo 日志
select global status like 'Innodb_log_waits'; # 查看 innodb redo 日志等待缓冲区刷新的次数。
当 redo 缓冲区容纳不下事务产生的 redo 日志时,本次事务产生的 redo 日志在写入 redo 缓冲区之前就必须等待 redo 缓冲区有足够的空间才能写入。
如果发现 redo 日志等待刷新的次数过多,则表示 innodb redo 日志缓冲区的大小不够,可以考虑加大 innodb_log_buffer_size 的值。
4.10. InnoDB 缓存
show global status like 'Innodb_buffer_pool_read_requests'; # 读取页的总次数
show global status like 'Innodb_buffer_pool_read'; # 从磁盘读取页的次数
如果发现从磁盘读取页的次数过多,则有可能是因为 innodb 缓冲池的大小不够,此时可以考虑加到 innodb_buffer_pool_size 的值。
计算 innodb 缓存命中率:
select concat((Innodb_buffer_pool_read_requests - Innodb_buffer_pool_read) / Innodb_buffer_pool_read_requests * 100,'%';
通过计算 innodb 缓存命中率,可反映出 innodb 缓存的效率,该比例越大越好。