共享表空间以及独立表空间都是针对innodb表的数据存储而言的,ibdata1为innodb引擎的存储数据与索引的数据文件,ib_logfile0与ib_logfile1为innodb引擎使用的日志文件。
共享表空间: mysql服务器中所有数据库的innodb表(数据、索引)全部放在一个文件中,默认这个共享表空间的文件路径在data目录下,默认的文件名为:ibdata1 初始化为12M。
独占表空间:每一个表都将会生成以独立的文件方式来进行存储,每一个表都有一个.frm表描述文件,还有一个.ibd文件, 其中这个文件包括了单独一个表的数据内容以及索引内容,默认情况下它的存储位置也是在表的位置之中。
5.5版本以后出现共享表空间概念:表空间的管理模式的出现是为了数据库的存储更容易扩展。
5.6版本中默认的是独立表空间。
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)共享表空间存放了哪些东西?
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
对于用户自主创建的表,会采用此种模式,每个表由一个独立的表空间进行管理 。
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)
事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元,组成事务的所有操作只有在所有操作均能正常执行的情况下方能提交,只要其中任一操作执行失败,都将导致整个事务的回滚。
主要针对DML语句(update,delete,insert),一组数据操作执行步骤,这些步骤被视为一个工作单元:
简单地说,事务提供一种“要么什么都不做,要么做全套(All or Nothing)”机制。
事务伴随着“交易”出现的数据库概念,那我们理解的交易是什么:
数据库中的“交易”是什么:
Atomic(原子性)
所有语句作为一个单元全部成功执行或全部取消。
Consistent(一致性)
如果数据库在事务开始时处于一致状态,则在执行该事务期间将保留一致状态。
Isolated(隔离性)
事务之间不相互影响。
Durable(持久性)
事务成功完成后,所做的所有更改都会准确地记录在数据库中,所做的更改不会丢失。
语句 | 释义 |
start transaction(或begin) | 显式开始一个新事务 |
savepoint | 分配事务过程中的一个位置,以供将来引用 |
commit | 永久记录当前事务所做的更改 |
rollback | 取消当前事务所做的更改 |
rollback to savepoint | 取消在 savepoint 之后执行的更改 |
release savepoint | 删除 savepoint 标识符 |
set autocommit | 为当前连接禁用或启用默认 autocommit 模式 |
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
现在版本在开启事务时,不需要手工begin,只要你输入的是DML语句,就会自动开启事务。
有些情况下事务会被隐式提交:
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
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数据实例恢复过程