一、mysql存储引擎
mysql程序结构:
1.连接层:
验证身份
提供两种连接方式
建立与SQL层的交互
2.SQL层:
接收连接层传过来的sql语句
验证语法,验证语义
解析器
优化器
执行器
跟存储引擎层建立交互
写缓存
记录日志
3.存储引擎层:
接收SQL层传来的sql语句
与磁盘进行交互,获取数据
跟SQL层建立交互
存储引擎就是mysql的文件系统
1.MySQL提供的存储引擎
01)InnoDB
数据经常添加,查询,修改,删除,使用InnoDB存储引擎(事务),适合涉及钱或者数据准确性高的公司
02)MyISAM
只读取或者添加,可以使用MyISAM存储引擎
03)MEMORY
支持hash索引
04)ARCHIVE
05)FEDERATED
06)EXAMPLE
07)BLACKHOLE
08)MERGE
09)NDBCLUSTER
10)CSV
01)MySQL当中插件式的存储引擎类型
MySQL的两个分支
02)perconaDB
03)mariaDB
mysql> show engines
mysql> select table_schema,table_name,engine from information_schema.tables where engine='innodb';
mysql> select table_schema,table_name,engine from information_schema.tables where engine='myisam';
mysql> select * from tables where table_name='city'\G
2.innodb和myisam的物理区别
-rw-rw---- 1 mysql mysql 10684 Apr 13 20:27 user.frm
-rw-rw---- 1 mysql mysql 1240 Apr 21 15:59 user.MYD
-rw-rw---- 1 mysql mysql 2048 Apr 21 15:59 user.MYI
-rw-rw---- 1 mysql mysql 8698 Apr 21 16:03 xuesheng.frm
-rw-rw---- 1 mysql mysql 98304 Apr 21 16:07 xuesheng.ibd
3. innodb 核心特性
MVCC
事务
行级锁
热备份
自动故障恢复(CSR)Crash Safe Recovery
4.存储引擎相关命令
1)查看当前的存储引擎
mysql> SELECT @@default_storage_engine;
+--------------------------+
| @@default_storage_engine |
+--------------------------+
| InnoDB |
+--------------------------+
1 row in set (0.00 sec)
mysql> show create table city;
mysql> select * from tables where table_name='city'\G
2)修改默认的存储引擎
mysql> set @@default_storage_engine=myisam;
[root@db02 ~]
[mysqld]
default_storage_engine=myisam
[root@db02 ~]
3)建表的时候设置存储引擎
mysql> create table lhd(id int) engine=myisam;
二、真实企业案例
1.项目背景
公司原有的架构:一个展示型的网站,LAMT,MySQL5.1.77版本(MYISAM),50M数据量
1)小问题不断:
1、表级锁:对表中任意一行数据修改类操作时,整个表都会锁定,对其他行的操作都不能同时进行。
2、不支持故障自动恢复(CSR):当断电时有可能会出现数据损坏或丢失的问题。
2)提出解决方案
1、提建议将现有的MYISAM引擎替换为Innodb,将版本替换为5.6.38
1)如果使用MYISAM会产生”小问题”,性能安全不能得到保证,使用innodb可以解决这个问题。
2)5.1.77版本对于innodb引擎支持不够完善,5.6.38版本对innodb支持非常完善了。
2、实施过程和注意要素
2.解决问题
1)准备一个5.6.38版本的新数据库
2)备份数据库数据
[root@db02 mysql]
3)批量修改存储引擎
[root@db01 ~]
4)将数据推到新数据库
[root@db02 mysql]
5)将数据导入新的数据库
mysql> source /tmp/full.sql;
6)应用测试环境连接新库,测试所有功能
7)生产应用割接到新数据库
三、Innodb 存储引擎的表空间
1.共享表空间
1)存储的内容
1.系统数据
2.undo redo log,undo log 事务的日志
3.临时表
2)查看共享表空间
mysql> show variables like '%path%';
+----------------------------------+------------------------+
| Variable_name | Value |
+----------------------------------+------------------------+
| innodb_data_file_path | ibdata1:12M:autoextend |
+----------------------------------+------------------------+
5 rows in set (0.00 sec)
3)配置共享表空间
[root@db02 mysql]
[mysqld]
innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend
[root@db01 data]
[root@db02 ~]
Starting MySQL. ERROR! The server quit without updating PID file (/usr/local/mysql-5.6.46/data/db02.pid).
[ERROR] InnoDB: Data file ./ibdata1 is of a different size 768 pages (rounded down to MB) than specified in the .cnf file 3200 pages!
[root@db02 mysql]
[mysqld]
innodb_data_file_path=ibdata1:76M;ibdata2:50M:autoextend
[root@db02 ~]
2.独立表空间
对于用户自主创建的表,会采用此种模式,每个表由一个独立的表空间进行管理
1)查看独立表空间
[root@db01 lhd]
/service/mysql/data/lhd
[root@db01 lhd]
total 220
-rw-rw---- 1 mysql mysql 61 Apr 14 14:43 db.opt
-rw-rw---- 1 mysql mysql 8640 Apr 22 12:21 qiudao.frm
-rw-rw---- 1 mysql mysql 98304 Apr 22 12:21 qiudao.ibd
-rw-rw---- 1 mysql mysql 8854 Apr 22 12:21 student.frm
-rw-rw---- 1 mysql mysql 98304 Apr 22 12:21 student.ibd
mysql> show variables like '%per_table%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
1 row in set (0.00 sec)
企业案例
在没有备份数据的情况下,突然断电导致表空间或表结构损坏,打不开数据库。
2)模拟数据库表损坏
[root@db01 ~]
[root@db01 data]
[root@db01 data]
[root@db04 ~]
[root@db04 data]
mysql> show databases;
mysql> use world
mysql> show tables;
+-----------------+
| Tables_in_world |
+-----------------+
| city |
| country |
| countrylanguage |
+-----------------+
3 rows in set (0.00 sec)
mysql> select * from city;
ERROR 1146 (42S02): Table 'world.city' doesn't exist
3.解决数据表损坏问题
CREATE TABLE `city_new` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Name` char(35) NOT NULL DEFAULT '',
`CountryCode` char(3) NOT NULL DEFAULT '',
`District` char(20) NOT NULL DEFAULT '',
`Population` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`),
KEY `CountryCode` (`CountryCode`)
) ENGINE=InnoDB AUTO_INCREMENT=4080 DEFAULT CHARSET=latin1;
mysql> use world
mysql> alter table city_new discard tablespace;
Query OK, 0 rows affected (0.00 sec)
[root@db04 world]
[root@db04 world]
mysql> select * from city_new;
ERROR 1814 (HY000): Tablespace has been discarded for table 'city_new'
mysql> alter table city_new import tablespace;
Query OK, 0 rows affected, 1 warning (0.04 sec)
mysql> select * from city_new;
[root@db04 world]
mysql> alter table city_new rename city;
Query OK, 0 rows affected (0.00 sec)