谁再说学不会 MySQL 数据库,就把这个给他扔过去

Posted Java云海.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了谁再说学不会 MySQL 数据库,就把这个给他扔过去相关的知识,希望对你有一定的参考价值。

又是新的一年奋斗路的开启,相信有不少人农历新年之后,肯定会有所变动(跳槽加薪少不了)。所以,我把往期推送过的mysql技术文章做了一个相关的整理,基础不好的可以从最基础的学习一遍,提高的也可以从中再提取深入一下。

码字不易,如有帮助,请随手 点在看 与 转发朋友圈 支持一下民工哥,关注我,一起学习更多的IT技术知识,共同进步。

数据库是什么

数据库管理系统,简称为DBMS(Database Management System),是用来存储数据的管理系统。

DBMS 的重要性

  • 无法多人共享数据

  • 无法提供操作大量数据所需的格式

  • 实现读取自动化需要编程技术能力

  • 无法应对突发事故

DBMS 的种类

  • 层次性数据库

    • 最古老的数据库之一,因为突出的缺点,所以很少使用了

  • 关系型数据库

    • 采用行列二维表结构来管理数据库,类似Excel的结构,使用专用的SQL语言对数据进行控制。

  • 关系数据库管理系统的常见种类

    • Oracle ==> 甲骨文

    • SQL Servce ==> 微软

    • DB2 ==> IBM

    • PostgreSQL ==> 开源

    • MySQL ==> 开源

  • 面向对象的数据库

    • XML数据库

    • 键值存储系统

    • DB2

    • Redis

    • MongoDB

SQL 语句及其种类

  • DDL(数据定义语言)

    • create ==> 创建数据库或者表等对象

    • drop ==> 删除数据库或者表等对象

    • alter ==> 修改数据库或者表等对象的结构

  • DML(数据操作语言)

    • select ==> 查询表中数据

    • insert ==> 向表中插入数据

    • update ==> 更新表中数据

    • delete ==> 删除表中数据

  • DCL(数据控制语言)

    • commit ==> 决定对数据库中的数据进行变更

    • rollback ==> 取消对数据库中的数据进行变更

    • grant ==> 赋予用户操作权限

    • revoke ==> 取消用户的操作权限

SQL 的基本书写规则

  • SQL 语句要以;结尾

  • 关键字不区分大小写,但是表中数据区分大小写

  • 关键字大写

  • 表名的首字母大写

  • 列明等小写

  • 常数的书写方式是固定的

  • 遇到字符串、日期等类型需要用到''

  • 单词间需要使用空格分割

  • 命名规则

  • 数据库和表的名称可以使用英文、数据以及下划线

  • 名称必须以英文作为开头

  • 名称不能重复

  • 掌握 SQL 这些核心知识点,出去吹牛逼再也不担心了

数据类型

  • integer

    • 数字型,但是不能存放小数

  • char

    • 定长字符串类型,指定最大长度,不足使用空格填充

  • varchar

    • 可变长度字符串类型,指定最大长度,但是不足不填充

  • data

    • 存储日期,年/月/日

以上内容是对通用数据库以及sql语句相关的知识点介绍,本文不做过多的赘述,本文主要针对关系型数据库:MySQL 来进行各方面的知识点总结。

MySQL 数据库简介

MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。

MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

  • MySQL 是开源的,目前隶属于 Oracle 旗下产品。

  • MySQL 支持大型的数据库。可以处理拥有上千万条记录的大型数据库。

  • MySQL 使用标准的 SQL 数据语言形式。

  • MySQL 可以运行于多个系统上,并且支持多种语言。这些编程语言包括 C、C++、Python、Java、Perl、php、Eiffel、Ruby 和 Tcl 等。

  • MySQL 对PHP有很好的支持,PHP 是目前最流行的 Web 开发语言。

  • MySQL 支持大型数据库,支持 5000 万条记录的数据仓库,32 位系统表文件最大可支持 4GB,64 位系统支持最大的表文件为8TB。

  • MySQL 是可以定制的,采用了 GPL 协议,你可以修改源码来开发自己的 MySQL 系统。

在日常工作与学习中,无论是开发、运维、还是测试,对于数据库的学习是不可避免的,同时也是日常工作的必备技术之一。在互联网公司,开源产品线比较多,互联网企业所用的数据库占比较重的还是MySQL。

更多关于MySQL数据库的介绍,有兴趣的读者可以参考官方网站的文档和这篇文章: 可能是全网最好的MySQL重要知识点 ,关于MySQL架构的介绍可以参考: MySQL 架构总览->查询执行流程->SQL 解析顺序

MySQL 安装

MySQL 8正式版8.0.11已发布,官方表示MySQL8要比MySQL 5.7快2倍,还带来了大量的改进和更快的性能!到底谁最牛呢?请看: MySQL 5.7 vs 8.0,哪个性能更牛?

详细的安装步骤请参阅: CentOS 下 MySQL 8.0 安装部署,超详细! ,介绍几个 8.0 在关系数据库方面的主要新特性: MySQL 8.0 的 5 个新特性,太实用了!

MySQL基础入门操作

Windows服务

-- 启动MySQL
net start mysql

-- 创建Windows服务
sc create mysql binPath= mysqld_bin_path(注意:等号与值之间有空格)

连接与断开服务器

mysql -h 地址 -P 端口 -u 用户名 -p 密码

SHOW PROCESSLIST -- 显示哪些线程正在运行
SHOW VARIABLES -- 显示系统变量信息

数据库操作

-- 查看当前数据库
SELECT DATABASE();

-- 显示当前时间、用户名、数据库版本
SELECT now(), user(), version();

-- 创建库
CREATE DATABASE[ IF NOT EXISTS] 数据库名 数据库选项
    数据库选项:
        CHARACTER SET charset_name
        COLLATE collation_name

-- 查看已有库
    SHOW DATABASES[ LIKE 'PATTERN']

-- 查看当前库信息
    SHOW CREATE DATABASE 数据库名

-- 修改库的选项信息
    ALTER DATABASE 库名 选项信息

-- 删除库
    DROP DATABASE[ IF EXISTS] 数据库名
        同时删除该数据库相关的目录及其目录内容

表的操作

