• 体系结构


    三层体系结构

    连接层:

    通信协议处理、线程处理、账号认证、安全检查等

    SQL层:

    权限判断、查询解析、优化器&缓存、查询执行&返回等

    存储引擎层:

    存储引擎(基于磁盘)InnoDB,MyISAM,TokuDB,存储引擎API接口,请求日志,错误日志,二进制日志,中级日志

    建立连接过程:

    等待建立新连接,判断thread cache

    判断host权限,判断max_connections

    账号密码认证

    判断user resource (max_user_connections等)

    连接MySQL的方式有多种

    最通用:TCP/IP

    高效/安全:Unix socket

    Name pipe

    Share memory

    连接层

    mysql -h 10.1.1.x -uroot -p"123" -P 3306

    Warning:Using a password on the command line interface can be insecure.

    ERROR 1129(HY000):Host '10.1.1.x' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'

    恶意连接错误次数太多被拒,可以修改max_connect_error大小

    ERROR 1045(28000):Access denied for user 'root'@'10.1.1.x' (using password:YES)

    密码错误被拒

    ERROR 1862(HY000):Your password has expired.To log in you must change it using a client that supports expired passwords

    密码过期

    关于timeout

    wait_timeout,关闭非交互连接(程序端)之间等待的秒数,通过jdbc等程序连接的是非交互会话

    interactive_timeout,关闭交互连接(客户端)之间等待的秒数,通过mysql cli客户端连接的是交互会话

    SQL层处理流程图

     

    存储层,文件目录结构

    5.7.22,8.0.16上用tree命令

    配置文件

    /etc/my.cnf、/etc/mysql/my.cnf、/usr/local/mysql/etc/my.cnf、~/.my.cnf

    数据文件

    frm、MYI、MYD、ibd、ibdata*、ib_logfile*

    日志文件

    error log、general log、binary log、relay log、slow query log

    my.cnf文件内容分类

    [client]  所有客户端工具(mysql/mysqladmin/mysqldump/mysqlshow等)全局选项
    [mysql]  mysql客户端的相关选项,账号、密码、socket、字符集、auto-rehash等
    [mysqldump] mysqldump相关选项
    [mysqld_multi] 不同版本的mysqld并存管理方法
    [mysqladmin] mysqladmin相关选项
    [mysqld_safe] 5.7起已不再使用
    [mysqld]  mysql server端相关选项

    MySQL8.0之前,不幸误删除.frm文件怎么自救

    用mysqlfrm工具恢复

    在MySQL运行时,误删除slow query log,怎么办

    执行flush logs;或flush slow logs;

    删除文件/临时表/临时文件

    已删除,但空间未释放的文件,通过lsof可见deleted标记,在tmpdir下

    运行状态下,vi打开log文件后保存,也会生成deleted文件

    SQL查询中需要用到额外排序、分组时,会生成临时表;若内存放不下,则会变成磁盘临时文件

    binlog disk cache在tmpdir下ML开头,也是标记为deleted

    InnoDB启动过程中生成的临时文件在tmpdir下以ib开头,同样标记deleted

    8.0起,新增选项internal_tmp_mem_storage_engine=TempTable

    建议:

        创建适当的索引,减少额外排序,分组

        适当调大tmp_table_size和max_heap_table_size

        减少大事务以及避免binlog cache过大,或适当调大binlog_cache_size

        多用短连接,因为链接断开后,一些session级内存(例如binlog cache)会及时释放,减少binlog disk cache机会

    内存结构

    全局

    只分配一次

    全局共享

    连接/会话

    针对每个会话/线程分配

    按需动态分配,查询结束后释放

    用于处理(缓冲、中转)查询结果

    每个会话的缓冲区大小都不一样

    多用短连接,因为连接断开后,一些session级内存会及时释放

    引擎层:

    innodb  buffer,innodb log buffer。key buffer,myisam_sort_buffer_size

    mysql server层:

    query cache,table(def) cache,thread cache,mdl cache

    连接/会话层:

    net/read/join/sort/bulk insert buffer,tmp/heap table,binlog cache ...

    mysqld进程消耗内存估算 = global buffers + all thread buffers

    全局分配内存global buffers(类似SGA) = innodb buffer pool + innodb log buffer + key buffer + query cache + table cache + thread cache

    会话/线程级分配内存all thread buffers(类似PGA) = max_threads * (read buffer + read rnd buffer + sort buffer + join buffer + tmp table + binlog cache)

     

    两个容易被设置很大的内存选项,都是session级,tmp_table_size不限制MEMORY表最大容量,如果执行SQL产生临时表超过tmp_table_size或max_heap_table_size,则会产生基于磁盘的临时表。这2个选项特别容易分配较大,若有需要,可临时调大,不要修改全局值。怎么确认tmp_table_size、max_heap_table_size选项值设置的太大或太小?默认为16M,一般64M足够

    SQL_MODE

    ONLY_FULL_GROUP_BY,SELECT中的列也必须是聚合列

    STRICT_TRANS_TABLES,限制数据类型,数据长度;写数据失败时,当条SQL会失败

    NO_ZERO_IN_DATE,不允许0000-00-00格式的日期时间值

    NO_ZERO_DATE,同上

    ERROR_FOR_DIVISION_BY_ZERO,不允许除以0

    NO_ENGINE_SUBSTITUTION,CREATE、ALTER TABLE时若未指定引擎,则选择默认引擎

    从Oracle等其他数据库迁移过来,可以采用TRADITIONAL模式

    关于huge page

    使用大页是为了提高内存管理效率

    RHEL6,OEL6,SLES11,UEK2起默认启用

    透明大页可以动态调整,无需重启即可生效

    类似innodb data page概念

    但启用透明大页可能反而导致MySQL(TokuDB)更容易发生内存泄漏,OOM等问题

    查看是否关闭

    cat /sys/kernel/mm/transparent_hugepage/enabled

    cat /sys/kernel/mm/transparent_hugepage/defrag

    plugin管理

    查看plugin-dir

    mysqladmin var | grep plugin_dir

    安装plugin

    install plugin rpl_semi_sync_master soname 'semisync_master.so';

    删除plugin

    uninstall plugin rpl_semi_sync_master;

    SELECT SQL WHERE 提取过程

    Index Key (>=first key  AND <= last key)

    Index Filter

    Table Filter

    PFS & SYS Schema 使用

    体系结构

    选用适当长度的数据类型,特别关注隐式类型转换

    必要的话,启用thread pool,调低timeout

    关闭query cache,尽量避免适用MyISAM,session级buffer勿过高

    虚拟列是个好东西,尤其是结合JSON类型&函数

    再用MySQL5.7以前的版本都是在给自己添堵

  • 相关阅读:
    Opaque data type--不透明类型
    swift class的动态派发
    swift class的虚函数表
    swift class的虚函数表、扩展、@objc修饰、虚函数的派发方式研究
    swift语言混编--语言交互的接口
    CPU指令分类
    CPU的内部架构和工作原理-原文
    cpu的组成及分工
    简单介绍 CPU 的工作原理
    php7开启强类型模式
  • 原文地址:https://www.cnblogs.com/allenhu320/p/11365034.html
Copyright © 2020-2023  润新知