images\cherry_red.png1 实训二前期LNMP简易架构
      images\cherry_blue.png1.1 php server安装
      images\cherry_blue.png1.2 安装初始化数据库
   images\cherry_red.png2 Mysql数据库
      images\cherry_blue.png2.1 Mysql5.7安装
         images\cherry_orange.png2.1.1 rpm安装
         images\cherry_orange.png2.1.2 yum安装
         images\cherry_orange.png2.1.3 源码安装
         images\cherry_orange.png2.1.4 编译好的非rpm包安装
         images\cherry_orange.png2.1.5 my.cnf常见选项
      images\cherry_blue.png2.2 Mysql基础
         images\cherry_orange.png2.2.1 MySql数据库操作
         images\cherry_orange.png2.2.2 MySql数据类型
            images\cherry_cyan.png2.2.2.1 整型
            images\cherry_cyan.png2.2.2.2 浮点数和定数
            images\cherry_cyan.png2.2.2.3 字符串类型
            images\cherry_cyan.png2.2.2.4 日期和时间类型
            images\cherry_cyan.png2.2.2.5 字段修饰和约束
            images\cherry_cyan.png2.2.2.6 业务建表练习
         images\cherry_orange.png2.2.3 MySql表操作
         images\cherry_orange.png2.2.4 MySql体系结构
         images\cherry_orange.png2.2.5 MySql存储引擎
      images\cherry_blue.png2.3 MySql操作
         images\cherry_orange.png2.3.1 MySql数据操作
         images\cherry_orange.png2.3.2 MySql单表查询
         images\cherry_orange.png2.3.3 MySql多表查询
         images\cherry_orange.png2.3.4 MySql存储过程与函数
      images\cherry_blue.png2.4 MySql操作-2
         images\cherry_orange.png2.4.1 MySql安全机制
         images\cherry_orange.png2.4.2 MySql日志管理
         images\cherry_orange.png2.4.3 MySql复制概述
         images\cherry_orange.png2.4.4 主从同步
      images\cherry_blue.png2.5 最基本sql语句及主从架构
      images\cherry_blue.png2.6 MyCat中间件
         images\cherry_orange.png2.6.1 部署Mycat
         images\cherry_orange.png2.6.2 配置读写分离
            images\cherry_cyan.png2.6.2.1 安全的读写分离
         images\cherry_orange.png2.6.3 XML语法格式
         images\cherry_orange.png2.6.4 mycat 分表分库
      images\cherry_blue.png2.7 Mysql MHA
         images\cherry_orange.png2.7.1 MHA-部署
         images\cherry_orange.png2.7.2 MHA-故障切换VIP透明
            images\cherry_cyan.png2.7.2.1 VIP切换脚本内容
            images\cherry_cyan.png2.7.2.2 VIP-手动在线切换脚本
         images\cherry_orange.png2.7.3 MHA+Mycat高可用Mysql读写分离
         images\cherry_orange.png2.7.4 MHA+VIP+Mycat
         images\cherry_orange.png2.7.5 MHA-故障切换邮件报警
         images\cherry_orange.png2.7.6 自动配置Slave主机
   images\cherry_red.png3 实验
      images\cherry_blue.png3.1 mysql授权问题
      images\cherry_blue.png3.2 1.单节点数据库
      images\cherry_blue.png3.3 2.主从同步
      images\cherry_blue.png3.4 3.实验(高可用)
         images\cherry_orange.png3.4.1 高可用keepalived
            images\cherry_cyan.png3.4.1.1 keepalived install
      images\cherry_blue.png3.5 4.实验(高可用+大并发)
         images\cherry_orange.png3.5.1 HAproxy代理
      images\cherry_blue.png3.6 4.实验(mycat-读写分离)
         images\cherry_orange.png3.6.1 mycat安装部署
         images\cherry_orange.png3.6.2 读写分离高可用
         images\cherry_orange.png3.6.3 mycat管理端口命令
      images\cherry_blue.png3.7 5.双主双从-读写分离-高可用
      images\cherry_blue.png3.8 6.mycat分库操作
      images\cherry_blue.png3.9 7.mycat分表
      images\cherry_blue.png3.10 8.mycat分库分表之下实现读写分离
   images\cherry_red.png4 Shell脚本编程
   images\cherry_red.png5 Zabbix监控
      images\cherry_blue.png5.1 zabbix设置邮件报警--自定义报警媒介
      images\cherry_blue.png5.2 zabbix解决中文界面乱码问题
      images\cherry_blue.png5.3 ziabbix自带的template Linux OS
      images\cherry_blue.png5.4 zabbix-agent自定义收集数据
      images\cherry_blue.png5.5 zabbix监控Nginx性能
      images\cherry_blue.png5.6 综合配置
      images\cherry_blue.png5.7 实验:监控nginx端口实现告警
   images\cherry_red.png6 ELK日志分析
      images\cherry_blue.png6.1 PS
      images\cherry_blue.png6.2 es-head插件安装
      images\cherry_blue.png6.3 安装filebeat nginx日志模板