-- 创建表
CREATE [TEMPORARY] TABLE[ IF NOT EXISTS] [库名.]表名 ( 表的结构定义 )[ 表选项]
每个字段必须有数据类型
最后一个字段后不能有逗号
TEMPORARY 临时表,会话结束时表自动消失
对于字段的定义:
   字段名 数据类型 [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY] [COMMENT 'string']
-- 表选项
  -- 字符集
  CHARSET = charset_name
  如果表没有设定,则使用数据库字符集
  -- 存储引擎
  ENGINE = engine_name
  表在管理数据时采用的不同的数据结构,结构不同会导致处理方式、提供的特性操作等不同
  常见的引擎:InnoDB MyISAM Memory/Heap BDB Merge Example CSV MaxDB Archive
  不同的引擎在保存表的结构和数据时采用不同的方式
  MyISAM表文件含义:.frm表定义,.MYD表数据,.MYI表索引
  InnoDB表文件含义:.frm表定义,表空间数据和日志文件
  SHOW ENGINES -- 显示存储引擎的状态信息
  SHOW ENGINE 引擎名 LOGS|STATUS -- 显示存储引擎的日志或状态信息
    -- 自增起始数
        AUTO_INCREMENT = 行数
    -- 数据文件目录
        DATA DIRECTORY = '目录'
    -- 索引文件目录
        INDEX DIRECTORY = '目录'
    -- 表注释
        COMMENT = 'string'
    -- 分区选项
        PARTITION BY ... (详细见手册)

-- 查看所有表
SHOW TABLES[ LIKE 'pattern']
SHOW TABLES FROM 表名

-- 查看表机构
SHOW CREATE TABLE 表名 (信息更详细)
DESC 表名 / DESCRIBE 表名 / EXPLAIN 表名 / SHOW COLUMNS FROM 表名 [LIKE 'PATTERN']
SHOW TABLE STATUS [FROM db_name] [LIKE 'pattern']

-- 修改表
   -- 修改表本身的选项
    ALTER TABLE 表名 表的选项
    eg: ALTER TABLE 表名 ENGINE=MYISAM;
    -- 对表进行重命名
    RENAME TABLE 原表名 TO 新表名
    RENAME TABLE 原表名 TO 库名.表名 (可将表移动到另一个数据库)
    -- RENAME可以交换两个表名
    -- 修改表的字段机构(13.1.2. ALTER TABLE语法)
       ALTER TABLE 表名 操作名
       -- 操作名
          ADD[ COLUMN] 字段定义       -- 增加字段
            AFTER 字段名          -- 表示增加在该字段名后面
            FIRST               -- 表示增加在第一个
            ADD PRIMARY KEY(字段名)   -- 创建主键
            ADD UNIQUE [索引名] (字段名)-- 创建唯一索引
            ADD INDEX [索引名] (字段名) -- 创建普通索引
            DROP[ COLUMN] 字段名      -- 删除字段
            MODIFY[ COLUMN] 字段名 字段属性     -- 支持对字段属性进行修改,不能修改字段名(所有原有属性也需写上)
            CHANGE[ COLUMN] 原字段名 新字段名 字段属性      -- 支持对字段名修改
            DROP PRIMARY KEY    -- 删除主键(删除主键前需删除其AUTO_INCREMENT属性)
            DROP INDEX 索引名 -- 删除索引
            DROP FOREIGN KEY 外键    -- 删除外键
-- 删除表
    DROP TABLE[ IF EXISTS] 表名 ...

-- 清空表数据
    TRUNCATE [TABLE] 表名

-- 复制表结构
    CREATE TABLE 表名 LIKE 要复制的表名

-- 复制表结构和数据
    CREATE TABLE 表名 [AS] SELECT * FROM 要复制的表名

-- 检查表是否有错误
    CHECK TABLE tbl_name [, tbl_name] ... [option] ...

-- 优化表
   OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...

-- 修复表
   REPAIR [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... [QUICK] [EXTENDED] [USE_FRM]

-- 分析表
   ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...

更多相关的操作基础知识点请参阅以下文章:

MySQL 多实例配置

MySQL数据库入门——多实例配置

MySQL 主从同步复制

复制概述

Mysql内建的复制功能是构建大型,高性能应用程序的基础。将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的。复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。

请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。 mysql支持的复制类型:

  • L默认采用基于语句的复制,效率比较高。一旦发现没法精确复制时,   会自动选着基于行的复制。

  • l5.0开始支持

  • 采用基于行的复制。

复制解决的问题

MySQL复制技术有以下一些特点:

  • 数据分布 (Data distribution )

  • 负载平衡(load balancing)

  • 备份(Backups)

  • 高可用性和容错行 High availability and failover

复制如何工作

整体上来说,复制有3个步骤:

  • master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);

  • slave将master的binary log events拷贝到它的中继日志(relay log);

  • slave重做中继日志中的事件,将改变反映它自己的数据。

更多相关的更深入的介绍参考: Mysql主从架构的复制原理及配置详解

MySQL 复制有两种方法:

MySQL复制有多种类型:

  • 异步复制:一个主库,一个或多个从库,数据异步同步到从库。

  • 同步复制:在MySQL Cluster中特有的复制方式。

  • 半同步复制:在异步复制的基础上,确保任何一个主库上的事务在提交之前至 少有一个从库已经收到该事务并日志记录下来。

  • 延迟复制:在异步复制的基础上,人为设定主库和从库的数据同步延迟时间, 即保证数据延迟至少是这个参数。

MySQL主从复制延迟解决方案: 高可用数据库主从复制延时的解决方案

MySQL 数据备份与恢复

数据备份多种方式:

  • 物理备份是指通过拷贝数据库文件的方式完成备份,这种备份方式适用于数据库很大,数据重要且需要快速恢复的数据库

  • 逻辑备份是指通过备份数据库的逻辑结构(create database/table语句)和数据内容(insert语句或者文本文件)的方式完成备份。这种备份方式适用于数据库不是很大,或者你需要对导出的文件做一定的修改,又或者是希望在另外的不同类型服务器上重新建立此数据库的情况

  • 通常情况下物理备份的速度要快于逻辑备份,另外物理备份的备份和恢复粒度范围为整个数据库或者是单个文件。对单表是否有恢复能力取决于存储引擎,比如在MyISAM存储引擎下每个表对应了独立的文件,可以单独恢复;但对于InnoDB存储引擎表来说,可能每个表示对应了独立的文件,也可能表使用了共享数据文件

  • 物理备份通常要求在数据库关闭的情况下执行,但如果是在数据库运行情况下执行,则要求备份期间数据库不能修改

  • 逻辑备份的速度要慢于物理备份,是因为逻辑备份需要访问数据库并将内容转化成逻辑备份需要的格式;通常输出的备份文件大小也要比物理备份大;另外逻辑备份也不包含数据库的配置文件和日志文件内容;备份和恢复的粒度可以是所有数据库,也可以是单个数据库,也可以是单个表;逻辑备份需要再数据库运行的状态下执行;它的执行工具可以是mysqldump或者是select … into outfile两种方式

  • 生产数据库备份方案: 高逼格企业级MySQL数据库备份方案

  • MySQL数据库物理备份方式: Xtrabackup实现数据的备份与恢复

  • MySQL 定时备份: MySQL 数据库定时备份的几种方式(非常全面)

