此书的详细内容
mysql物理文件组成
日志文件
错误日志
错误日志记录了MyQL Server 运行过程中所有较为严重的警告和错误信息,以及MySQL
Server 每次启动和关闭的详细信息.
如果要开启系统记录错误日志的功能,需要在
启动时开启-log-error 选项。错误日志的默认存放位置在数据目录下,以hostname.err 命
名。但是可以使用命令:–log-error[=file_name],修改其存放目录和文件名.
二进制日志
二进制日志,也就是我们常说的binlog,也是MySQL Server 中最为重要的日志之一。
当我们通过“–log-bin[=file_name]”打开了记录的功能之后,MySQL 会将所有修改数据
库数据的query 以二进制形式记录到日志文件中。当然,日志中并不仅限于query 语句这么
简单,还包括每一条query 所执行的时间,所消耗的资源,以及相关的事务信息,所以binlog
是事务安全的。
和错误日志一样,binlog 记录功能同样需要“–log-bin[=file_name]”参数的显式指
定才能开启,如果未指定file_name,则会在数据目录下记录为mysql-bin.**(*代表0~
9 之间的某一个数字,来表示该日志的序号)。
慢查询日志:slow query log
顾名思义,慢查询日志中记录的是执行时间较长的query,也就是我们常说的slow
query,通过设–log-slow-queries[=file_name]来打开该功能并设置记录位置和文件名,
默认文件名为hostname-slow.log,默认目录也是数据目录。
MySQL 还提供了专门用来分析满查询日志的工具程序mysqlslowdump,
用来帮助数据库管理人员解决可能存在的性能问题。
数据文件
每个数据文件的扩展名却各不一样。如MyISAM 用“.MYD”作为扩展
名,Innodb 用“.ibd”,Archive 用“.arc”,CSV 用“.csv”。
不论是什么存储引擎,每一个表都会有一个以表名命名的“.frm”文件,存放表结构信息。
所有的“.frm”文件都存放在所属数据库的文件夹下面。
“.MYD”文件是MyISAM 存储引擎专用,存放MyISAM 表的数据。
“.MYI”文件是存放MyISAM 表的索引相关信息。
.ibd文件和ibdata文件
这两种文件都是存放Innodb 数据的文件。独享表空间存储方式使用“.ibd”文件来存放数据,且
每个表一个“.ibd”文件,文件存放在和MyISAM 数据相同的位置。如果选用共享存储表空
间来存放数据,则会使用ibdata 文件来存放,所有表共同使用一个(或者多个,可自行配
置)ibdata 文件。
Replication(复制)相关文件
master.info 文件:
master.info 文件存在于Slave 端的数据目录下,里面存放了该Slave 的Master 端的相关信息。
relay log
存放Slave 端的I/O 线程从Master 端所读取到的Binary Log 信息,
然后由Slave 端的SQL 线程从该relay log 中读取并解析相应的日志
信息,转化成Master 所执行的SQL 语句,然后在Slave端应用。
relay-log.info 文件:
类似于master.info,它存放通过Slave 的I/O 线程写入到本地的relay log 的相关信息。
MySQL Server 系统架构
MySQL 是二层架构,第一层我们通常叫做SQL Layer,处理包括权限判断,sql 解析,执
行计划优化,query cache 的处理等等;第二层就是存储引擎层,我们通常叫做Storage
Engine Layer,也就是底层数据存取操作实现部分,由多种存储引擎共同组成。
MySQL存储引擎
概述
MySQL 的插件式存储引擎主要包括MyISAM,Innodb,NDB Cluster,Maria,Falcon,
Memory,Archive,Merge,Federated 等,其中最著名而且使用最为广泛的MyISAM 和Innodb
两种存储引擎。MyISAM 是MySQL 最早的ISAM 存储引擎的升级版本,也是MySQL默认的存储
引擎。但它不支持事务,外键等特性,我们可以重新设置InnoDB为默认引擎:在配置文件
my.cnf(linux,如果是windows,则是my.ini)中的 [mysqld]下面加入
default-storage-engine=INNODB 一句,Innodb 最大的特点是提供了事务控制等特性。
NDB Cluster 虽然也支持事务,但是主要是用于分布式环境。Memory 存储引擎所有数据
和索引均存储于内存中,所以主要是用于一些临时表,或者对性能要求极高,但是允许在
丢失数据的特定场景下。Archive 是一个数据经过高比例压缩存放的存储引擎,主要用于
存放过期而且很少访问的历史信息,不支持索引。Merge在严格意义上来说,并不能算作
一个存储引擎。因为Merge 存储引擎主要用于将几个基表merge 到一起,对外作为一个
表来提供服务,基表可以基于其他的几个存储引擎。
MyISAM 支持以下三种类型的索引:
1、B-Tree 索引
B-Tree 索引,顾名思义,就是所有的索引节点都按照balance tree 的数据结构来
存储,所有的索引数据节点都在叶节点。
2、R-Tree 索引
R-Tree 索引的存储方式和b-tree 索引有一些区别,主要设计用于为存储空间和多
维数据的字段做索引。
3、Full-text 索引
Full-text 索引就是我们长说的全文索引,他的存储结构也是b-tree。主要是为了
解决在我们需要用like 查询的低效问题。
MyISAM 上面三种索引类型中,最经常使用的就是B-Tree 索引了,偶尔会使用到Fulltext,
但是R-Tree 索引一般系统中都是很少用到的。另外MyISAM 的B-Tree 索引有一个较
大的限制,那就是参与一个索引的所有字段的长度之和不能超过1000 字节。
虽然每一个MyISAM 的表都是存放在一个相同后缀名的.MYD 文件中,但是每个文件的存
放格式实际上可能并不是完全一样的,因为MyISAM 的数据存放格式是分为静态(FIXED)固
定长度、动态(DYNAMIC)可变长度以及压缩(COMPRESSED)这三种格式。当然三种格式中
是否压缩是完全可以任由我们自己选择的,可以在创建表的时候通过ROW_FORMAT 来指定
{COMPRESSED | DEFAULT},也可以通过myisampack 工具来进行压缩,默认是不压缩的。
Innodb 存储引擎
有以下特点:
1、支持事务安装
2、锁定机制的改进,Innodb 改变了MyISAM 的锁机制,实现了行锁。
3、实现外键。
Innodb 的表空间分为两种形式。一种是共享表空间,也就是所有表和索引数据被存放
在同一个表空间(一个或多个数据文件)中,通过innodb_data_file_path 来指定。
另外一种是独享表空间,也就是每个表的数据和索引被存放在一个单独的.ibd 文件中。
一般建议用独享表空间。
Innodb 的所有参数基本上都带有前缀“innodb_”,我们也完全可以仅仅通过一个参数
(skip-innodb)来屏蔽MySQL 中的Innodb存储引擎,这样即使我们在安装编译的时候
将Innodb 存储引擎安装进去了,使用者也无法创建Innodb 的表。
MERGE 存储引擎,在MySQL 用户手册中也提到了,也被大家认识为MRG_MyISAM 引擎。
Memory 存储引擎,是将数据存储在内存中的存储引擎。Memory 存储引擎不会将任何
数据存放到磁盘上,仅仅存放了一个表结构相关信息的.frm 文件在磁盘上面。所以
一旦MySQL Crash 或者主机Crash 之后,Memory 的表就只剩下一个结构了。Memory
表支持索引,并且同时支持Hash 和B-Tree 两种格式的索引。由于是存放在内存中,
所以Memory 都是按照定长的空间来存储数据的,而且不支持BLOB 和TEXT类型的字段。
Memory 存储引擎实现页级锁定。
ARCHIVE存储引擎:
ARCHIVE 存储引擎主要用于通过较小的存储空间来存放过期的很少访问的历史数据。
ARCHIVE 表不支持索引,通过一个.frm 的结构定义文件,一个.ARZ 的数据压缩文件还有一
个.ARM 的meta 信息文件。由于其所存放的数据的特殊性,ARCHIVE 表不支持删除,修改操
作,仅支持插入和查询操作。锁定机制为行级锁定。
MySQL的权限和安全
略
MySQL 备份与恢复
在介绍备份和恢复之前,先考虑以前几种情况的解决方案?
一、数据丢失应用场景
1、人为操作失误造成某些数据被误操作;
2、软件BUG 造成数据部分或者全部丢失;
3、硬件故障造成数据库数据部分或全部丢失;
4、安全漏洞被入侵数据被恶意破坏;
二、非数据丢失应用场景
5、特殊应用场景下基于时间点的数据恢复、回滚;
6、开发测试环境数据库搭建;
7、相同数据库的新环境搭建;
8、数据库或者数据迁移;
在MySQL 中一般都使用以下两种方法来获得可以自定义分隔符的纯文本备份文件。
1、通过执行SELECT … TO OUTFILE FROM …命令来实现
SELECT * INTO OUTFILE ‘/tmp/dump.text’
FIELDS TERMINATED BY ‘,’ OPTIONALLY ENCLOSED BY ‘“‘
FROM 表名 limit 100;
2、通过mysqldump 导出所有数据库
mysqldump -uroot -proot –all-databases >/tmp/all.sql
思考:如何实现mysql数据不丢失备份和高效恢复方案?
可以采用让远程服务器实时同步bin-log日志,可以理解为主从复制。
物理备份;将.ibd文件、.myd文件、.frm等文件复制到mysql相应的位置上去。
逻辑备份:使用mysqldump工具,通过命令语句的形式将数据导到一个文件上。
热备份:线上备份数据,如主从复制。
冷备份:关闭数据库,然后将数据拷贝出来。
需求:一个论坛帖子总量的统计
附加要求:实时更新
在很多人看来,这个功能非常容易实现,不就是执行一条SELECT COUNT(*)的
Query 就可以得到结果了么?是的,确实只需要如此简单的一个Query 就可
以得到结果。但是,如果我们采用不是MyISAM 存储引擎,而是使用的Innodb
的存储引擎,那么大家可以试想一下,如果存放帖子的表中已经有上千万的帖
子的时候,执行这条Query 语句需要多少成本?恐怕再好的硬件设备,恐怕都
不可能在10 秒之内完成一次查询吧。如果我们的访问量再大一点,还有人觉得
这是一件简单的事情么?既然这样查询不行,那我们是不是该专门为这个功能
建一个表,就只有一个字段,一条记录,就存放这个统计量,每次有新的帖子
产生的时候,都将这个值增加1,这样我们每次都只需要查询这个表就可
以得到结果了,这个效率肯定能够满足要求。
但这种情况下,实时更新就很难确保的满足,可以这样,开启定时任务,定时
通过select语句更新表的统计结果。
——————–未完待续98页——————–