存储引擎 InnoDB ========================================================


存储引擎说白了就是如何 存储数据、如何为存储的数据 建立索引和如何更新查询数据等技术的实现方法。
因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)

在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql数据库提供了多种存储引擎。
用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎。

images\21-1.png



images\21-2.png



MyISAM 存储引擎 =====================================

mysql 5.5 以前默认的存储引擎。

对 事务 完整性没有要求或者以 SELECT、INSERT 为主的应用基本都可以使用这个引擎来创建表。
每个MyISAM 在磁盘上存储成 3个文件,其中文件名和表名都相同,但是扩展名分别为:

- .frm (存储表定义)
- MYD (MYData,存储数据)
- MYI (MYIndex,存储索引)

不支持 事务
不支持
外键

读性能好
可以方便的移动某个表或者某个数据库
数据 和 索引分开存放,一定程度上也加快了 索引的速度。

支持数据压缩,数据库体积相对比较小,节约空间。
因此当对事务完整性没有要求并以 访问为主 的应用适合使用该存储引擎。

只能支持 表级别锁定。
不能支持一些专业 热备份工具。



InnoDB 存储引擎 =======================================

InnoDB是一个健壮的 事务型 存储引擎,这种存储引擎已经被很多互联网企业使用,为用户操作非常大的数据存储提供了一个强大的解决方案。
mysql5.5开始,默认存储引擎设置为 innodb。

由于该存储引擎在事务上具有优势,即支持具有提交、回滚 及 崩溃恢复能力等事务特性,
所以比MyISAM存储引擎占用更多的磁盘空间。

因此当需要频繁的更新、删除操作,同时还对 事务的完整性要求较高,并且有较高的并发读取频率,InnoDB是不错的选择。

1.更新密集的表。InnoDB存储引擎特别适合处理多重并发的更新请求。
2.事务。InnoDB存储引擎是支持事务的标准MySQL存储引擎。
3.自动灾难恢复。与其它存储引擎不同,InnoDB表能够自动从灾难中恢复。 ##事务恢复管理器
4.外键约束。MySQL支持外键的存储引擎只有 InnoDB。
5.支持颗粒度更加精细的 级别 锁 。 (表级锁)
6. innodb引擎还提供了插入缓存 (insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead)等高性能技术。
7、能够支持真正意义上的 ,热备份


表结构文件

从物理意义上来讲,InnoDB表由 共享表空间文件 ibdata1 独占表空间文件ibd表结构文件(.frm)
默认使用 共享表空间。


images\21-3.png



ibdata1 ibdata2 ibdata3 idb idb idb
| A B C
A B C D
不受到文件系统的单个文件大小 限制 受到文件系统单个文件大小的限制。


ext4 ==⇒ 单个文件数量有限 最大支持,单个文件 16 TB


db.opt 文件,是用来记录该库的默认字符集编码和字符集排序规则的。
创建数据库指定默认字符集和排序规则,那么后续创建的表如果没有指定字符集和排序规则,那么该新建的表将采用db.opt文件中指定的属性。


在MYSQL中建立任何一张数据表,在其数据目录对应的数据库目录下都有对应表的.frm文件,
.frm 文件是用来保存每个数据表的元数据(meta)信息,包括表结构的定义等,
.frm 文件跟数据库存储引擎无关,也就是任何存储引擎的数据表都必须有.frm文件,命名方式为数据表名.frm,
如user.frm .frm文件可以用来在数据库崩溃时恢复表结构。



MEMORY 存储引擎 ==================================

使用MySQL Memory存储引擎的出发点是速度。为得到最快的响应时间,采用的逻辑存储介质是系统内存。
虽然在内存中存储表数据确实会提供很高的性能,但当mysqld守护进程崩溃时,所有的Memory数据都会丢失。
MEMORY存储引擎存储数据的位置是内存,因此访问速度最快,但是安全上没有保障。适合于需要快速的访问或临时表。

适合于以下应用场景:

1. 目标数据较小,而且被非常频繁地访问。在内存中存放数据,所以会造成内存的使用开销,
可以通过参数 max_heap_table_size控制 Memory表的大小,设置此参数,就可以限制Memory表的最大大小。
2.如果数据是临时的,而且要求必须立即可用,那么就可以存放在内存表中。
3.存储在Memory表中的数据如果突然丢失,不会对应用服务产生实质的负面影响。