MySQL 高可用架构设计与实战

先来了解一下MySQL高可用架构简介: 浅谈MySQL集群高可用架构

MySQL高可用方案: MySQL 同步复制及高可用方案总结

官方也提供一种高可用方案: 官方工具|MySQL Router 高可用原理与实战

MHA

  • MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点。

  • MHA Manager: 可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。

  • MHA Node: 行在每台MySQL服务器上。

  • MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。

MHA高可用方案实战: MySQL集群高可用架构之MHA

MGR

  • Mysql Group Replication(MGR)是从5.7.17版本开始发布的一个全新的高可用和高扩张的MySQL集群服务。

  • 高一致性,基于原生复制及paxos协议的组复制技术,以插件方式提供一致数据安全保证;

  • 高容错性,大多数服务正常就可继续工作,自动不同节点检测资源征用冲突,按顺序优先处理,内置动防脑裂机制;

  • 高扩展性,自动添加移除节点,并更新组信息;

  • 高灵活性,单主模式和多主模式。单主模式自动选主,所有更新操作在主进行;多主模式,所有server同时更新。

MySQL 数据库读写分离高可用

海量数据的存储和访问成为了系统设计的瓶颈问题,日益增长的业务数据,无疑对数据库造成了相当大的负载,同时对于系统的稳定性和扩展性提出很高的要求。随着时间和业务的发展,数据库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作的开销也会越来越大;另外,无论怎样升级硬件资源,单台服务器的资源(CPU、磁盘、内存、网络IO、事务数、连接数)总是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。分表、分库和读写分离可以有效地减小单台数据库的压力。

MySQL读写分离高可用架构实战案例:

ProxySQL+Mysql实现数据库读写分离实战

Mysql+Mycat实现数据库主从同步与读写分离

MySQL性能优化

史上最全的MySQL高性能优化实战总结!

MySQL索引原理: MySQL 的索引是什么?怎么优化?

  • 顾名思义,B-tree索引使用B-tree的数据结构存储数据,不同的存储引擎以不同的方式使用B-Tree索引,比如MyISAM使用前缀压缩技术使得索引空间更小,而InnoDB则按照原数据格式存储,且MyISAM索引在索引中记录了对应数据的物理位置,而InnoDB则在索引中记录了对应的主键数值。B-Tree通常意味着所有的值都是按顺序存储,并且每个叶子页到根的距离相同。

  • B-Tree索引驱使存储引擎不再通过全表扫描获取数据,而是从索引的根节点开始查找,在根节点和中间节点都存放了指向下层节点的指针,通过比较节点页的值和要查找值可以找到合适的指针进入下层子节点,直到最下层的叶子节点,最终的结果就是要么找到对应的值,要么找不到对应的值。整个B-tree树的深度和表的大小直接相关。

  • 全键值匹配:和索引中的所有列都进行匹配,比如查找姓名为zhang san,出生于1982-1-1的人

  • 匹配最左前缀:和索引中的最左边的列进行匹配,比如查找所有姓为zhang的人

  • 匹配列前缀:匹配索引最左边列的开头部分,比如查找所有以z开头的姓名的人

  • 匹配范围值:匹配索引列的范围区域值,比如查找姓在li和wang之间的人

  • 精确匹配左边列并范围匹配右边的列:比如查找所有姓为Zhang,且名字以K开头的人

  • 只访问索引的查询:查询结果完全可以通过索引获得,也叫做覆盖索引,比如查找所有姓为zhang的人的姓名

  • MySQL 常用30种SQL查询语句优化方法 |

  • MySQL太慢?试试这些诊断思路和工具

  • MySQL 性能优化的 9 种姿势,面试再也不怕了!

MySQL表分区介绍: 一文彻底搞懂MySQL分区

  • 可以允许在⼀个表⾥存储更多的数据,突破磁盘限制或者⽂件系统限制。

  • 对于从表⾥将过期或历史的数据移除在表分区很容易实现,只要将对应的分区移除即可

  • 对某些查询和修改语句来说,可以⾃动将数据范围缩⼩到⼀个或⼏个表分区上,优化语句执⾏效率。⽽且可以通过显示指定表分区来执⾏语句,⽐如 select * from temp partition(p1,p2) where store_id < 5;

  • 表分区是将⼀个表的数据按照⼀定的规则⽔平划分为不同的逻辑块,并分别进⾏物理存储,这个规则就叫做分区函数,可以有不同的分区规则。

  • MySQL5.7版本可以通过show plugins语句查看当前MySQL是否⽀持表分区功能。

  • MySQL8.0版本移除了show plugins⾥对partition的显示,但社区版本的表分区功能是默认开启的。

  • 但当表中含有主键或唯⼀键时,则每个被⽤作分区函数的字段必须是表中唯⼀键和主键的全部或⼀部分,否则就⽆法创建分区表。

MySQL分库分表

  • 能不分就不分,1000万以内的表,不建议分片,通过合适的索引,读写分离等方式,可以很好的解决性能问题。

  • 分片数量尽量少,分片尽量均匀分布在多个DataHost上,因为一个查询SQL跨分片越多,则总体性能越差,虽然要好于所有数据在一个分片的结果,只在必要的时候进 行扩容,增加分片数量。

  • 分片规则需要慎重选择,分片规则的选择,需要考虑数据的增长模式,数据的访 问模式,分片关联性问题,以及分片扩容问题,最近的分片策略为范围分片,枚举分片, 一致性Hash分片,这几种分片都有利于扩容。

  • 尽量不要在一个事务中的SQL跨越多个分片,分布式事务一直是个不好处理的问题。

  • 查询条件尽量优化,尽量避免Select * 的方式,大量数据结果集下,会消耗大量 带宽和CPU资源,查询尽量避免返回大量结果集,并且尽量为频繁使用的查询语句建立索引。

