DBMS再回首

逻辑架构:
    用户请求  [通过连接器]
    连接池  [分配线程连接,连接队列]
    查询分析引擎  [操作求解器,语法语义词法分析器,优化器,计划执行器]
    管理器  [事务管理器,锁管理器,文件缓存磁盘空间管理器,恢复管理器]
    存储引擎接口  [文件系统]
事务:ACID
    A 原子性
    C 一致性
    I 隔离性
    D 持久性
隔离级别: ansi 99标准
    read uncommitted  可读到未提交数据
    read committed    读到提交过后的数据
    REPEATABLE-READ   可重读数据
    serialization     串行化读完数据
    更高级的隔离级别
    snapshot committer 快照级别提交
    snapshow           快照读取
    更改隔离级别,配置文件
    [mysqld]
    transaction-isolation = REPEATABLE-READ
    环境变量
    SELECT @@GLOBAL.tx_isolation, @@tx_isolation;
    SET GLOBAL tx_isolation=‘REPEATABLE-READ‘;
    SET SESSION tx_isolation=‘SERIALIZABLE‘;
多日志,分区文件
    将磁盘随机IO尽可能转换为顺序IO
三大范式:
    1. 不可再分   2. 要有主键引用    3. 主键才能发起传递引用
    Student      Class
    sid(PK)      cid(PK)
    sname        cname
    cid(FK)
服务基础查询:
    show global variables like ‘%cache%‘\G;
    show session variables like ‘%cache%\G‘;
    show global/session status;
mysql的使用:
    本地通讯    /tmp/mysql.sock
    网络通讯    socket
    客户端工具   mysql,mysqladmin,mysqldump
    导入sql脚本   1. bash > mysql < xxx.sql  2. mysql > /. xxx.sql
    帮助文档    help context || help keyword
数据类型,sql_mode
    tranitional  strict_trans_tables  strict_all_tables
    查询: select @@global.sql_mode;   等价   show global variables like ‘%cache%‘\G;
    设置: set global sql_mode = ‘strict_trans_tables‘;
ddl,dcl,dml 略
数据库锁:
    读  共享锁
    写   独占锁,排他锁
    锁粒度{ 表,行 }
    LOCK TABLES
    tbl_name [[AS] alias] lock_type
    [, tbl_name [[AS] alias] lock_type] ...
    lock_type:
        READ [LOCAL]
      | [LOW_PRIORITY] WRITE
    UNLOCK TABLES
事务:
    o START TRANSACTION or BEGIN start a new transaction.
    o COMMIT commits the current transaction, making its changes permanent.
    o ROLLBACK rolls back the current transaction, canceling its changes.
    o SET autocommit disables or enables the default autocommit mode for
      the current session.
    事例:
        START TRANSACTION;
        SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
        UPDATE table2 SET summary=@A WHERE type=1;
        COMMIT;
        savepoint a
        rollback a
    分布式事务(隔离级别需要SERAILIZABLE)
        分类: 本地事务+外部事务 (互斥)
        需要一个或多个资源管理器RM  与  一个事务管理器TM
        事务分为两个阶段:    准备    处理(回滚/提交)
        执行语句                   --->  状态
        xa start ‘xa_test‘;    --->  ACTIVE
        insert into test(num) values(2);
        xa end ‘xa‘            --->  IDLE
        xa prepare ‘xa‘;       --->  PREPADER
        xa commit ‘xa‘  ||  xa rollback ‘xa‘
                             
        xa recover (要求所有进入 PREPADER  才能监控)
用户管理
    GRANT
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    TO user_specification [, user_specification] ...
    [REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}]
    [WITH with_option ...]
    object_type:
        TABLE
      | FUNCTION
      | PROCEDURE
    priv_level:
        *
      | *.*
      | db_name.*
      | db_name.tbl_name
    ssl_option:
        SSL
      | X509
      | CIPHER ‘cipher‘
      | ISSUER ‘issuer‘
      | SUBJECT ‘subject‘
    with_option:
        GRANT OPTION
    例: grant select,update,delete,insert on *.* to user@‘localhost‘
        revoke select,update,delete,insert on *.* from user@‘localhost‘
缓存:
    show global variables like ‘%query_cache%‘
    query_cache_type {on,off,demand}    demand下sql语句要带  SQL_CACHE
    query_cache_size
    query_cache_min_res_unit 缓存区块最小
    query_cache_limit  单个缓存上限
    query_cache_wcolck_invalidate 锁定数据不允许返回读(缓存中)
    计算命中率:
        MariaDB [hellodb]> SHOW GLOBAL STATUS WHERE Variable_name=‘Qcache_hits‘ OR Variable_name=‘Com_select‘;
        +---------------+-------+
        | Variable_name | Value |
        +---------------+-------+
        | Com_select    | 24    |
        | Qcache_hits   | 4     |
        +---------------+-------+
        Qcache_hits/(Com_select+Qcache_hits)
        也应该参考另外一个指标:命中和写入的比率,即Qcache_hits/Qcache_inserts的值,此比值如果能大于3:1,则表明缓存也是有效的。能达到10:1,为比较理想的情况。
日志:
    log={ on|off }
    log_output={ TABLE|FILE|NONE }
    gereral_log={ on|off }
    general_log_file=/path/log
    long_query_time=time(second)
    slow_query_log={ON|OFF}
    slow_query_log_file=/path/log