create table users
(
id smallint unsigned not null auto_increment,
username varchar(15) not null,
pwd varchar(15) not null,
index using btree (username),
primary key (id)
)engine=memory;


MERGE 存储引擎 =========================================

MERGE存储引擎是一组 MyISAM 表的组合,这些 MyISAM 表结构必须完全相同,尽管其使用不如其它引擎突出,但是在某些情况下非常有用。
Merge表是几个相同 MyISAM表 的聚合器
Merge表中并没有数据,对Merge类型的表可以进行查询、更新、删除操作,这些操作实际上是对内部的MyISAM表进行操作。

Merge存储引擎的使用场景。

对于服务器日志这种信息,一般常用的存储策略是将数据分成很多表,每个名称与特定的时间段相关。
例如:可以用12个相同的表来存储服务器日志数据,每个表用对应各个月份的名字来命名。
当有必要基于所有12个日志表的数据来生成报表,这意味着需要编写并更新多表查询,以反映这些表中的信息。
与其编写这些可能出现错误的查询,不如将这些表合并起来使用一条查询,之后再删除Merge表,
而不影响原来的数据,删除Merge表只是删除Merge表的定义,对内部的表没有任何影响。


ARCHIVE 存储引擎 ========================================

Archive是归档的意思,在归档之后很多的高级功能就不再支持了,仅仅支持最基本的 插入和查询 两种功能。
在MySQL 5.5版以前,Archive是不支持索引,但是在MySQL 5.5以后的版本中就开始支持索引了。
Archive拥有很好的压缩机制,它使用zlib压缩库,压缩能力较强,在记录被请求时会实时压缩,所以它经常被用来当做 仓库使用。


BLACKHOLE 存储引擎 =======================================

黑洞存储引擎,可以应用于主备复制中的分发主库。



# Aria 存储引擎 ===========================================

Aria是MariaDB的一个全新的存储引擎,它是作为MyISAM存储引擎的替代者而开发的。
它的特点:

1. 拥有自动恢复功能
2. 比MyISAM更好的缓存系统,相对于MyISAM有一定提升。
3. 未来版本可能会支持事务。


总结: -----------------------------------------------------------------



images\21-4.png



如何选择mysql 的存储引擎》》========================

#########################
如何选择合适的存储引擎? 选择标准可以分为:
(1)是否需要支持事务;
(2)是否需要使用热备;
(3)崩溃恢复:能否接受崩溃;
(4)是否需要外键支持;

########################






查询存储引擎信息的相关命令 ===============================================


mysql 使用可拔插式 存储引擎,因此可以针对每一张表,使用不同的存储引擎。


1、查看服务器有哪些存储引擎可以使用? ##msyql> show engines;
2、查看当前系统默认的存储引擎 # MariaDB [class]> show variables like '%engine%';

3、查看某个存储引擎的相关 状态信息 ##MariaDB [class]> show variables like '%innodb%' ;

## 实时调整 上述的 系统 状态值,使用 set set global innodb_file_per_table=1 ; (如果要调整的对象是全局变量,则需要加 global)

4、指定某个表的存储引擎 #建表时直接指定: CREATE TABLE mytable (id int, titlechar(20)) ENGINE = INNODB
#后续修改: ALTER TABLE engineTest ENGINE = INNODB; ##尽量不要修改存储引擎。

5、修改系统默认存储引擎 ## vim /etc/my.cnf 加上: 做永久修改,重启剩下。 set 是在当前会话状态 seesion 中修改。立刻生效

default-storage-engine=INNODB

images\21-5.png


如果表建立的时候是MyISAM,要更改整个数据库表的存储引擎,一般要一个表一个表的修改,比较繁琐,
可以采用先把数据库导出,得到SQL,把MyISAM修改成INNODB,再导入的方式。




InnoDB 存储引擎 表空间的含义 ================================================


images\21-6.png


undo log 撤销日志。 redo 重做日志。



文件系统的指标:==============

1、最大能支持多少空间。
2、单个文件最大能有多大。
3、IO速度
4、是否支持日志


Ext4 的文件系统容量达到 1EB,而单个文件容量则达到 16TB
XFS 是 一个64位文件系统,最大支持 8EB 文件系统


Linux OS ---------- 单个文件大小限制
Innodb ------------ 单个表的大小


共享表空间:--------------------------------------------------------------------