数据库分库分表概述: 数据库分库分表,何时分?怎样分?

Mysql分库分表方案: MySQL 分库分表方案,总结的非常好!

Mysql分库分表的思路: 解救 DBA—数据库分库分表思路及案例分析

MySQL性能监控

MySQL性能监控的指标大体可以分为以下4大类:

  • 查询吞吐量

  • 查询延迟与错误

  • 客户端连接与错误

  • 缓冲池利用率

对于MySQL性能监控,官方也提供了相关的服务插件:MySQL-Percona,下面简单介绍一下插件的安装

[root@db01 ~]# yum -y install php php-mysql
[root@db01 ~]# wget https://www.percona.com/downloads/percona-monitoring-plugins/percona-monitoring-plugins-1.1.8/binary/redhat/7/x86_64/percona-zabbix-templates-1.1.8-1.noarch.rpm
[root@db01 ~]# rpm -ivh percona-zabbix-templates-1.1.8-1.noarch.rpm
warning: percona-zabbix-templates-1.1.8-1.noarch.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
Preparing... ################################# [100%]
Updating / installing...
   1:percona-zabbix-templates-1.1.8-1 ################################# [100%]

Scripts are installed to /var/lib/zabbix/percona/scripts
Templates are installed to /var/lib/zabbix/percona/templates

最后,可以配合其它监控工具来实现对MySQL的性能监控。

MySQL服务器配置插件:

  • 修改php脚本连接MySQL的monitor@localhost用户

  • 修改MySQL的sock文件路径

[root@db01 ~]# sed -i '30c $mysql_user = "monitor";' /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php
[root@db01 ~]# sed -i '31c $mysql_pass = "123456";' /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php
[root@db01 ~]# sed -i '33c $mysql_socket = "/tmp/mysql.sock";' /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php

测试是否可用( 可以从MySQL中获取到监控值 )

[root@db01 ~]# /usr/bin/php -q /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php --host localhost --items gg
gg:12

# 确保当前文件的 属主 属组 是zabbix,否则zabbix监控取值错误。
[root@db01 ~]# ll -sh /tmp/localhost-mysql_cacti_stats.txt
4.0K -rw-rw-r-- 1 zabbix zabbix 1.3K Dec 5 17:34 /tmp/localhost-mysql_cacti_stats.txt

移动zabbix-agent配置文件到 /etc/zabbix/zabbix_agentd.d/目录

[root@db01 ~]# mv /var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf /etc/zabbix/zabbix_agentd.d/
[root@db01 ~]# systemctl restart zabbix-agent.service

导入并配置Zabbix模板与主机:

默认模板监控时间为 5分钟 ( 当前测试修改为 30s) 同时也要修改Zabbix模板时间

# 如果要修改监控获取值的时间不但要在zabbix面板修改取值时间,bash脚本也要修改。
[root@db01 scripts]# sed -n '/TIMEFLM/p' /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh
TIMEFLM=`stat -c %Y /tmp/$HOST-mysql_cacti_stats.txt`
if [ `expr $TIMENOW - $TIMEFLM` -gt 300 ]; then   
# 这个 300 代表 300s 同时也要修改。

默认模板版本为2.0.9,无法在4.0版本使用,可以先从3.0版本导出,然后再导入4.0版本 。

Zabbix自带模板监控MySQL服务

其实,在实际生产过程中,还是有相关的专业监控数据库的第三方开源软件的,民工哥之前也写过相关的文章,今天发出来供大家参考: 强大的开源企业级数据库监控利器Lepus

MySQL 管理工具

MySQL 是最广泛使用和流行的开源数据库之一,围绕它有许多工具,可以让设计,创建和管理数据库的过程变得更加容易和便捷。但是如何选择最适合自己需求的工具,并不容易。这里为大家推荐:10款MySQL的GUI工具,它们对开发人员和DBA来说都是不错的解决方案。

很早之前民工哥就给大家介绍过一款开源的SQL管理工具: 自动补全、回滚!介绍一款可视化 sql 诊断利器 。

今天,民工哥再给大家推荐一款SQL审核利器: MySQL 自动化运维工具 goinception 。

可视化管理工具,大家可以试试这个: 介绍一款免费好用的可视化数据库管理工具

俗话说工欲善其事,必先利其器,定期对你的MYSQL数据库进行一个体检,是保证数据库安全运行的重要手段,因为,好的工具是使你的工作效率倍增!

今天和大家分享几个mysql 优化的工具,你可以使用它们对你的mysql进行一个体检,生成awr报告,让你从整体上把握你的数据库的性能情况。

性能优化诊断工具: 别小看这几个工具!关键时能帮你快速解决数据库瓶颈

MySQL 常见错误代码说明

先给大家看几个实例的错误分析与解决方案。

  • 1.ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/data/mysql/mysql.sock'

问题分析:可能是数据库没有启动或者是端口被防火墙禁止。

解决方法:启动数据库或者防火墙开放数据库监听端口。

  • 2.ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

问题分析:密码不正确或者没有权限访问。

解决方法:

1)修改 my.cnf 主配置文件,在[mysqld]下添加 skip-grant-tables,重启数据库。最后修改密码命令如下:

mysql> use mysql;
mysql> update user set password=password("123456") where user="root";

再删除刚刚添加的 skip-grant-tables 参数,再重启数据库,使用新密码即可登录。

2)重新授权,命令如下:

mysql> grant all on *.* to 'root'@'mysql-server' identified by '123456';
  • 3.客户端报 Too many connections

问题分析:连接数超出 Mysql 的最大连接限制。

解决方法:

  • 1、在 my.cnf 配置文件里面增加连接数,然后重启 MySQL 服务。max_connections = 10000

  • 2、临时修改最大连接数,重启后不生效。需要在 my.cnf 里面修改配置文件,下次重启生效。

set GLOBAL max_connections=10000;
  • 4.Warning: World-writable config file '/etc/my.cnf' is ignored ERROR! MySQL is running but PID file could not be found

问题分析:MySQL 的配置文件/etc/my.cnf 权限不对。

解决方法:

