Mysql数据库初笔记

  • 更新时间:
  • 3858人关注
  • 点击下载

这是一个不错的Mysql笔记类学习资源,由国元明提供,主要知识点是关于Mysql、数据库、Mysql笔记、Mysql笔记的内容,已被189人关注,同类资源中评分为9.1分。

资源详情相关推荐
  • 大小:50 KB
  • 类别:Mysql笔记
  • 格式:PDF
  • 编辑:通筱雪
  • 热度:726
  • PHP+MySQL动态网站开发从入门到精通
  • 高性能MySQL
  • MySQL入门经典
  • WEB开发圣经:PHP和MySQL Web开发
  • MySQL 8从入门到精通
  • 精选笔记:MySQL笔记之触发器的应用

    8小时12分钟前回答

    创建触发器

    创建只有一个执行语句的触发器


    CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件
    ON 表名 FOR EACH ROW 执行语句

    其中,触发器名参数指要创建的触发器的名字

    BEFORE和AFTER参数指定了触发执行的时间,在事件之前或是之后

    FOR EACH ROW表示任何一条记录上的操作满足触发事件都会触发该触发器


    mysql> CREATE TRIGGER trig1 AFTER INSERT
        -> ON work FOR EACH ROW
        -> INSERT INTO time VALUES(NOW());
    Query OK, 0 rows affected (0.09 sec)

    上面创建了一个名为trig1的触发器,一旦在work中有插入动作,就会自动往time表里插入当前时间


    创建有多个执行语句的触发器


    CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件
    ON 表名 FOR EACH ROW
    BEGIN
        执行语句列表
    END

    其中,BEGIN与END之间的执行语句列表参数表示需要执行的多个语句,不同语句用分号隔开

    tips:一般情况下,mysql默认是以 ; 作为结束执行语句,与触发器中需要的分行起冲突

         为解决此问题可用DELIMITER,如:DELIMITER ||,可以将结束符号变成||

         当触发器创建完成后,可以用DELIMITER ;来将结束符号变成;


    mysql> DELIMITER ||
    mysql> CREATE TRIGGER trig2 BEFORE DELETE
        -> ON work FOR EACH ROW
        -> BEGIN
        -> INSERT INTO time VALUES(NOW());
        -> INSERT INTO time VALUES(NOW());
        -> END
        -> ||
    Query OK, 0 rows affected (0.06 sec)

    mysql> DELIMITER ;


    上面的语句中,开头将结束符号定义为||,中间定义一个触发器,一旦有满足条件的删除操作

    就会执行BEGIN和END中的语句,接着使用||结束

    最后使用DELIMITER ; 将结束符号还原


    查看触发器
    SHOW TRIGGERS语句查看触发器信息


    mysql> SHOW TRIGGERS\G;
    *************************** 1. row ***************************
                 Trigger: trig1
                   Event: INSERT
                   Table: work
               Statement: INSERT INTO time VALUES(NOW())
                  Timing: AFTER
                 Created: NULL
                sql_mode:
                 Definer: root@localhost
    character_set_client: utf8
    collation_connection: utf8_general_ci
      Database Collation: latin1_swedish_ci

    结果会显示所有触发器的基本信息

    tips:SHOW TRIGGERS语句无法查询指定的触发器


    在triggers表中查看触发器信息


    mysql> SELECT * FROM information_schema.triggers\G
    *************************** 1. row ***************************
               TRIGGER_CATALOG: def
                TRIGGER_SCHEMA: person
                  TRIGGER_NAME: trig1
            EVENT_MANIPULATION: INSERT
          EVENT_OBJECT_CATALOG: def
           EVENT_OBJECT_SCHEMA: person
            EVENT_OBJECT_TABLE: work
                  ACTION_ORDER: 0
              ACTION_CONDITION: NULL
              ACTION_STATEMENT: INSERT INTO time VALUES(NOW())

    结果显示了所有触发器的详细信息,同时,该方法可以查询制定触发器的详细信息

    mysql> SELECT * FROM information_schema.triggers WHERE TRIGGER_NAME='trig1'\G
    *************************** 1. row ***************************
               TRIGGER_CATALOG: def
                TRIGGER_SCHEMA: person
                  TRIGGER_NAME: trig1
            EVENT_MANIPULATION: INSERT
          EVENT_OBJECT_CATALOG: def
           EVENT_OBJECT_SCHEMA: person
            EVENT_OBJECT_TABLE: work

    tips:所有触发器信息都存储在information_schema数据库下的triggers表中

         可以使用SELECT语句查询,如果触发器信息过多,最好通过TRIGGER_NAME字段指定查询


    删除触发器


    mysql> DROP TRIGGER trig1;
    Query OK, 0 rows affected (0.04 sec)

    删除触发器之后最好使用上面的方法查看一遍

    同时,也可以使用database.trig来指定某个数据库中的触发器

    tips:如果不需要某个触发器时一定要将这个触发器删除,以免造成意外操作

    展开阅读
    精选笔记:MySQL故障切换笔记之应用无感知设计详解

    2小时32分钟前回答

    1. 简介

    大家都知道,在数据库中间件读写分离应用场景中,如何保证底层数据库出现故障节点的时,中间件可以快速断开或迁移数据库连接,让用户无感知。

    在MySQL数据库中,提供了一个session_track_transaction_info参数来提供解决方案。

    因为官方文档上没有对该参数的说明,本文专门介绍该参数的可选值并验证了实际的影响。下面话不多说了,来随着小编一起看看详细的介绍吧

    2. session_track_transaction_info参数

    2.1 参数介绍

    MySQL5.7中,可以通过设置session_track_transaction_info变量来跟踪事务的状态。

    • 该参数存在global以及session两个级别,可以动态修改。
    • 该参数可以设置的值为0(默认OFF),1,2
    /**
     Transaction tracking level
    */
    enum enum_session_track_transaction_info {
     TX_TRACK_NONE = 0, ///< do not send tracker items on transaction info
     TX_TRACK_STATE = 1, ///< track transaction status
     TX_TRACK_CHISTICS = 2 ///< track status and characteristics
    };

    该参数允许设置的值为0,1,2

    • 设置为0的时候,show variables like '%session_track_transaction_info%'显示为OFF,表示不开启事务状态跟踪
    • 设置为1的时候,show variables like '%session_track_transaction_info%'显示为STATE,表示跟踪事务状态
    • 设置为2的时候,show variables like '%session_track_transaction_info%'显示为CHARACTERISTICS,表示跟踪事务状态和语句

    2.2 参数设置影响

    开启session_track_transaction_info参数的时候,在数据库中无法直接查询到事务状态记录。

    根据[WL#4797],MySQL是将事务状态跟踪的信息记录到了每一个Query请求返回的OK packet中。

    可以通过抓包的方式查看事务状态信息。

    2.2.1 原生MySQL OK packet格式

    OK Packet的数据包格式定义

    类型 名字 描述
    int<1> 头部 用0x00或者0xFE表示该数据包是一个OK Packet
    int 影响的行数 影响的行数
    int 上次插入的id 上次插入的id
    int<2> 状态标识 如果定义了CLIENT_PROTOCOL_41,会有这一部分
    int<2> 警告数量 警告的数量,如果定义了CLIENT_PROTOCOL_41,会有这一部分
    int<2> 状态标识 如果定义了CLIENT_TRANSACTIONS,会有这一部分
    string 信息 人类可读的状态信息,如果定义了CLIENT_SESSION_TRACK,会有这一部分
    string 会话状态 会话状态信息,如果定义了SERVER_SESSION_STATE_CHANGED,会有这一部分
    string 信息 人类可读的信息

    其中int<lenenc>和string<lenenc>中的lenenc表示的是LengthEcode。

    MySQL-5.7.19代码中封装OK packet的代码部分在protocol_classic.cc文件中的net_send_ok()函数中。

    2.2.3 session_track_transaction_info 额外补充信息

    session_track_transaction_info使用8个字符位来表示事务的信息,并且这8个字符信息是保存在COM_QUERY请求语句的返回数据包中的(客户端执行一条语句,都会被封装成MySQL协议中的COM_QUERY请求发送给server端,server端解析执行之后将结果封装在数据包中返回)。

    位置 表示信息 具体代表含义
    Place 1 Transaction T 显式的开启一个事务
    I 隐式的开启一个事务(@autocommit=0)
    _ 没有活跃的事务
    Place 2 unsafe read r 当前事务中读取了非事务性存储引擎的表
    _ 当前事务中没有读取非事务性存储引擎的表
    Place 3 transaction read R 当前事务中读取了事务性存储引擎的表
    _ 当前事务中没有读取事务性存储引擎的表
    Place 4 unsafe wirte w 当前事务中写入了非事务性存储引擎的表
    _ 当前事务中没有写入非事务性存储引擎的表
    Place 5 transaction write W 当前事务中写入了事务性存储引擎的表
    _ 当前事务中没有写入事务性存储引擎的表
    Place 6 unsafe statement s 当前事务中使用了不安全的语句,类似于UUID()
    _ 没有使用类似的不安全的语句
    Place 7 result-set S 发送给了客户端一个结果集
    _ 没有结果集
    Place 8 LOCKed TABLES L 表被显式的通过LOCK TABLES 语句上锁了
    _ 当前事务中没有锁表

    2.2.2 session_track_transaction_info = 0时OK packet格式解析

    session_track_transaction_info=0表示不记录事务信息,所有在server端返回的数据包中没有事务状态跟踪信息。

    ## session_track_transaction_info = 0
    客户端执行begin;封装的数据包
    06 00 00 # playload_length
    00 # sequence_id
    03 # command_type COM_QUERY
    62 65 67 69 6e # begin
    
    server端返回的数据包:response 
    07 00 00 # playload_length 
    01 # sequence_id
    00 # 头部 0x00表示是一个OK包
    00 # 影响的行数 0
    00 # 上次插入的id
    03000000
    
    客户端执行insert into t1 values(55)封装的数据包
    1a 00 00 # playload_length 
    00 # sequence_id
    03 # command_type COM_QUERY
    696e7365727420696e746f2074312076616c75657328353529 # insert into t1 values(55)
    
    server端返回的数据包:response
    07 00 00 # playload_length
    01 # sequence_id
    00010003000000
    
    客户端执行commit;封装的数据包
    07 00 00 # playload_length
    00 # sequence_id
    03 # command_type COM_QUERY
    636f6d6d6974 # commit
    
    server端返回的数据库包:response
    07 00 00 # playload_length
    01 # sequence_id
    00000002000000

    2.2.4 session_track_transaction_info = 1时OK packet格式解析

    ## session_track_transaction_info = 1
    客户端执行begin;封装的数据包
    06 00 00 # playload_length
    00 # sequence_id
    03 # command_type COM_QUERY
    626567696e # begin
    
    server端返回的数据包:response
    14 00 00 # playload_length
    01 # sequence_id
    00 # 头部 0x00表示是一个OK包
    00 # 影响的行数 0
    00 # 上次插入的id
    03400000000b050908
    54 5f 5f 5f 5f 5f 5f 5f 
    # 事务状态信息 T_______
    # Place 1: 54 //显式的开启一个事务
    # Place 2: 5f //当前事务中没有读取非事务性存储引擎的表
    # Place 3: 5f //当前事务中没有读取事务性存储引擎的表
    # Place 4: 5f //当前事务中没有写入非事务性存储引擎的表
    # Place 5: 5f //当前事务中没有写入事务性存储引擎的表
    # Place 6: 5f //当前事务中没有使用不安全的语句
    # Place 7: 5f //没有结果集
    # Place 8: 5f //没有锁表
    
    客户端执行insert into t1 values(111)封装的数据包
    1b 00 00 # playload_length
    00 # sequence_id
    03 # command_type COM_QUERY
    696e7365727420696e746f2074312076616c7565732831313129 # insert into t1 values(111)
    
    server端返回的数据包:response
    14 00 00 # playload_length
    01 # sequence_id
    00010003400000000b050908 
    54 5f 5f 5f 57 5f 5f 5f # 事务状态信息 T___W___
    # Place 1: 54 //显式的开启一个事务
    # Place 2: 5f //当前事务中没有读取非事务性存储引擎的表
    # Place 3: 5f //当前事务中没有读取事务性存储引擎的表
    # Place 4: 5f //当前事务中没有写入非事务性存储引擎的表
    # Place 5: 57 //当前事务中有写入事务性存储引擎的表
    # Place 6: 5f //当前事务中没有使用不安全的语句
    # Place 7: 5f //没有结果集
    # Place 8: 5f //没有锁表
    
    客户端执行commit;封装的数据包
    07 00 00 # playload_length
    00 # sequence_id
    03 # command_type COM_QUERY
    636f6d6d6974 # commit
    
    server端返回的数据包:response
    1400000100000002400000000b050908
    5f 5f 5f 5f 5f 5f 5f 5f # 事务状态信息________
    # Place 1: 5f //没有活跃的事务
    # Place 2: 5f //当前事务中没有读取非事务性存储引擎的表
    # Place 3: 5f //当前事务中没有读取事务性存储引擎的表
    # Place 4: 5f //当前事务中没有写入非事务性存储引擎的表
    # Place 5: 5f //当前事务中没有写入事务性存储引擎的表
    # Place 6: 5f //当前事务中没有使用不安全的语句
    # Place 7: 5f //没有结果集
    # Place 8: 5f //没有锁表

    2.2.5 session_track_transaction_info = 2时OK packet格式解析

    将session_track_transaction_info参数设置为2的时候,会显示更加详细的事务状态信息。

    客户端执行begin;封装的数据包
    06 00 00 # playload_length
    00 # sequence_id
    03 # command_type COM_QUERY
    626567696e # begin
    
    server端返回的数据包:response
    29 00 00 # playload_length
    01 # sequence_id
    000000034000000020050908
    54 5f 5f 5f 5f 5f 5f 5f # 事务状态信息 T_______
    0413125354415254205452414e53414354494f4e3b # START TRANSACTION;
    # Place 1: 54 //显式的开启一个事务
    # Place 2: 5f //当前事务中没有读取非事务性存储引擎的表
    # Place 3: 5f //当前事务中没有读取事务性存储引擎的表
    # Place 4: 5f //当前事务中没有写入非事务性存储引擎的表
    # Place 5: 5f //当前事务中没有写入事务性存储引擎的表
    # Place 6: 5f //当前事务中没有使用不安全的语句
    # Place 7: 5f //没有结果集
    # Place 8: 5f //没有锁表
    
    
    客户端执行 insert into t1 values(222)封装的数据包
    1b 00 00 # playload_length
    00 # sequence_id
    03 # command_type COM_QUERY
    696e7365727420696e746f2074312076616c7565732832323229 # insert into t1 values(222)
    
    server端返回的数据包:response
    14 00 00 # playload_length
    01 # sequence_id
    00010003400000000b050908
    54 5f 5f 5f 57 5f 5f 5f # 事务状态信息 T___W___
    # Place 1: 5f //没有活跃的事务
    # Place 2: 5f //当前事务中没有读取非事务性存储引擎的表
    # Place 3: 5f //当前事务中没有读取事务性存储引擎的表
    # Place 4: 5f //当前事务中没有写入非事务性存储引擎的表
    # Place 5: 5f //当前事务中没有写入事务性存储引擎的表
    # Place 6: 5f //当前事务中没有使用不安全的语句
    # Place 7: 5f //没有结果集
    # Place 8: 5f //没有锁表
    
    
    客户端执行commit;封装的数据包
    07 00 00 # playload_length
    00 # sequence_id
    03 # command_type COM_QUERY
    636f6d6d6974 # commit
    
    server端返回的数据包:response
    17 00 00 # playload_length
    01 # sequence_id
    00000002400000000e050908 
    5f 5f 5f 5f 5f 5f 5f 5f # 事务状态信息 ________
    040100
    # Place 1: 5f //没有活跃的事务
    # Place 2: 5f //当前事务中没有读取非事务性存储引擎的表
    # Place 3: 5f //当前事务中没有读取事务性存储引擎的表
    # Place 4: 5f //当前事务中没有写入非事务性存储引擎的表
    # Place 5: 5f //当前事务中没有写入事务性存储引擎的表
    # Place 6: 5f //当前事务中没有使用不安全的语句
    # Place 7: 5f //没有结果集
    # Place 8: 5f //没有锁表

    3. 总结

    在设置session_track_transaction_info参数之后,在MySQL的返回数据包中可以获取到当前连接的事务状态信息。

    在数据库中间件上,利用这一特性,使得MySQL故障的情况下,能够自动迁移连接,减少对用户影响。

    在部分场景下能够达到底层MySQL节点故障切换了,对应用来说可以无感知的切换过去。

    好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对码农之家的支持。

    展开阅读

    相关资源

    • MySQL 5.6从零开始学

      MySQL 5.6从零开始学

      MySQL 5.6从零开始学(视频教学版) 以MySQL5.6为线索,全面讲解MysQL5.6的安装与配置、数据库的创建、数据表的创建、数据类型和运算符、MysQL函数、查询数据、数据表的操作、索引、存储过程和函

      大小:175.1 MB数据库

      立即下载
    • 深入浅出MySQL使用手册

      大小:5.2 MBMySQL

      立即下载
    • PHP和MySQL Web开发(第4版)

      PHP和MySQL Web开发(第4版)

      《PHP和MySQL Web开发》将PHP开发与MySQL应用相结合,分别对PHP和MySQL做了深入浅出的分析,不仅介绍PHP和MySQL的一般概念,而且对PHP和MySQL的Web应用做了较全面的阐述,并包括几个经典且实用的例子

      大小:51.6 MB网站开发

      立即下载
    • MySQL学习资料知识点总结

      大小:1.1 MBMySQL

      立即下载
    • MySQL技术内幕

      MySQL技术内幕

      《MySQL技术内幕(第5版)》 是MySQL方面名副其实的经典著作,全面介绍MySQL的基础知识以及MySQL有别于其他数据库系统的独特功能,书中特别关注如何高效地使用和管理MySQL。 《MySQL技术内幕(

      大小:209 MBMySQL

      立即下载
    • PHP7.0+MySQL网站开发全程实例

      PHP7.0+MySQL网站开发全程实例

      《 PHP7.0MySQL网站开发全程实例 》在XAMPP集成化自然环境下,应用Dreamweaver对PHP动态网站开发。《PHP7.0MySQL网站开发全程实例》以全程实例课堂教学为设计方案总体目标,从网站开发自然环境的配

      大小:165.8 MB网站设计

      立即下载
    • MySQL从入门到项目实践

      MySQL从入门到项目实践

      MySQL从入门到项目实践 (超值版)采用基本知识关键运用关键技术高級运用应用领域新项目实践活动构造和循序渐进,由深到精的学习方式开展解读。本书分成6篇29章。最先解读MySQL的安裝与配备

      大小:314.8 MBMySQL

      立即下载

    学习笔记

    1小时23分钟前回答

    MySQL学习笔记之数据定义表约束,分页方法总结

    本文实例讲述了MySQL学习笔记之数据定义表约束,分页方法。分享给大家供大家参考,具体如下: 1. primary key 主键 特点:主键是用于唯一标识一条记录的约束,一张表最多只能有一个主键,不能为空也不能重复 create table user1(id int primary key,name varchar(32));mysql insert into user1 values(1,'hb');Query OK, 1 row affected (0.10 sec)mysql insert into user1 values(1,'hb');ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'mysql insert into user1 (name) values('hb');ERROR 1364 (HY000): Field 'id' doesn't have a default value 2. auto_increament 自增长 mysql create table user2(id int primary key auto_increment,name varchar(34));mysql insert into user2 (name ) values ("name1");Query OK, 1 row affected (0.09 sec)my……

    20小时16分钟前回答

    MYSQL必知必会读书笔记第三章之显示数据库

    MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理。 show column from tablename; 对每一个字段返回一行,行中包含字段名,数据类型、是否允许NULL、键信息、默认值以及其他信息。 describe 语句: MySQL支持使用describ作为show columns from 的一种快捷方式。describ tablename 所支持的其他的show语句: show status,用于显示广泛的服务器状态信息 show create database和show create table ,分别用来显示创建特定数据库或表的Mysql 语句。 show grants,用来显示授予用户的安全权限。 show errors 和show warnings ,用来显示服务器错误或警告消息。 ……