关于MySQL安全相关的监控和优化,以及数据运营。

5.5以后的版本添加了审计功能(类似于general_log,但是记录更详细),时时的审计会消耗一定的性能,因此离线分析也必不可少。

登录日志

创建登录日志表:

CREATE TABLE test.t_access_log (

id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,

connection_id INT(11) NOT NULL,

localname VARCHAR(30),

matchname VARCHAR(30)

login_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,

) ENGINE=MEMORY DEFAULT CHARSET=UTF8;

编辑my.cnf,加入以下行后重启mysqld:

init-connect='INSERT INTO test.t_access_log(connection_id,localname,matchname) VALUES(CONNECTION_ID(),USER(),CURRENT_USER());

注意 USER() 和 CURRENT_USER() 的区别

USER():当前连接的用户名和客户端地址

CURRENT_USER():当前认证的服务端用户名和host,对应mysql.user表中的记录

根据登录日志可查询频繁登录的用户或IP

SELECT SUBSTR(localname,1,LOCATE('@',localname)-1) user,SUBSTR(localname,LOCATE('@',localname)+1) host,COUNT(1) c FROM t_access_log WHERE login_time>NOW()-INTERVAL 1 DAY GROUP BY 1,2 ORDER BY 3 DESC LIMIT 10;

可通过在连接侧使用连接池,或者设置系统 TIME_WAIT状态的保持时间来优化:

sysctl -w net.ipv4.tcp_fin_timeout=100

grep net.ipv4.tcp_fin_timeout /etc/sysctl.conf

binlog 解析

随机选取一个时段的binlog文件,或者选取所有binlog做解析:

ls mysql-bin.0* | sort -R | head -1

然后通过mysqlbinlog工具解析:

mysqlbinlog --set-charset=UTF8 --base64-output=decode-rows -vv mysql-bin.XX

最后统计出执行量最大的一些SQL:

# 过滤单行SQL,对于大事务或跨多行的SQL暂未解析

egrep -i '^(update|delete|replace|insert)'\

# 过滤空格,替换实际数据为“?”

| sed -re "s/\\\['\"]//g" -e "s/'[^']*'/?/g" -e 's/"[^"]*"/?/g' -e 's/\t/ /g' -e 's/ +/ /g' -e 's/ ?([!=+,<>*(]) ?/\1/g' -e 's/([=,])?-?[0-9]+(,)?/\1?\2/g' -e 's/[A-Z]/\l&/g' -e 's/`//g'\

# 替换NULL、NOW()等值,保留IFNULL()函数

-e 's/ifnull/IFNULL/g' -e 's/null|now\(\)/?/g' -e 's/\?[,.]\?/?/g' -e 's/\?[,.]\?/?/g' -e 's/\?[,.]\?/?/g' -e 's/,\(\?\)//g'\

# 由于sed的正则引擎不支持反复替换,所以临时用perl

| perl -pe "s/'[^']*'/?/g"\

# 排序取最大前十个SQL

| sort | uniq -c | sort -rnk1 | head -10

统计结果如下:

统计库表使用空间

SELECT table_schema '库名',table_name '表名',engine '引擎',IF(data_length>1024*1024*1024,CONCAT(CAST(data_length/1024/1024/1024 AS DECIMAL(8,2)),' G'),CONCAT(CAST(data_length/1024/1024 AS DECIMAL(8,2)),' M')) '数据大小',IF(index_length>1024*1024*1024,CONCAT(CAST(index_length/1024/1024/1024 AS DECIMAL(8,2)),' G'),CONCAT(CAST(index_length/1024/1024 AS DECIMAL(8,2)),' M')) '索引大小' FROM tables WHERE table_schema NOT IN ('information_schema','performance_schema','mysql') ORDER BY data_length DESC,index_length DESC LIMIT 10

结果集包含如下字段:

库名

表名

引擎

数据大小

索引大小

可以直接用mysql命令导出邮件或csv格式输出:

mysql --default-character-set=UTF8 information_schema -He "$SQL"

slow-query统计

需要借助percona的工具箱来完成

/usr/local/percona-toolkit/bin/pt-query-digest --history localhost -D test --order-by Query_time:sum --limit 10 --no-report slow_query.log

--history:保存结果到表中,默认是 query_review_history,“-D”指定写入数据库

--order-by:结果排序。语法是:字段名:统计方式(包含sum、min、max、cnt)

--no-report:不在终端显示结果

--limit:结果数量

再通过SQL查询导出结果集