chmod 644 /et/my.cnf
  • 5.InnoDB: Error: page 14178 log sequence number 29455369832 InnoDB: is in the future! Current system log sequence number 29455369832

问题分析:innodb 数据文件损坏。

解决方法:修改 my.cnf 配置文件,在 [mysqld] 下添加 innodb_force_recovery=4 , 启动数据库后备份数据文件,然后去掉该参数,利用备份文件恢复数据。

  • 6.从库的 Slave_IO_Running 为 NO

问题分析:主库和从库的 server-id 值一样.

解决方法:修改从库的 server-id 的值,修改为和主库不一样,比主库低。修改完后重启,再同步即可!

  • 7.从库的 Slave_IO_Running 为 NO问题

问题分析:造成从库线程为 NO 的原因会有很多,主要原因是主键冲突或者主库删除或更新数据, 从库找不到记录,数据被修改导致。通常状态码报错有 1007、1032、1062、1452 等。

解决方法一:

mysql> stop slave;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> start slave;

解决方法二:设置用户权限,设置从库只读权限

set global read_only=true;
8.Error initializing relay log position: I/O error reading the header from the binary log

分析问题:从库的中继日志 relay-bin 损坏. 解决方法:手工修复,重新找到同步的 binlog 和 pos 点,然后重新同步即可。

mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.xxx',MASTER_LOG_POS=xxx; 

维护过MySQL的运维或DBA都知道,经常会遇到的一些错误信息中有一些类似10xx的代码。

Replicate_Wild_Ignore_Table:
         Last_Errno: 1032
         Last_Error: Could not execute Update_rows event on table xuanzhi.test; Can't find record in 'test', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000004, end_log_pos 3704

但是,如果不深究或者之前遇到过,还真不太清楚,这些代码具体的含义是什么?这也给我们排错造成了一定的阻碍。

所以,今天民工哥就把主从同步过程中一些常见的错误代码,它的具体说明给大家整理出来了: 建议收藏备查!MySQL 常见错误代码说明

MySQL 开发规范与使用技巧

命名规范

  • 1.库名、表名、字段名必须使用小写字母,并采用下划线分割。

    • a)MySQL有配置参数lower_case_table_names,不可动态更改,Linux系统默认为 0,即库表名以实际情况存储,大小写敏感。如果是1,以小写存储,大小写不敏感。如果是2,以实际情况存储,但以小写比较。

    • b)如果大小写混合使用,可能存在abc,Abc,ABC等多个表共存,容易导致混乱。

    • c)字段名显示区分大小写,但实际使⽤用不区分,即不可以建立两个名字一样但大小写不一样的字段。

    • d)为了统一规范, 库名、表名、字段名使用小写字母。

  • 2.库名、表名、字段名禁止超过32个字符。

    • 库名、表名、字段名支持最多64个字符,但为了统一规范、易于辨识以及减少传输量,禁止超过32个字符。

  • 3.使用INNODB存储引擎。

    • INNODB引擎是MySQL5.5版本以后的默认引擘,支持事务、行级锁,有更好的数据恢复能力、更好的并发性能,同时对多核、大内存、SSD等硬件支持更好,支持数据热备份等,因此INNODB相比MyISAM有明显优势。

  • 4.库名、表名、字段名禁止使用MySQL保留字。

    • 当库名、表名、字段名等属性含有保留字时,SQL语句必须用反引号引用属性名称,这将使得SQL语句书写、SHELL脚本中变量的转义等变得⾮非常复杂。

  • 5.禁止使用分区表。

    • 分区表对分区键有严格要求;分区表在表变大后,执⾏行DDL、SHARDING、单表恢复等都变得更加困难。因此禁止使用分区表,并建议业务端手动SHARDING。

  • 6.建议使用UNSIGNED存储非负数值。

    • 同样的字节数,非负存储的数值范围更大。如TINYINT有符号为 -128-127,无符号为0-255。

  • 7.建议使用INT UNSIGNED存储IPV4。

    • 用UNSINGED INT存储IP地址占用4字节,CHAR(15)则占用15字节。另外,计算机处理整数类型比字符串类型快。使用INT UNSIGNED而不是CHAR(15)来存储IPV4地址,通过MySQL函数inet_ntoa和inet_aton来进行转化。IPv6地址目前没有转化函数,需要使用DECIMAL或两个BIGINT来存储。

例如:

SELECT INET_ATON('209.207.224.40'); 3520061480SELECT INET_NTOA(3520061480);
209.207.224.40
  • 8.强烈建议使用TINYINT来代替ENUM类型。

    • ENUM类型在需要修改或增加枚举值时,需要在线DDL,成本较高;ENUM列值如果含有数字类型,可能会引起默认值混淆。

  • 9.使用VARBINARY存储大小写敏感的变长字符串或二进制内容。

    • VARBINARY默认区分大小写,没有字符集概念,速度快。

  • 10.INT类型固定占用4字节存储

    • 例如INT(4)仅代表显示字符宽度为4位,不代表存储长度。数值类型括号后面的数字只是表示宽度而跟存储范围没有关系,比如INT(3)默认显示3位,空格补齐,超出时正常显示,Python、Java客户端等不具备这个功能。

  • 11.区分使用DATETIME和TIMESTAMP。

    • 存储年使用YEAR类型。存储日期使用DATE类型。存储时间(精确到秒)建议使用TIMESTAMP类型。

    • DATETIME和TIMESTAMP都是精确到秒,优先选择TIMESTAMP,因为TIMESTAMP只有4个字节,而DATETIME8个字节。同时TIMESTAMP具有自动赋值以及⾃自动更新的特性。注意:在5.5和之前的版本中,如果一个表中有多个timestamp列,那么最多只能有一列能具有自动更新功能。

如何使用TIMESTAMP的自动赋值属性?

a)自动初始化,而且自动更新:
column1 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATECURRENT_TIMESTAMP

b)只是自动初始化:
column1 TIMESTAMP DEFAULT CURRENT_TIMESTAMP

c)自动更新,初始化的值为0:
column1 TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP

d)初始化的值为0:
column1 TIMESTAMP DEFAULT 0
  • 12.索引字段均定义为NOT NULL。

    • a)对表的每一行,每个为NULL的列都需要额外的空间来标识。

    • b)B树索引时不会存储NULL值,所以如果索引字段可以为NULL,索引效率会下降。

    • c)建议用0、特殊值或空串代替NULL值。

详细的可参阅以下文章

