linux mysql innodb_Linux运维MySQL学习 InnoDB存储引擎物理存储结构 老男孩IT

6、InnoDB存储引擎物理存储结构

6.0 最直观的存储方式(/data/mysql/data)

ibdata1:系统数据字典信息(统计信息),UNDO表空间等数据

ib_logfile0 ~ ib_logfile1: REDO日志文件,事务日志文件。

ibtmp1: 临时表空间磁盘位置,存储临时表

frm:存储表的列信息

ibd:表的数据行和索引

6.1 表空间(Tablespace)

6.1.1、共享表空间

需要将所有数据存储到同一个表空间中 ,管理比较混乱

5.5版本出现的管理模式,也是默认的管理模式。

5.6版本以,共享表空间保留,只用来存储:数据字典信息,undo,临时表。

5.7 版本,临时表被独立出来了

8.0版本,undo也被独立出去了

6.1.2 共享表空间设置

共享表空间设置(在搭建MySQL时,初始化数据之前设置到参数文件中)

[(none)]>select @@innodb_data_file_path;

[(none)]>show variables like '%extend%';

innodb_data_file_path=ibdata1:512M:ibdata2:512M:autoextend

innodb_autoextend_increment=64

6.1.3 独立表空间

从5.6,默认表空间不再使用共享表空间,替换为独立表空间。

主要存储的是用户数据

存储特点为:一个表一个ibd文件,存储数据行和索引信息

基本表结构元数据存储:

xxx.frm

最终结论:

元数据            数据行+索引

mysql表数据    =(ibdataX+frm)+ibd(段、区、页)

DDL             DML+DQL

MySQL的存储引擎日志:

Redo Log: ib_logfile0  ib_logfile1,重做日志

Undo Log: ibdata1 ibdata2(存储在共享表空间中),回滚日志

临时表:ibtmp1,在做join union操作产生临时数据,用完就自动

6.1.4 独立表空间设置问题

db01 [(none)]>select @@innodb_file_per_table;

+-------------------------+

| @@innodb_file_per_table |

+-------------------------+

|                      1 |

+-------------------------+

alter table city dicard tablespace;

alter table city import tablespace;

6.1.5 真实的学生案例

案例背景:

硬件及软件环境:

联想服务器(IBM)

磁盘500G 没有raid

centos 6.8

mysql 5.6.33  innodb引擎  独立表空间

备份没有,日志也没开

开发用户专用库:

jira(bug追踪) 、 confluence(内部知识库)    ------>LNMT

故障描述:断电了,启动完成后“/” 只读

fsck  重启,系统成功启动,mysql启动不了。

结果:confulence库在  , jira库不见了

学员求助内容:

求助:

这种情况怎么恢复?

我问:

有备份没

求助:

连二进制日志都没有,没有备份,没有主从

我说:

没招了,jira需要硬盘恢复了。

求助:

1、jira问题拉倒中关村了

2、能不能暂时把confulence库先打开用着

将生产库confulence,拷贝到1:1虚拟机上/var/lib/mysql,直接访问时访问不了的

问:有没有工具能直接读取ibd

我说:我查查,最后发现没有

我想出一个办法来:

表空间迁移:

create table xxx

alter table  confulence.t1 discard tablespace;

alter table confulence.t1 import tablespace;

虚拟机测试可行。

处理问题思路:

confulence库中一共有107张表。

1、创建107和和原来一模一样的表。

他有2016年的历史库,我让他去他同时电脑上 mysqldump备份confulence库

mysqldump -uroot -ppassw0rd -B  confulence --no-data >test.sql

拿到你的测试库,进行恢复

到这步为止,表结构有了。

2、表空间删除。

select concat('alter table ',table_schema,'.'table_name,' discard tablespace;') from information_schema.tables where table_schema='confluence' into outfile '/tmp/discad.sql';

source /tmp/discard.sql

执行过程中发现,有20-30个表无法成功。主外键关系

很绝望,一个表一个表分析表结构,很痛苦。

set foreign_key_checks=0 跳过外键检查。

把有问题的表表空间也删掉了。

3、拷贝生产中confulence库下的所有表的ibd文件拷贝到准备好的环境中

select concat('alter table ',table_schema,'.'table_name,' import tablespace;') from information_schema.tables where table_schema='confluence' into outfile '/tmp/discad.sql';

4、验证数据

表都可以访问了,数据挽回到了出现问题时刻的状态(2-8)

更多内容请关注微信公众号:oldboyedu

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值