pengjunlong / pengjunlong.github.io

Github+Markdown+hexo搭建自己的空间
https://pengjunlong.github.io
1 stars 0 forks source link

第2章 MySQL架构组成 11 #21

Closed pengjunlong closed 6 years ago

pengjunlong commented 6 years ago
pengjunlong commented 6 years ago

日志文件

错误日志默认放在数据文件目录下,可以通过--log-error=file_name 修改路径

binlog会将所有修改数据库的query语句记录,另外也会记录执行时间、消耗资源、相关事务信息; --log-bin=file_name指定binlog存储位置,--binlog-ignore-db=db_name和--binlog-do-db=db_name中db_name匹配的是执行语句时所处的数据库而不是SQL影响的数据库 mysqlbin.index为所有binlog存储位置的索引文件

pengjunlong commented 6 years ago

数据文件

所有存储引擎都有.frm文件,存储表结构定义信息 .MYD文件,.MYI文件,MyISAM引擎专用 .ibd文件(独享表空间),ibdata文件(共享表空间),InnoDB引擎专用

pengjunlong commented 6 years ago

主从复制文件

从库用master.info维护主库相关信息 从库I/O线程从主库读取binlog后存入mysql-relay-bin.xxxxxn,然后SQL线程从该文件读取解析出SQL语句,在从库应用 mysql-relay-bin.index存储所有relaylog存储位置的绝对路径 relay-log.info文件维护I/O线程写入相关信息

pengjunlong commented 6 years ago

系统配置文件 一般都在my.cnf,由参数组组成,组名用[]表示,如[mysqld],[client]

Unix/Linux特有: pid文件存储mysqld进程id socket文件,客户端可以通过Unix socket而不用TCP/IP连接MySQL

pengjunlong commented 6 years ago

image MySQL server可以看成两层:SQL layer和storage engine layer

  1. SQL层完成处理底层数据之前的所有工作,如权限判断、query解析、执行计划优化、query cache处理等
  1. 存储引擎层实现底层数据存取操作,由多种存储引擎共同组成

启动MySQL:初始化模块 -> 连接管理模块 ,准备好接受客户端请求 客户端连接:连接管理模块 -> cs协议模块 -> 线程管理模块 -> 连接线程模块 -> 用户模块 请求query: 两种类型客户端请求:query和command,query需要调用query解析和转发模块; 连接线程模块 -> query解析和转发模块(直接处理or转发) -> 被转发模块先调用访问控制模块 -> 表管理器模块 -> 存储引擎接口模块 -> 具体存储引擎处理 -> 处理完成,控制权交回连接线程模块

返回结果:query或command处理成功或失败,处理结果或错误信息通过连接线程反馈给客户端,然后连接线程模块进行相应清理工作,继续等待后续请求 退出:连接线程模块处理客户端断开连接的请求

上面过程中数据发生变化&打开了bin-log功能,则调用日志处理模块 各模块核心运算处理功能高度依赖核心API模块

pengjunlong commented 6 years ago

mysql自带工具物尽其用~

mysql

mysql -uroot -e "show databases;" “-E, --vertical”全程有以”\G“结尾的效果 “-H, --html”与“-X, --xml”,顾名思义 mysql -uroot --prompt="\u@\h : \d \r:\m:\s> " mysql -uroot --tee=/tmp/mysqllog,全程记录输入和输出到文件 “-U, --safe-updates”(禁用所有无法用索引的update、delete)、“--select_limit=#”(和-U一起使用,限制查询记录数)和“--max_join_size=#”(和-U一起使用,限制参与join记录数) “--show-warnings”每次query后自动执行”show warnings“展示最后一次warning

上面常用参数可以写到my.cnf中[mysql]、[client]下,这样不用每次手动加了

mysqladmin

mysqladmin -uroot -hlocalhost ping,检查指定server是否能正常提供服务 mysqladmin -uroot status,返回server一些基本状态 mysqladmin -uroot processlist,数据库当前连接线程信息,类似”show processlist“ start slave、stop slave命令维护主从复制,kill命令终止某个连接到server的线程

mysqldump,“select * into OUTFILE from ...”

mysqldump -uroot --no-data --default-character-set=utf8 test t1 以query语句方式导出test库t1表,--no-data指定不导出数据(只有结构)

mysqlimport 导入数据,“LOAD DATA INFILE”

mysqlbinlog,分析binlog,指定时间、指定日志起止位置解析成query语句,指定数据库名称

mysqlcheck,针对数据表进行检查、修复,分析、优化,不同存储引擎不一定支持所有功能

myisamchk,检查和修复MyISAM存储引擎的表,但只对MyISAM存储引擎的索引文件有效

myisampack,压缩后的MyISAM表仍然可以使用其索引,压缩后的MyISAM表会变成只读,不能进行任何修改操作

mysqlhotcopy,是perl脚本,MyISAM存储引擎的表进行在线备份操作

分析处理slowlog的mysqldumpslow,查询MySQL相关开发包位置和include文件位置的mysql_config,查看数据库相关对象结构的mysqlshow

通过对整体架构的了解,我们可以大概推理出MySQL中目前已有功能的实现方式,甚至可以大概地分析出暂时还未实现功能的实现难点。比如一直让大家头疼的在线DDL功能,可能很大程度上是因为SQL逻辑层与存储引擎实现层的过度解耦,造成很多信息在二者之间的传递存在一定的难度