MySQL 高频企业面试题

学好知识,当然就得去面试,进大厂,拿高薪。但是进入面试之前,必要的准备是必须的,刷题是其中之一。

Linux运维必会的100道MySql面试题之(一)

Linux运维必会的100道MySql面试题之(二)

Linux运维必会的100道MySql面试题之(三)

Linux运维必会的100道MySql面试题之(四)

以下内容主要受众为开发人员,所以不涉及到MySQL的服务部署等操作,且内容较多,大家准备好耐心和瓜子矿泉水.

前一阵系统的学习了一下MySQL,也有一些实际操作经验,偶然看到一篇和MySQL相关的面试文章,发现其中的一些问题自己也回答不好,虽然知识点大部分都知道,但是无法将知识串联起来.

因此决定搞一个MySQL灵魂100问,试着用回答问题的方式,让自己对知识点的理解更加深入一点.

此文不会事无巨细的从select的用法开始讲解mysql,主要针对的是开发人员需要知道的一些MySQL的知识点,主要包括索引,事务,优化等方面,以在面试中高频的问句形式给出答案.

MySQL用户行为安全

  • 假设这么一个情况,你是某公司mysql-DBA,某日突然公司数据库中的所有被人为删了。

  • 尽管有数据备份,但是因服务停止而造成的损失上千万,现在公司需要查出那个做删除操作的人。

  • 但是拥有数据库操作权限的人很多,如何排查,证据又在哪?

  • 是不是觉得无能为力?

  • mysql本身并没有操作审计的功能,那是不是意味着遇到这种情况只能自认倒霉呢?

谁再说不熟悉 Linux 命令,就把这个给他扔过去

基本操作

Linux 关机,重启

# 关机
shutdown -h now

# 重启
shutdown -r now

查看系统,CPU信息

# 查看系统内核信息
uname -a

# 查看系统内核版本
cat /proc/version

# 查看当前用户环境变量
env

cat /proc/cpuinfo

# 查看有几个逻辑cpu, 包括cpu型号
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c

# 查看有几颗cpu,每颗分别是几核
cat /proc/cpuinfo | grep physical | uniq -c

# 查看当前CPU运行在32bit还是64bit模式下, 如果是运行在32bit下也不代表CPU不支持64bit
getconf LONG_BIT

# 结果大于0, 说明支持64bit计算. lm指long mode, 支持lm则是64bit
cat /proc/cpuinfo | grep flags | grep ' lm ' | wc -l

建立软连接

ln -s /usr/local/jdk1.8/ jdk

rpm相关

# 查看是否通过rpm安装了该软件
rpm -qa | grep 软件名

sshkey

# 创建sshkey
ssh-keygen -t rsa -C your_email@example.com

#id_rsa.pub 的内容拷贝到要控制的服务器的 home/username/.ssh/authorized_keys 中,如果没有则新建(.ssh权限为700, authorized_keys权限为600)

命令重命名

# 在各个用户的.bash_profile中添加重命名配置
alias ll='ls -alF'

同步服务器时间

sudo ntpdate -u ntp.api.bz

后台运行命令

# 后台运行,并且有nohup.out输出
nohup xxx &

# 后台运行, 不输出任何日志
nohup xxx > /dev/null &

# 后台运行, 并将错误信息做标准输出到日志中 
nohup xxx >out.log 2>&1 &

强制活动用户退出

# 命令来完成强制活动用户退出.其中TTY表示终端名称
pkill -kill -t [TTY]

查看命令路径

which <命令>

查看进程所有打开最大fd数

ulimit -n

配置dns

vim /etc/resolv.conf

nslookup,查看域名路由表

nslookup google.com

last, 最近登录信息列表

# 最近登录的5个账号
last -n 5

设置固定ip

ifconfig em1  192.168.5.177 netmask 255.255.255.0

查看进程内加载的环境变量

# 也可以去 cd /proc 目录下, 查看进程内存中加载的东西
ps eww -p  XXXXX(进程号)

查看进程树找到服务器进程

ps auwxf

查看进程启动路径

cd /proc/xxx(进程号)
ls -all
# cwd对应的是启动路径

添加用户, 配置sudo权限

# 新增用户
useradd 用户名
passwd 用户名

#增加sudo权限
vim /etc/sudoers
# 修改文件里面的
# root    ALL=(ALL)       ALL
# 用户名 ALL=(ALL)       ALL

强制关闭进程名包含xxx的所有进程

ps aux|grep xxx | grep -v grep | awk 'print $2' | xargs kill -9

磁盘,文件,目录相关操作

vim操作

#normal模式下 g表示全局, x表示查找的内容, y表示替换后的内容
:%s/x/y/g

#normal模式下
0  # 光标移到行首(数字0)
$  # 光标移至行尾
shift + g # 跳到文件最后
gg # 跳到文件头

# 显示行号
:set nu

# 去除行号
:set nonu

# 检索
/xxx(检索内容)  # 从头检索, 按n查找下一个
?xxx(检索内容)  # 从尾部检索

打开只读文件,修改后需要保存时(不用切换用户即可保存的方式)

# 在normal模式下
:w !sudo tee %

查看磁盘, 文件目录基本信息

# 查看磁盘挂载情况
mount

# 查看磁盘分区信息
df

# 查看目录及子目录大小
du -H -h

# 查看当前目录下各个文件, 文件夹占了多少空间, 不会递归
du -sh *

wc命令

# 查看文件里有多少行
wc -l filename

# 看文件里有多少个word
wc -w filename

# 文件里最长的那一行是多少个字
wc -L filename

# 统计字节数
wc -c

常用压缩, 解压缩命令

压缩命令

tar czvf xxx.tar 压缩目录

zip -r xxx.zip 压缩目录

解压缩命令

tar zxvf xxx.tar

# 解压到指定文件夹
tar zxvf xxx.tar -C /xxx/yyy/

unzip xxx.zip

变更文件所属用户, 用户组

chown eagleye.eagleye xxx.log

cp, scp, mkdir

#复制
cp xxx.log

# 复制并强制覆盖同名文件
cp -f xxx.log

# 复制文件夹
cp -r xxx(源文件夹) yyy(目标文件夹)

# 远程复制
scp -P ssh端口 username@10.10.10.101:/home/username/xxx /home/xxx

# 级联创建目录
mkdir -p /xxx/yyy/zzz

