Mysql

作者: 欧文熙 | 来源:发表于2018-11-15 16:39 被阅读0次

    数据库的分类:

    关系型数据库(是建立在关系模型基础上的数据库):

    Mysql:开放源代码
    MariaDB:Mysql的替代品
    Oracle:闭源
    SQL Server:微软的
    DB2:IBM
    Access:微软公司

    非关系型数据库(与关系型数据库最明显的区别:不再使用SQL作为查询语言):nosql

    MongoDB、Redis、Memcached、hadoop

    Mysql的结构:

    C/S结构:客户端/服务器结构(客户端和服务器端都需要装软件)

    Mysql的三种安装方式:

    1、源码安装:
    (5.5版本之前用的是./configure安装,默认存储引擎是myisam;5.5之后用的是cmake安装,默认引擎是innodb)
    优点:可根据实际环境需求指定编译参数、灵活性好、一台服务器可以安装多个Mysql;
    缺点:安装步骤复杂、编译时间长;
    2、rpm安装
    优点:安装简单;
    缺点:需要单独下载客户端和服务器端,安装路径不灵活,默认路径不能更改,一台服务器只能安装一个;
    3、二进制包安装:
    优点:安装简单,可以安装到任何路径下,灵活性好,一台服务器可以安装多个Mysql;
    缺点:已经编译好,性能不如源码编译

    SQL语句的功能以及分类:

    功能:

    增删改查

    分类:
    DML:数据库操纵语言
      INSERT    插入数据
      DELETE    删除数据
      UPDATE    更新数据
    
    DDL:数据库定义语言(数据库、表、索引、存储过程、函数)
      CREATE    创建
      DROP      删除
      ALTER     修改
    
    DCL:数据库控制语言
      GRANT    授权
      REVOKE   撤销
    
    DQL:数据库查询语言
      SELECT    查询
    

    常用存储引擎

    查看当前数据库软件支持的所有存储引擎命令:

    MariaDB [(none)]> show engines\G;

    innodb:

    在事务上具有优势,即支持提交、回滚及崩溃恢复能力等事务特性,所以比myisam存储引擎占用更多的磁盘空间。当需要频繁更新、删除操作,同时还对事务的完整性要求比较高,需要实现并发控制,建议选择。

    myisam:

    不支持事务、外键,所以访问速度快。当对事务的完整性没有要求并以访问为主的应用适合使用myisam引擎。

    memory:

    memory存储数据的位置是内存,因此访问速度最快,但是在安全上没有保障,适合用于需要快速访问的临时表,重启服务之后,数据丢失。

    innodb支持的事务(dml操作):

    事务满足四个特性:ACID
    A:原子性
    一个事务是一个整体,它里面的操作要么都做,要么都不做。
    C:一致性
    事务开始前和结束后,数据库的完整性约束是一致的。
    I:隔离性、独立性
    两个事务之间是互不相干的。
    D:持久性
    事务完成之后,对数据库的所有更改都会持久的保存在数据中,不会被回滚。

    事务结束的标志:

    1、明确执行commit提交,表示确认更改;
    2、明确执行rollback回滚,表示取消更改;
    3、遇到DDL语句,自动提交。

    二进制日志:

    开启二进制日志:

    (编译安装的一般在mysql/data目录下,yum安装的一般在/var/lib/mysql目录下)
    #vim /etc/my.cnf
    log-bin=log_bin.log //=后面的日志文件名可以自定义
    log-bin-index=log_bin.index

    查看二进制文件:

    #mysqlbinlog log_bin.000001

    使用二进制日志进行数据恢复:

    使用位置点进行恢复:
    #mysqlbinlog --start-position=起始位置点 --stop-position=结束位置点 log_bin.000001 | mysql -u root -p2
    使用事件发生时间:
    #mysqlbinlog --start-datetime=起始时间 --stop-datetime=结束时间 log_bin.000001 | mysql -u root -p2

    查看日志信息:

    MariaDB [(none)]> show master logs;

    查看当前使用的二进制日志文件及所处的位置:

    MariaDB [(none)]> show master status\G;

    查看二进制日志里的操作记录:

    MariaDB [(none)]> show binlog events;

    备份与恢复:

    备份的分类:

    1、根据服务是否在线可分为:
    热备份:读写都不受影响;
    温备份:仅可以执行读操作;
    冷备份:也叫离线备份,读写操作都终止;
    2、根据备份时是否之间复制数据可分为:
    物理备份:直接复制数据文件,速度快;
    逻辑备份:通常是将数据导出到文本 文件中,速度慢、丢失浮点精度,方便使用文本根据直接进行处理,可移植能力强;
    3、根据备份数据内容可分为:
    完全备份:备份全部数据;
    增量备份:仅备份上次完全备份或增量备份之后变化的数据;
    差异备份:仅备份上次完全备份以来变化的数据;

    备份工具:

    mysqldump、lv、innodb、mysqlbackup

    AB复制:

    工作原理:

    1) master上必须开启二进制日志;
    2) slave通过I/O线程向master请求二进制日志文件;
    3) master收到请求后,会从相应的位置点开始向salve传送二进制日志文件;
    4) salve收到二进制日志后,会写入本地的中继日志中;
    5) salve通过sql进程读取中继日志中的内容,然后会在数据库执行相应的操作,最后master和salve的数据一致之后,salve进入等待状态,等待master的更新。

    相关的线程:

    salve:
    I/O线程:负责从主服务器上请求二进制日志文件,并且在收到日志之后写入到本地的中继日志;
    sql线程:负责把中继日志中的操作写入到数据库中;
    master:
    binlog dump线程:负责发送二进制日志文件;

    锁库以及锁表:

    全局锁定只读:flush tables with read lock;
    表级锁定:lock tables 表名 read;
    解锁:unlock tables;

    慢查询:

    显示当前数据库中与版本号相关的东西:
    showvariables like ‘%version%’;

    当前的通用日志查询是否开启,如果general_log的值为ON则为开启,为OFF则为关闭:
    showvariables like ‘%general%’;

    查看当前慢查询日志输出的格式,可以是FILE(存储在数数据库的数据文件中的hostname.log),也可以是TABLE(存储在数据库中的mysql.general_log):
    showvariables like ‘%log_output%’;

    如何开启MySQL通用查询日志,以及如何设置要输出的通用日志输出格式呢:

    开启通用日志查询: set global general_log=on;
    关闭通用日志查询: set globalgeneral_log=off;
    设置通用日志输出为表方式: set
    globallog_output=’TABLE’;
    设置通用日志输出为文件方式: set globallog_output=’FILE’;
    设置通用日志输出为表和文件方式:set global
    log_output=’FILE,TABLE’;
    (注意:上述命令只对当前生效,当MySQL重启失效,如果要永久生效,需要配置my.cnf)

    my.cnf文件的配置如下:
    general_log=1 #为1表示开启通用日志查询,值为0表示关闭通用日志查询
    log_output=FILE,TABLE #设置通用日志的输出格式为文件和表

    如何查看当前慢查询日志的开启情况:

    showvariables like ‘%quer%’;


    image.png

    主要掌握以下的几个参数:

    (1)slow_query_log的值为ON为开启慢查询日志,OFF则为关闭慢查询日志。

    (2)slow_query_log_file 的值是记录的慢查询日志到文件中(注意:默认名为主机名.log,慢查询日志是否写入指定文件中,需要指定慢查询的输出日志格式为文件,相关命令为:show variables like ‘%log_output%’;去查看输出的格式)。

    (3)long_query_time 指定了慢查询的阈值,即如果执行语句的时间超过该阈值则为慢查询语句,默认值为10秒。

    (4)log_queries_not_using_indexes 如果值设置为ON,则会记录所有没有利用索引的查询(注意:如果只是将log_queries_not_using_indexes设置为ON,而将slow_query_log设置为OFF,此时该设置也不会生效,即该设置生效的前提是slow_query_log的值设置为ON),一般在性能调优的时候会暂时开启。

    设置MySQL慢查询的输出日志格式为文件还是表,或者两者都有:

    show variables like ‘%log_output%’;


    image.png
    关于慢查询日志的表中的数据个文本中的数据格式分析:

    慢查询的日志记录myql.slow_log表中,格式如下:


    image.png

    可以看到,不管是表还是文件,都具体记录了:是那条语句导致慢查询(sql_text),该慢查询语句的查询时间(query_time),锁表时间(Lock_time),以及扫描过的行数(rows_examined)等信息。

    如何查询当前慢查询的语句的个数:

    在MySQL中有一个变量专门记录当前慢查询语句的个数:
    输入命令:show global status like ‘%slow%’;


    image.png

    (注意:上述所有命令,如果都是通过MySQL的shell将参数设置进去,如果重启MySQL,所有设置好的参数将失效,如果想要永久的生效,需要将配置参数写入my.cnf文件中)。

    补充知识点:

    如何利用MySQL自带的慢查询日志分析工具mysqldumpslow分析日志?
    perl mysqldumpslow –s c –t 10 slow-query.log
    具体参数设置如下:
    -s 表示按何种方式排序,c、t、l、r分别是按照记录次数、时间、查询时间、返回的记录数来排序,ac、at、al、ar,表示相应的倒叙;
    -t 表示top的意思,后面跟着的数据表示返回前面多少条;
    -g 后面可以写正则表达式匹配,大小写不敏感。


    image.png
    实际在学习过程中,如何得知设置的慢查询是有效的:

    很简单,我们可以手动产生一条慢查询语句,比如,如果我们的慢查询log_query_time的值设置为1,则我们可以执行如下语句:
    select sleep(1);
    该条语句即是慢查询语句,之后,便可以在相应的日志输出文件或表中去查看是否有该条语句。

    相关文章

      网友评论

          本文标题:Mysql

          本文链接:https://www.haomeiwen.com/subject/djmyfqtx.html