SELECT sample 'SQL',ts_min '首次执行时间',ts_max '最后执行时间',ts_cnt '总次数',Query_time_sum '总耗时',Query_time_min '最小耗时',Query_time_max '最大耗时',Query_time_pct_95 '95% 耗时',Query_time_median '平均耗时',Lock_time_sum '总锁时间',Lock_time_min '最小锁时间',Lock_time_max '最大锁时间',Lock_time_pct_95 '95% 锁时间',Lock_time_median '平均锁时间',Rows_sent_sum '总查询行数',Rows_sent_min '最小查询行数',Rows_sent_max '最大查询行数',Rows_sent_pct_95 '95% 查询行数',Rows_sent_median '平均查询行数',Rows_examined_sum '总检索行数',Rows_examined_min '最小检索行数',Rows_examined_max '最大检索行数',Rows_examined_pct_95 '95% 检索行数',Rows_examined_median '平均检索行数' FROM test.query_history ORDER BY ts_cnt DESC,Query_time_sum DESC LIMIT 10

结果集包含如下字段:

SQL

首次执行时间

最后执行时间

总次数

总耗时

最小耗时

最大耗时

95% 耗时

平均耗时

总锁时间

最小锁时间

最大锁时间

95% 锁时间

平均锁时间

总查询行数

最小查询行数

最大查询行数

95% 查询行数

平均查询行数

总检索行数

最小检索行数

最大检索行数

95% 检索行数

平均检索行数

mysql也可直接将慢查询日志写入表 mysql.slow_log,但是结果不够齐全

启用命令如下:

SET GLOBAL log_output='TABLE';

字符集检测

使用不符合规范的字符集的库表:

SELECT TABLE_COLLATION,GROUP_CONCAT(DISTINCT TABLE_SCHEMA) dbs,GROUP_CONCAT(DISTINCT TABLE_NAME) tbs FROM TABLES WHERE TABLE_TYPE='BASE TABLE' GROUP BY TABLE_COLLATION\G

结果如下:

索引预警

查询未添加索引(包含主键)的表,所有表最好都定义显示主键或索引:

SELECT a.TABLE_SCHEMA,a.TABLE_NAME FROM information_schema.TABLES a LEFT JOIN information_schema.STATISTICS b ON a.TABLE_SCHEMA=b.TABLE_SCHEMA AND a.TABLE_NAME=b.TABLE_NAME WHERE TABLE_TYPE='BASE TABLE' AND (INDEX_NAME IS NULL OR INDEX_NAME='');

引擎分布

检测各类引擎的表数量,根据用途来判断引擎是否合理:

SELECT ENGINE,GROUP_CONCAT(DISTINCT TABLE_SCHEMA) dbs,GROUP_CONCAT(DISTINCT TABLE_NAME) tbs,COUNT(1) c FROM TABLES WHERE TABLE_TYPE='BASE TABLE' AND TABLE_SCHEMA NOT IN ('mysql','information_schema','performance_schema','test') GROUP BY ENGINE\G

弱密码检测

密码为空或者是简单密码,通常会有一个弱密码表,用于比对:

SELECT IFNULL(GROUP_CONCAT(CONCAT(user,'@',host) SEPARATOR ', '),'') FROM mysql.user WHERE PASSWORD(user) IN (password,PASSWORD(CONCAT(user,' ')),PASSWORD('123')) AND user!='';

注意5.6之后的版本password字段改成了authentication_string。

连接数监控

连接数使用率较高时,需要预警和优化:

SELECT COUNT(IF(COMMAND NOT IN ('Sleep','Binlog Dump','Connect','Binlog Dump GTID') AND TIME>1,1,NULL)) '执行超过1秒的SQL数',COUNT(1) '当前连接数' FROM information_schema.PROCESSLIST;

SELECT SUM(c) '连接最多的IP数',m '最大连接数',ip '连接最多的IP',c '当前连接数' FROM (SELECT COUNT(1) c,@@max_connections m,SUBSTR(HOST,1,LOCATE(':',HOST)-1) ip FROM information_schema.PROCESSLIST GROUP BY 3 ORDER BY 1 DESC) X;

EOF.