# 批量创建文件夹, 会在test,main下都创建java, resources文件夹
mkdir -p src/test,main/java,resources

比较两个文件

diff -u 1.txt 2.txt

日志输出的字节数,可以用作性能测试

# 如果做性能测试, 可以每执行一次, 往日志里面输出 “.” , 这样日志中的字节数就是实际的性能测试运行的次数, 还可以看见实时速率.
tail -f xxx.log | pv -bt

查看, 去除特殊字符

# 查看特殊字符
cat -v xxx.sh

# 去除特殊字符
sed -i 's/^M//g’ env.sh  去除文件的特殊字符, 比如^M:  需要这样输入: ctrl+v+enter

处理因系统原因引起的文件中特殊字符的问题

# 可以转换为该系统下的文件格式
cat file.sh > file.sh_bak

# 先将file.sh中文件内容复制下来然后运行, 然后粘贴内容, 最后ctrl + d 保存退出
cat > file1.sh

# 在vim中通过如下设置文件编码和文件格式
:set fileencodings=utf-8 ,然后 w (存盘)一下即可转化为 utf8 格式,
:set fileformat=unix

# 在mac下使用dos2unix进行文件格式化
find . -name "*.sh" | xargs dos2unix

tee, 重定向的同时输出到屏幕

awk ‘print $0’ xxx.log | tee test.log

检索相关

grep(每天学一个 Linux 命令(5):grep)

# 反向匹配, 查找不包含xxx的内容
grep -v xxx

# 排除所有空行
grep -v '^/pre>

# 返回结果 2,则说明第二行是空行
grep -n “^$” 111.txt    

# 查询以abc开头的行
grep -n “^abc” 111.txt 

# 同时列出该词语出现在文章的第几行
grep 'xxx' -n xxx.log

# 计算一下该字串出现的次数
grep 'xxx' -c xxx.log

# 比对的时候,不计较大小写的不同
grep 'xxx' -i xxx.log

awk(每天一个 Linux 命令(4):awk)

# 以':' 为分隔符,如果第五域有user则输出该行
awk -F ':' 'if ($5 ~ /user/) print $0' /etc/passwd 

# 统计单个文件中某个字符(串)(中文无效)出现的次数
awk -v RS='character' 'END print --NR' xxx.txt

find检索命令(每天学一个 Linux 命令(20):find)

# 在目录下找后缀是.mysql的文件
find /home/eagleye -name '*.mysql' -print

# 会从 /usr 目录开始往下找,找最近3天之内存取过的文件。
find /usr -atime 3 –print

# 会从 /usr 目录开始往下找,找最近5天之内修改过的文件。
find /usr -ctime 5 –print

# 会从 /doc 目录开始往下找,找jacky 的、文件名开头是 j的文件。  
find /doc -user jacky -name 'j*' –print

# 会从 /doc 目录开始往下找,找寻文件名是 ja 开头或者 ma开头的文件。
find /doc \\( -name 'ja*' -o- -name 'ma*' \\) –print

#  会从 /doc 目录开始往下找,找到凡是文件名结尾为 bak的文件,把它删除掉。-exec 选项是执行的意思,rm 是删除命令,  表示文件名,“\\;”是规定的命令结尾。 
find /doc -name '*bak' -exec rm  \\;

网络相关

查看什么进程使用了该端口

lsof -i:por

获取本机ip地址

/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk 'print $2'|tr -d "addr:"

iptables

# 查看iptables状态
service iptables status

# 要封停一个ip
iptables -I INPUT -s ***.***.***.*** -j DROP

# 要解封一个IP,使用下面这条命令:
iptables -D INPUT -s ***.***.***.*** -j DROP

备注: 参数-I是表示Insert(添加),-D表示Delete(删除)。后面跟的是规则,INPUT表示入站,***.***.***.***表示要封停的IP,DROP表示放弃连接。

#开启9090端口的访问
/sbin/iptables -I INPUT -p tcp --dport 9090 -j ACCEPT 

# 防火墙开启、关闭、重启
/etc/init.d/iptables status
/etc/init.d/iptables start
/etc/init.d/iptables stop
/etc/init.d/iptables restart

nc命令, tcp调试利器

#给某一个endpoint发送TCP请求,就将data的内容发送到对端
nc 192.168.0.11 8000 < data.txt

#nc可以当做服务器,监听某个端口号,把某一次请求的内容存储到received_data里
nc -l 8000 > received_data

#上边只监听一次,如果多次可以加上-k参数
nc -lk 8000

tcpdump(每天学一个 Linux 命令(72):tcpdump)

# dump出本机12301端口的tcp包
tcpdump -i em1 tcp port 12301 -s 1500 -w abc.pcap

跟踪网络路由路径

# traceroute默认使用udp方式, 如果是-I则改成icmp方式
traceroute -I www.163.com

# 从ttl第3跳跟踪
traceroute -M 3 www.163.com  

# 加上端口跟踪
traceroute -p 8080 192.168.10.11ss
# 显示本地打开的所有端口
ss -l 

# 显示每个进程具体打开的socket ss -pl  # 显示所有tcp socket ss -t -a  # 显示所有的UDP Socekt ss -u -a 

# 显示所有已建立的SMTP连接
ss -o state established '( dport = :smtp or sport = :smtp )'  

# 显示所有已建立的HTTP连接 
ss -o state established '( dport = :http or sport = :http )'  