Innodb的所有数据保存在一个单独的表空间里面,而这个表空间可以由很多个文件组成, 例如 ibdata1==》 ibdata2==》ibdata3
一个表可以跨多个文件存在,所以表的大小限制不再是文件系统单独文件的大小的限制,而是其自身的限制。
从Innodb的官方文档中可以看到,其 表
空间的最大限制为64TB,也就是说,Innodb的单表限制基本上也在 64TB 左右了,
这个大小是包括这个表的所有索引等其他相关数据。



所有的数据和索引存放到一个文件中,将有一个很常大的文件,虽然可以把一个大文件分成多个小文件,但是多个表及索引在表空间中混合存储,
这样对于一个表做了大量删除操作后表空间中将会有大量的空隙,特别是对于统计分析,日志系统这类应用最不适合用共享表空间。



独立表空间:--------------------------------------------------------------------

每一个表都将会生成以独立的文件方式来进行存储,每一个表都有一个 .frm 表描述文件,还有一个.ibd
(这个文件包括了单独一个表的数据内容以及
索引内容)。
可以实现单表在不同的 数据库中移动。

使用独享表空间来存放Innodb的表的时候,每个表的数据以一个单独的文件来存放,这个时候的单表限制
又变成文件系统的大小限制了( ext4 的 16TB )。

所以当单表占用空间过大时,存储空间不足,只能从操作系统层面思考解决方法;

查看数据表空间信息 : MariaDB [(none)]> show variables like 'innodb_data%';

images\21-7.png




###
###
总结:当数据量很小的时候建议使用 共享表空间的管理方式
### 数据量很大的时候建议使用 独立表空间的管理方式。 (后续一些备份和集群组件,需要 独立表空间的支持。)

独立表空间的管理方式, 单表如果会超过16TB
### 1、更换文件系统 XFS + 独立表空间 =========》 64TB
### 2、使用 ext4 + 共享表空间===============》 64TB
### 3、使用 ext4 + 独立表空间 ==============》 16TB




独立表空间 和 共享表空间的 转换 ===================================================


查看当前系统默认使用的 -----------------------------------------------------
是共享表空间 还是 独立表空间

mysql> show variables like "innodb_file_per_table";

MariaDB [(none)]> show variables like "innodb_file_per_table";
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| innodb_file_per_table | OFF | ##OFF 表示不开启 独立空间, 也就是默认使用共享表空间。
+-----------------------+-------+

临时修改 该参数: MariaDB [(none)]> set global innodb_file_per_table=1 ;
Query OK, 0 rows affected (0.01 sec)

永久修改 该参数:在my.cnf里面增加 innodb_file_per_table=1 ##默认使用共享表空间。
重新载入配置文件生效 reload

共享表空间转化为独立表空间的方法------------------------------------------

###### 1、设置好参数 innodb_file_per_table=1
修改innodb_file_per_table的参数值后,不会影响之前已经使用过的共享表空间和独立表空间;

###### 2、 单个表的转换操作,脚本:alter tables students engine=innodb;
自动从原先的共享表空间中拆分数据,形成 独立表空间。

[root@class2 class]# ll
total 156
-rw-rw---- 1 mysql mysql 65 Jan 9 17:03 db.opt
-rw-rw---- 1 mysql mysql 8896 Jan 10 00:43 students.frm
-rw-rw---- 1 mysql mysql 131072 Jan 10 00:43 students.ibd


修改独占空表空间配置,以下几个参数可以一起加入:=============================


MariaDB [class]> show variables like '%innodb%' ; ## 查看与 innodb 有关的设置项目。


innodb_data_home_dir = "/usr/local/mysql/var/" ## 数据库文件所存放的目录,不设置的话, 默认与数据库目录在一起
innodb_log_group_home_dir = "./" ## innodb redo 重做 日志存放目录
innodb_data_file_path=ibdata1:10M:autoextend
innodb_file_per_table=1 是否使用共享以及独占表空间(1 为使用独占表空间,0 为使用共享表空间)
设置配置一个可扩展大小的尺寸为10MB的单独文件(共享数据文件),名为ibdata1。
没有给出文件的位置,所以默认的是在MySQL的数据目录内(如 /db/mysql/ibdata1)。


一段连续的空间, |S | S | S | S | S |S| S|S|S| S | A | A |A |



练习:==============================

1. 建立四张表,存储引擎分别为MyISAM
2. 通过show create table 表名查看表的创建过程
3. 插入数据(插入前要查看表的结构) ls -l

mysql> desc blackhole1;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> insert into blackhole1 values(1);
Query OK, 1 row affected (0.00 sec)

mysql> select * from blackhole1;
Empty set (0.00 sec