复制:
    从发起请求线程包含自己目前的二进制信息A
    主接收到请求使用binlog dump线程回应从B
    从A线程将请求接收下来保存为中继日志
    从再开线程将中继线程保存为执行日志
    状态:
        1. 复制主线程状态
            下面列出了主服务器的Binlog Dump线程的State列的最常见的状态。如果你没有在主服务器上看见任何Binlog Dump线程,这说明复制没有在运行—即,目前没有连接任何从服务器。
            ·         Sending binlog event to slave
            二进制日志由各种事件组成,一个事件通常为一个更新加一些其它信息。线程已经从二进制日志读取了一个事件并且正将它发送到从服务器。
            ·         Finished reading one binlog; switching to next binlog
            线程已经读完二进制日志文件并且正打开下一个要发送到从服务器的日志文件。
            ·         Has sent all binlog to slave; waiting for binlog to be updated
            线程已经从二进制日志读取所有主要的更新并已经发送到了从服务器。线程现在正空闲,等待由主服务器上新的更新导致的出现在二进制日志中的新事件。
            ·         Waiting to finalize termination
            线程停止时发生的一个很简单的状态。
        2. 复制从I/O线程状态
            下面列出了从服务器的I/O线程的State列的最常见的状态。该状态也出现在Slave_IO_State列,由SHOW SLAVE STATUS显示。这说明你可以只通过该语句仔细浏览所发生的事情。
            ·         Connecting to master
            线程正试图连接主服务器。
            ·         Checking master version
            建立同主服务器之间的连接后立即临时出现的状态。
            ·         Registering slave on master
            建立同主服务器之间的连接后立即临时出现的状态。
            ·         Requesting binlog dump
            建立同主服务器之间的连接后立即临时出现的状态。线程向主服务器发送一条请求,索取从请求的二进制日志文件名和位置开始的二进制日志的内容。
            ·         Waiting to reconnect after a failed binlog dump request
            如果二进制日志转储请求失败(由于没有连接),线程进入睡眠状态,然后定期尝试重新连接。可以使用--master-connect-retry选项指定重试之间的间隔。
            ·         Reconnecting after a failed binlog dump request
            线程正尝试重新连接主服务器。
            ·         Waiting for master to send event
            线程已经连接上主服务器,正等待二进制日志事件到达。如果主服务器正空闲,会持续较长的时间。如果等待持续slave_read_timeout秒,则发生超时。此时,线程认为连接被中断并企图重新连接。
            ·         Queueing master event to the relay log
            线程已经读取一个事件,正将它复制到中继日志供SQL线程来处理。
            ·         Waiting to reconnect after a failed master event read
            读取时(由于没有连接)出现错误。线程企图重新连接前将睡眠master-connect-retry秒。
            ·         Reconnecting after a failed master event read
            线程正尝试重新连接主服务器。当连接重新建立后,状态变为Waiting for master to send event。
            ·         Waiting for the slave SQL thread to free enough relay log space
            正使用一个非零relay_log_space_limit值,中继日志已经增长到其组合大小超过该值。I/O线程正等待直到SQL线程处理中继日志内容并删除部分中继日志文件来释放足够的空间。
            ·         Waiting for slave mutex on exit
            线程停止时发生的一个很简单的状态。
        3. 复制从SQL线程状态
            下面列出了从服务器的SQL线程的State列的最常见的状态。
            ·         Reading event from the relay log
            线程已经从中继日志读取一个事件,可以对事件进行处理了。
            ·         Has read all relay log; waiting for the slave I/O thread to update it
            线程已经处理了中继日志文件中的所有事件,现在正等待I/O线程将新事件写入中继日志。
            ·         Waiting for slave mutex on exit
            线程停止时发生的一个很简单的状态。
            I/O线程的State列也可以显示语句的文本。这说明线程已经从中继日志读取了一个事件,从中提取了语句,并且正在执行语句。
    复制流程:
        GRANT REPLICATION SLAVE ON *.* TO ‘repl‘@‘%.mydomain.com‘ IDENTIFIED BY ‘slavepass‘;
        FLUSH TABLES WITH READ LOCK;
        [mysqld]
        log-bin=mysql-bin
        server-id=1
        从服务器类型   但server-id不一样
        从服务器中
        change master to
            master_host = ‘‘
            master-user = ‘‘
            master-password = ‘‘
            master-log-file = ‘‘
            master-log-position =
        start slave;
视图: 没有多余的特色功能
    create view v_view WITH [CASCADED | LOCAL] CHECK OPTION
触发器: 没有多余特色功能
    CREATE TRIGGER trigger_name trigger_time trigger_event
    ON tbl_name FOR EACH ROW trigger_stmt
    OLD和NEW关键字来更新此前的数据
    trigger_event
        insert  update  delete
    NEW   x       x        -
    OLD   -       x        x
存储过程与函数:  
    CREATE PROCEDURE sp_name ([proc_parameter[,...]])
    [characteristic ...] routine_body
    CREATE FUNCTION sp_name ([func_parameter[,...]])
    RETURNS type
    [characteristic ...] routine_body
索引: 有一些有意思的东西
    oracle:
    内部索引(
        btree
            多路,多级,常用
        函数索引
            用于函数查询创建
        反转
            顾名思义
    )
    外部索引(
        位图
            存在重复数据
        位图连接
            将重复数据一次性抽出(更近一步)
        压缩
            btree的 i/o 时间片  换   cpu 时间片   策略
        分区索引
            有数据分区则会出现
        索引组织表
            ???
        簇索引
            多表中相同的列成簇
        域索引
            自定义索引类型 !!!!
        虚拟索引
            仅测试可用,不存在索引数据的建立
        全文
            没什么好说
        二进制索引
            为blob等数据创建索引
    )
    mysql索引:
    rtree,btree,hash,fulltext
    例: CREATE INDEX part_of_name ON customer (name(10));


计划:  下一章节更新mysql的优化,基准测试,主从,主主模式复制,备份与恢复

本文出自 “Apprentice” 博客,请务必保留此出处http://apprentice.blog.51cto.com/2214645/1393659

DBMS再回首,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。