#找出所有连接X服务器的进程
ss -x src /tmp/.X11-unix/*  

#列出当前socket统计信息
ss -s 

解释:netstat是遍历/proc下面每个PID目录,ss直接读/proc/net下面的统计信息。所以ss执行的时候消耗资源以及消耗的时间都比netstat少很多

netstat

# 输出每个ip的连接数,以及总的各个状态的连接数
netstat -n | awk '/^tcp/ n=split($(NF-1),array,":");if(n<=2)++S[array[(1)]];else++S[array[(4)]];++s[$NF];++N END for(a in S)printf("%-20s %s\\n", a, S[a]);++Iprintf("%-20s %s\\n","TOTAL_IP",I);for(a in s) printf("%-20s %s\\n",a, s[a]);printf("%-20s %s\\n","TOTAL_LINK",N);'

# 统计所有连接状态, 
# CLOSED:无连接是活动的或正在进行
# LISTEN:服务器在等待进入呼叫
# SYN_RECV:一个连接请求已经到达,等待确认
# SYN_SENT:应用已经开始,打开一个连接
# ESTABLISHED:正常数据传输状态
# FIN_WAIT1:应用说它已经完成
# FIN_WAIT2:另一边已同意释放
# ITMED_WAIT:等待所有分组死掉
# CLOSING:两边同时尝试关闭
# TIME_WAIT:主动关闭连接一端还没有等到另一端反馈期间的状态
# LAST_ACK:等待所有分组死掉
netstat -n | awk '/^tcp/ ++state[$NF] END for(key in state) print key,"\\t",state[key]'

# 查找较多time_wait连接
netstat -n|grep TIME_WAIT|awk 'print $5'|sort|uniq -c|sort -rn|head -n20

监控linux性能命令

top

按大写的 F 或 O 键,然后按 a-z 可以将进程按照相应的列进行排序, 然后回车。而大写的 R 键可以将当前的排序倒转。每天学一个 Linux 命令(48):top

PID 进程id
PPID 父进程id
RUSER Real user name
UID 进程所有者的用户id
USER 进程所有者的用户名
GROUP 进程所有者的组名
TTY 启动进程的终端名。不是从终端启动的进程则显示为 ?
PR 优先级
NI nice值。负值表示高优先级,正值表示低优先级
P 最后使用的CPU,仅在多CPU环境下有意义
%CPU 上次更新到现在的CPU时间占用百分比
TIME 进程使用的CPU时间总计,单位秒
TIME+ 进程使用的CPU时间总计,单位1/100秒
%MEM 进程使用的物理内存百分比
VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。
RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
CODE 可执行代码占用的物理内存大小,单位kb
DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
SHR 共享内存大小,单位kb
nFLT 页面错误次数
nDRT 最后一次写入到现在,被修改过的页面数。
S 进程状态。D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程
COMMAND 命令名/命令行
WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名
Flags 任务标志,参考 sched.h

dmesg,查看系统日志

dmesg

iostat,磁盘IO情况监控

iostat -xz 1

# r/s, w/s, rkB/s, wkB/s:分别表示每秒读写次数和每秒读写数据量(千字节)。读写量过大,可能会引起性能问题。
# await:IO操作的平均等待时间,单位是毫秒。这是应用程序在和磁盘交互时,需要消耗的时间,包括IO等待和实际操作的耗时。如果这个数值过大,可能是硬件设备遇到了瓶颈或者出现故障。
# avgqu-sz:向设备发出的请求平均数量。如果这个数值大于1,可能是硬件设备已经饱和(部分前端硬件设备支持并行写入)。
# %util:设备利用率。这个数值表示设备的繁忙程度,经验值是如果超过60,可能会影响IO性能(可以参照IO操作平均等待时间)。如果到达100%,说明硬件设备已经饱和。
# 如果显示的是逻辑设备的数据,那么设备利用率不代表后端实际的硬件设备已经饱和。值得注意的是,即使IO性能不理想,也不一定意味这应用程序性能会不好,可以利用诸如预读取、写缓存等策略提升应用性能。

free,内存使用情况

free -m

eg:

     total       used       free     shared    buffers     cached
Mem:          1002        769        232          0         62        421
-/+ buffers/cache:          286        715
Swap:          1153          0       1153

第一部分Mem行:

total 内存总数: 1002M
used 已经使用的内存数: 769M
free 空闲的内存数: 232M
shared 当前已经废弃不用,总是0
buffers Buffer 缓存内存数: 62M
cached Page 缓存内存数:421M

关系:total(1002M) = used(769M) + free(232M)

第二部分(-/+ buffers/cache):

(-buffers/cache) used内存数:286M (指的第一部分Mem行中的used – buffers – cached)
(+buffers/cache) free内存数: 715M (指的第一部分Mem行中的free + buffers + cached)

可见-buffers/cache反映的是被程序实实在在吃掉的内存,而+buffers/cache反映的是可以挪用的内存总数.

第三部分是指交换分区

sar,查看网络吞吐状态

# sar命令在这里可以查看网络设备的吞吐率。在排查性能问题时,可以通过网络设备的吞吐量,判断网络设备是否已经饱和。

sar -n DEV 1

#
# sar命令在这里用于查看TCP连接状态,其中包括:
# active/s:每秒本地发起的TCP连接数,既通过connect调用创建的TCP连接;
# passive/s:每秒远程发起的TCP连接数,即通过accept调用创建的TCP连接;
# retrans/s:每秒TCP重传数量;
# TCP连接数可以用来判断性能问题是否由于建立了过多的连接,进一步可以判断是主动发起的连接,还是被动接受的连接。TCP重传可能是因为网络环境恶劣,或者服务器压力过大导致丢包
sar -n TCP,ETCP 1

vmstat, 给定时间监控CPU使用率, 内存使用, 虚拟内存交互, IO读写

# 2表示每2秒采集一次状态信息, 1表示只采集一次(忽略既是一直采集)

vmstat 2 1

eg:
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 0 3499840 315836 3819660 0 0 0 1 2 0 0 0 100 0
0 0 0 3499584 315836 3819660 0 0 0 0 88 158 0 0 100 0
0 0 0 3499708 315836 3819660 0 0 0 2 86 162 0 0 100 0
0 0 0 3499708 315836 3819660 0 0 0 10 81 151 0 0 100 0
1 0 0 3499732 315836 3819660 0 0 0 2 83 154 0 0 100 0
  • r 表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。

  • b 表示阻塞的进程,这个不多说,进程阻塞,大家懂的。

  • swpd 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。

  • free 空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。

  • buff Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多M

  • cache cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)

  • si 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。

  • so 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。

  • bi 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒

  • bo 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。

  • in 每秒CPU的中断次数,包括时间中断

  • cs 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。

  • us 用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。

  • sy 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。

  • id 空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。

  • wt 等待IO CPU时间。

以上是关于谁再说学不会 MySQL 数据库,就把这个给他扔过去的主要内容,如果未能解决你的问题,请参考以下文章

谁再说不熟悉 Linux 命令,就把这个给他扔过去

谁再说不熟悉 Linux 命令,就把这个给他扔过去

谁再说不熟悉Linux命令,就把这个给他扔过去!

别再说虚拟 DOM 快了,要被打脸的

如果还有问ARKIME不会部署安装,你就把这篇丢给他!

再有人问你MySQL索引原理,就把这篇文章甩给他!