一、Innodb存储引擎之表空间介绍
1、什么是共享表空间和独立表空间?
共享表空间以及独立表空间都是针对innodb表的数据存储而言的,ibdata1为innodb引擎的存储数据与索引的数据文件,ib_logfile0与ib_logfile1为innodb引擎使用的日志文件。
共享表空间: mysql服务器中所有数据库的innodb表(数据、索引)全部放在一个文件中,默认这个共享表空间的文件路径在data目录下,默认的文件名为:ibdata1 初始化为12M。
独占表空间:每一个表都将会生成以独立的文件方式来进行存储,每一个表都有一个.frm表描述文件,还有一个.ibd文件, 其中这个文件包括了单独一个表的数据内容以及索引内容,默认情况下它的存储位置也是在表的位置之中。
5.5版本以后出现共享表空间概念:表空间的管理模式的出现是为了数据库的存储更容易扩展。
5.6版本中默认的是独立表空间。
2、共享表空间
1)查看共享表空间
#物理查看
[root@db01 ~]# ll /application/mysql/data/ -h
-rw-rw---- 1 mysql mysql 12M Mar 14 02:14 ibdata1
#命令行查看
mysql> show variables like '%path%';
+-----------------------+------------------------+
| Variable_name | Value |
+-----------------------+------------------------+
| innodb_data_file_path | ibdata1:12M:autoextend | #自动扩容
+-----------------------+------------------------+
2)共享表空间存放了哪些东西?
- 系统数据
- undo
- 临时表(5.7版本中默认会将undo和临时表独立出来,5.6版本也可以独立,只不过需要在初始化的时候进行配置)
3)扩展共享表空间
#编辑配置文件
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend #ibdata1需要根据实际大小配置(自动扩容)
#重启数据库
[root@db01 ~]# /etc/init.d/mysqld restart
3、独立表空间
对于用户自主创建的表,会采用此种模式,每个表由一个独立的表空间进行管理 。
1)查看独立表空间
#物理查看
[root@db01 ~]# ll /application/mysql/data/world -h
-rw-r----- 1 mysql mysql 8.6K Mar 28 11:25 city_new.frm #表的描述文件
-rw-r----- 1 mysql mysql 32M Mar 28 11:25 city_new.ibd #数据内容索引内容
#命令行查看
mysql> show variables like '%per_table%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
1 row in set (0.00 sec)
二、Innodb核心特性之事务
1、事务的具体定义?
事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元,组成事务的所有操作只有在所有操作均能正常执行的情况下方能提交,只要其中任一操作执行失败,都将导致整个事务的回滚。
主要针对DML语句(update,delete,insert),一组数据操作执行步骤,这些步骤被视为一个工作单元:
- 用于多个语句进行分组;
- 可以在多个客户机并发访问同一个表中的数据时使用;
- 如果所有步骤正常,则执行;
- 如果步骤出现错误或不完整,则取消;
简单地说,事务提供一种“要么什么都不做,要么做全套(All or Nothing)”机制。
2、事务的通俗理解
事务伴随着“交易”出现的数据库概念,那我们理解的交易是什么:
- 物与物的交换(古代)
- 货币现金与实物的交换(现代一)
- 虚拟货币与实物的交换(现代二)
- 虚拟货币与虚拟实物交换(现代三)等
数据库中的“交易”是什么:
- 事务又是如何保证“交易”的“和谐”
- ACID
3、事务ACID特性
Atomic(原子性)
所有语句作为一个单元全部成功执行或全部取消。
Consistent(一致性)
如果数据库在事务开始时处于一致状态,则在执行该事务期间将保留一致状态。
Isolated(隔离性)
事务之间不相互影响。
Durable(持久性)
事务成功完成后,所做的所有更改都会准确地记录在数据库中,所做的更改不会丢失。
4、事物流程举例
5、事务的控制语句
语句 | 释义 |
start transaction(或begin) | 显式开始一个新事务 |
savepoint | 分配事务过程中的一个位置,以供将来引用 |
commit | 永久记录当前事务所做的更改 |
rollback | 取消当前事务所做的更改 |
rollback to savepoint | 取消在 savepoint 之后执行的更改 |
release savepoint | 删除 savepoint 标识符 |
set autocommit | 为当前连接禁用或启用默认 autocommit 模式 |
6、事务演示
1)一个成功事务的生命周期:
begin;
sql1
sql2
sql3
...
commit;
#成功事务
mysql> create table student(id int,name varchar(10),sex enum('f','m'),money int);
mysql> begin;
mysql> insert into student(id,name,sex,money) values(1,'zhang3','m',100), (2,'li4','m',200);
mysql> commit;
2)一个失败事务的生命周期:
begin;
sql1
sql2
sql3
...
rollback;
#事务回滚
mysql> begin;
mysql> update student set name='zhang3';
mysql> delete from student;
mysql> rollback;
3)执行DML语句会自动开启一个事务,自动提交(update修改数据默认commit);
#查看自动提交状态(默认开启)
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.00 sec)
#临时关闭
mysql> set autocommit=0;
#永久关闭
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
autocommit=0
7、事务隐式提交情况
现在版本在开启事务时,不需要手工begin,只要你输入的是DML语句,就会自动开启事务。
有些情况下事务会被隐式提交:
- 在事务运行期间,手工执行begin的时候会自动提交上个事务;
- 在事务运行期间,加入DDL、DCL操作会自动提交上个事务(DQL不会提交);
- 在事务运行期间,执行锁定语句(lock tables、unlock tables);
- load data infile #导入数据;
- select for update #更改的过程中去查询
- autocommit=1 #自动提交
8、事务日志
redo
1)redo是什么?
redo,顾名思义“重做日志”,是事务日志的一种;
2)redo的作用?
在事务ACID过程中,实现的是“D”持久化的作用;
3)redo的特性?
特性:WAL(Write Ahead Log)日志优先写;
REDO:记录的是,内存数据页的变化过程;
4)redo的存储位置
[root@db02 ~]# cd /application/mysql/data/
[root@db02 data]# ll
-rw-rw---- 1 mysql mysql 50331648 Mar 26 00:34 ib_logfile0
-rw-rw---- 1 mysql mysql 50331648 Mar 25 18:40 ib_logfile1
[root@db02 data]# du -sh ib_logfile0 ib_logfile1
48M ib_logfile0
48M ib_logfile1
5)Redo的工作过程
#执行步骤
update t1 set num=2 where num=1;
1)首先将t1表中num=1的行所在数据页加载到内存中buffer page
2)MySQL实例在内存中将num=1的数据页改成num=2
3)num=1变成num=2的变化过程会记录到,redo内存区域,也就是redo buffer page中
#提交事务执行步骤
commit;
1)当敲下commit命令的瞬间,MySQL会将redo buffer page写入磁盘区域redo log
2)当写入成功之后,commit返回ok
undo
1)undo是什么?
undo,顾名思义“回滚日志”,是事务日志的一种;
2)undo的作用?
在事务ACID过程中,实现的是“A”原子性的作用。当然CI的特性也和undo有关;
3)undo的存储位置
[root@db02 ~]# cd /application/mysql/data/
[root@db02 data]# ll
-rw-rw---- 1 mysql mysql 12582912 Mar 26 00:34 ibdata1
[root@db02 data]# du -sh ibdata1
12M ibdata1
#在MySQL5.6版本中undo是在ibdata文件中,在MySQL5.7版本会独立出来。
9、undo、redo数据实例恢复过程