mysql 安全扫描_MySQL 安全和监控 - Can't Wait Any Longer - OSCHINA - 中文开源技术交流社区...相关推荐

  1. mysql 锁测试_mysql行级锁测试 - echowu007的个人空间 - OSCHINA - 中文开源技术交流社区...

    MySQL innodb存储引擎使用与oracle相同的行锁机制,对如何查看系统中存在的行锁情况在下面的实验中,将可以看到.下面是测试过程: session 1:更新记录 mysql> set ...

  2. mysql查询未讲课教师_MySQL基础(查) - osc_hghvwmhn的个人空间 - OSCHINA - 中文开源技术交流社区...

    #新建一个表 create database exercise; #查询表的信息 SELECT * FROM student; SELECT * FROM score; #查询student表的第二条 ...

  3. mysql 用户 %_mysql用户操作 - 可爱的wzz的个人空间 - OSCHINA - 中文开源技术交流社区...

    一. 创建用户 命令:CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明: username:你将创建的用户名 host:指定该用户在 ...

  4. mysql连库串_数据库连接串整理 - osc_ac5z111b的个人空间 - OSCHINA - 中文开源技术交流社区...

    常用JDBC驱动与连接字符串 MySQL driver:com.mysql.jdbc.Driver url:jdbc:mysql://localhost:3306/mydb MySQL url格式:j ...

  5. mysql dump 1017_MySQL数据库导出 - Can't Wait Any Longer - OSCHINA - 中文开源技术交流社区...

    本文内容主要来自MySQL官方文档:"MySQL5.1 Reference,2.10.3. 将MySQL数据库拷贝到另一台机器" 注意:参数名与值间可以不用空格,如 -uroot ...

  6. mysql数据无故回档_数据库回档解决方案 - osc_hajrc28s的个人空间 - OSCHINA - 中文开源技术交流社区...

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者介绍:李明,腾讯云数据库架构师华南区负责人,曾在某专业数据库服务商.51job任职DBA. 作为一名DBA,日常工作中免不了需要做一些救 ...

  7. zabbix中mysql连不上的排错_zabbix使用排错 - oschina130111的个人空间 - OSCHINA - 中文开源技术交流社区...

    在linux系统中,几乎所有运行的服务都会产生相对就的日志(log),所运行的程序在出错时都会有错误提示,即使没有任何提示也可以通过"echo $"来查看运行是否成功.使用zabb ...

  8. mysql 重做日志 镜像_mysql重做日志 - osc_vr7hvjd2的个人空间 - OSCHINA - 中文开源技术交流社区...

    一.重做日志(redo log) 1.作用 确保事务的持久性. 防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的持久性这一特性. 2 ...

  9. mysql 4000行记录有必要建索引吗_MySQL 使用规范 - miaojiangmin的个人空间 - OSCHINA - 中文开源技术交流社区...

    MySQL 使用规范 以下规范适用在线交易(OLTP)系统的数据库.数据仓库与分析系统也可以参考. 命名规范 表名.字段名.索引名使用小写字母.数字,采用下划线分割 表名采用模块名3个缩小字符_前缀, ...

最新文章

  1. 精美素材分享:16套免费的扁平化图标下载
  2. IOS 常见面试汇总
  3. 一行代码完成js对象数组的深拷贝
  4. WebAPI(part9)--下拉菜单及留言案例
  5. MVC框架中的值提供机制(二)
  6. win7变成xp风格了怎么改回_让电脑提速的几种方法(老电脑太卡怎么提速)
  7. python实现给定信号生成任意信噪比的带噪声信号
  8. 安卓rtmp推流app_直播-腾讯云推流-sdk 播放地址不正确的解决方案---蜻蜓系统-uniapp-flutter通用...
  9. hdu 1856 求集合里元素的个数 输出最大的个数是多少
  10. 类似铸剑物语的java游戏_怀旧向:GBA上的10款经典RPG游戏推荐,这些你都玩过吗?...
  11. python将变量写入文件_python 如何把变量写入文件
  12. Excel如何用IF函数进行数据筛选
  13. 实验6 - 家中的电视
  14. 将加密的pdf转化成word
  15. php画圆 锯齿,优雅的解决canvas画圆锯齿问题
  16. 春招进行时:简历信息安全危机
  17. cesium去除控件及版权信息
  18. Jackson配置大全
  19. Python爬虫实战:QQ空间全自动点赞工具
  20. 一对一视频聊天app源码,Android开发之取两个色值的中间色

热门文章

  1. uwsgi基础——最佳实践和问题
  2. 网络验证常见的攻击方式与防御手段
  3. linux开启nscd服务缓存加速
  4. sql server--优化
  5. excel怎么设置密码保护?Excel文件添加密码保护教程
  6. JavaScript学习记录总结(四)——js函数的特殊性
  7. css小经验: 转载 - CSS文本溢出省略号:text-overflow:ellipsis
  8. 也谈表达式分析和计算
  9. fedora18 fedora17安装显卡驱动和网卡驱动
  10. UA PHYS515 电磁理论II 静电场问题3 边值问题及其解的唯一性