创建表的时候就会得到元数据。可以通过定义的方式对表的元数据进行生成

这个地方要注意的是

独立表空间当中   ibd & frm分别存储的是什么数据?

表空间:文件系统,为了更好的扩容数据库的存储空间

5.5以后的版本出现了共享表空间概念

表空间管理模式的出现是为了数据库的存储更容易扩展

5.6版本种默认的是独立表空间

1、共享表空间:共享表空间用来存元数据和系统日志

show variables like '%path%';

innodb_data_file_path=ibdata1:12M:autoextend    #默认只有1个共享表空间的文件 默认大小是12M 12M用完会自动增加

文件目录下:/data  通过ls –lh查看

-rw-rw----. 1 mysql mysql  76M Aug  2 22:18 ibdata1

5.6种默认存储什么?

系统数据、undo、临时表

5.7中,会将undo和临时表也都独立出来

vim /etc/my.cnf

innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend   --->错误的写法

第一个50需要注意,需要与当前文件的ibdata1大小一致

[ERROR] InnoDB: Data file ./ibdata1 is of a different size 4864 pages (rounded down to MB) than

specified in the .cnf file 3200 pages!

参数应该更改为:

innodb_data_file_path=ibdata1:76M;ibdata2:50M:autoextend

一般企业会设置2个 512M或者2G

2、独立表空间(5.6以后的默认模式):

对于用户自主创建的表,会采用此种模式,每个表由一个独立的表空间进行管理

-rw-rw---- 1 mysql mysql   8710 Jun 25 16:25 city.frm

-rw-rw---- 1 mysql mysql 671744 Jun 25 16:25 city.ibd

city.ibd就被称之为独立表空间的数据文件

city.frm就是元数据文件  就是创建表后生成的

独立表空间可以通过开关控制 建议不要修改 一旦关闭就会存到共享表空间里去了

mysql> show variables like '%per_table%';

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

| Variable_name         | Value |

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

| innodb_file_per_table | ON    |

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

1 row in set (0.00 sec)

mysql>

alter table city discard tablespace;

alter table city import tablespace;

例子实践:

这个案例主要就是当表只存在frm文件时,通过之前创建表的语句创造出ibd文件,再重新导入表空间,这样就可以使用了

复制文件夹及文件夹下所有文件到对应文件夹

[root@db01 data]# cp -r db /data/3307/data/

第一个里程碑:在数据库文件下进行文件备份  模拟删除

[root@db01-sa world]# pwd

/application/mysql/data/world

[root@db01-sa world]# cp city.ibd city.ibd.bak

第二个里程碑:删除表空间&查看表

mysql> alter table world.city discard tablespace;

Query OK, 0 rows affected (0.34 sec)

mysql> select * from world.city;

ERROR 1814 (HY000): Tablespace has been discarded for table 'city'

第三个里程碑:恢复ibd文件&将文件属组给mysql

[root@db01-sa world]# cp city.ibd.bak city.ibd

[root@db01-sa world]# chown -R mysql.mysql city.ibd

第四个里程碑:重新赋予表空间

mysql> alter table world.city import tablespace;

Query OK, 0 rows affected, 1 warning (0.13 sec)

mysql> select * from city;

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

| ID   | Name                               | CountryCode | District               | Population |

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

|    1 | Kabul                              | AFG         | Kabol                  |    1780000 |

|    2 | Qandahar                           | AFG         | Qandahar               |     237500 |

|    3 | Herat                              | AFG         | Herat                  |     186800 |

|    4 | Mazar-e-Sharif                     | AFG         | Balkh                  |     127800 |

|    5 | Amsterdam                          | NLD         | Noord-Holland          |     731200 |

|    6 | Rotterdam                          | NLD         | Zuid-Holland           |     593321 |

|    7 | Haag                               | NLD         | Zuid-Holland           |     440900 |

|    8 | Utrecht                            | NLD         | Utrecht                |     234323 |

补充:如果在物理层面直接删除ibd文件会怎样?

mysql> select * from city;

ERROR 1146 (42S02): Table 'world.city' doesn't exist

第一个里程碑:将ibd文件备份恢复& 修改文件属组

[root@db01-sa world]# cp city.ibd.bak city.ibd

[root@db01-sa world]# chown -R mysql.mysql city.ibd

第二个里程碑:重启数据库

[root@db01-sa ~]# /etc/init.d/mysqld restart

第三个里程碑:查看表能否打开

mysql> select * from city;

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

| ID   | Name                               | CountryCode | District               | Population |

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

|    1 | Kabul                              | AFG         | Kabol                  |    1780000 |

|    2 | Qandahar                           | AFG         | Qandahar               |     237500 |

|    3 | Herat                              | AFG         | Herat                  |     186800 |

|    4 | Mazar-e-Sharif                     | AFG         | Balkh                  |     127800 |

|    5 | Amsterdam                          | NLD         | Noord-Holland          |     731200 |

|    6 | Rotterdam                          | NLD         | Zuid-Holland           |     593321 |

备注:此次2个案例只在虚拟机上测试,最好是跨虚拟机再测试下

虚拟机上测试OK

truncate 作用一样 类似于discard 表空间

七、老男孩Linux——MySQL学员案例

生产库:

confulence库   jira库

联想服务器(IBM)

磁盘500G 没有raid

centos 6.8

mysql 5.6.33  innodb引擎  独立表空间

编译→制作rpm

/usr/bin/mysql

/var/lib/mysql

confulence   jira

所有软件和数据都在"/"

断电了,启动完成后“/” 只读

fsck   重启

结果: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;

虚拟机测试可行。

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`),

KEY `idx_popu` (`Population`)

) ENGINE=InnoDB AUTO_INCREMENT=4080 DEFAULT CHARSET=latin1;

面临的问题,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个表无法成功。主外键关系

ERROR 1215 (HY000): Cannot add foreign key constraint

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

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)

案例模仿:

案例最新:

经过测试跨虚拟机也是可以成功的,如果需要foreign key的检查用set忽略 先把表结构导进去再说;

#第一个里程碑:导出建表的语句

CREATE TABLE `city` (

`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`),

CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `country` (`Code`)

) ENGINE=InnoDB AUTO_INCREMENT=4080 DEFAULT CHARSET=latin1

#第二个里程碑:将表数据备份出来 防止万一

[root@db01-sa world]# mysqldump -uroot -p123 world city >/server/scripts/backup_world_city.sql

#第三个里程碑:检查查看备份语句是否正常

[root@db01-sa world]# cat /server/scripts/backup_world_city.sql

#第四个里程碑:

mysql> drop table world.city;

Query OK, 0 rows affected (0.05 sec)

mysql> show tables;

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

| Tables_in_world |

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

| country         |

| countrylanguage |

| people          |

| people_bak      |

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

4 rows in set (0.00 sec)

[root@db01-sa world]# ll

total 1248

-rw-r----- 1 root  root    8710 Jun 26 23:11 city.frm.bak

-rw-r----- 1 root  root  589824 Jun 26 22:49 city.ibd.bak

#第五个里程碑:

CREATE TABLE `city` (

`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`),

CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `country` (`Code`)

) ENGINE=InnoDB AUTO_INCREMENT=4080 DEFAULT CHARSET=latin1;

[root@db01-sa world]# \rm -fr city.ibd

[root@db01-sa world]# cp city.ibd.bak city.ibd

[root@db01-sa world]# chown -R mysql.mysql city.ibd

mysql> use world;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

mysql> show tables;

ERROR 2006 (HY000): MySQL server has gone away

No connection. Trying to reconnect...

Connection id:    1

Current database: world

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

| Tables_in_world |

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

| city            |

| country         |

| countrylanguage |

| people          |

| people_bak      |

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

5 rows in set (0.01 sec)

mysql> select * from city;

ERROR 1146 (42S02): Table 'world.city' doesn't exist

mysql> alter table world.city import tablespace;#导入表空间

Query OK, 0 rows affected, 2 warnings (0.10 sec)

mysql> select * from city;

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

| ID   | Name                               | CountryCode | District               | Population |

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

|    1 | Kabul                              | AFG         | Kabol                  |    1780000 |

|    2 | Qandahar                           | AFG         | Qandahar               |     237500 |

|    3 | Herat                              | AFG         | Herat                  |     186800 |

|    4 | Mazar-e-Sharif                     | AFG         | Balkh                  |     127800 |

MySQL 独立表空间恢复案例的更多相关文章

  1. mysql共享表空间转独立表空间

    使用innodb_export_import.py脚本: https://github.com/thecpaneladmin/innodb-tools 安装MySQL-python模块: shell ...

  2. MySQL Innodb Engine --独立表空间参数(innodb_file_per_table)

    MySQL中参数innodb_file_per_table决定将表存放于ibdata*的共享表空间还是独立的.ibd文件的独立表空间. ================================ ...

  3. mysql 共享空间转为独立表空间

    由于以前的mysql配置为共享表空间,服务器空间不足,清理日志表里的数据后,数据库并没缩小,照成空间浪费,现在修改为独立表空间 #独立表空间innodb_file_per_table=1 #停止事物日 ...

  4. Mysql InnoDB 共享表空间和独立表空间

    前言:学习mysql的时候总是习惯性的和oracle数据库进行比较.在学习mysql InnoDB的存储结构的时候也免不了跟oracle进行比较.Oracle的数据存储有表空间.段.区.块.数据文件: ...

  5. MySQL 参数- Innodb_File_Per_Table(独立表空间)

    Innodb存储引擎可将所有数据存放于ibdata*的共享表空间,也可将每张表存放于独立的.ibd文件的独立表空间.共享表空间以及独立表空间都是针对数据的存储方式而言的. 共享表空间某一个数据库的所有 ...

  6. mysql中独立表空间与共享表空间之前如何切换

    环境 mysql版本:5.7.19 官方文档:(https://dev.mysql.com/doc/refman/5.7/en/innodb-multiple-tablespaces.html) 查看 ...

  7. [Mysql]Innodb 独立表空间和共享表空间

    innodb有2中表空间方式: 共享表空间 和 独立表空间 查询数据的设置: show variables like '%per_table'; 默认是共享表空间,独立表空间在配置文件中添加 inno ...

  8. mysql tablespace(独立表空间)超速备份大数据

    前序 对于用户自主创建的表,会采用此种模式,每个表由一个独立的表空间进行管理备份(速度相当的猛) 首先介绍一下文件 .ibd就被称之为独立表空间的数据文件 .frm就是元数据文件 就是创建表后生成的 ...

  9. MySQL如何判别InnoDB表是独立表空间还是共享表空间

    InnoDB采用按表空间(tablespace)的方式进行存储数据, 默认配置情况下会有一个初始大小为10MB, 名字为ibdata1的文件, 该文件就是默认的表空间文件(tablespce file ...

随机推荐

  1. URL编码表(收集到的,为了方便查看)

    URL编码表

  2. SpringMVC整合Thymeleaf

    Thymeleaf的介绍 进行JavaWeb开发时主要用到的是JSP,传统的JSP需要在页面中加入大量的JSTL标签,这些标签只能运行在服务器中,前端开发人员维护这些页面比较困难,页面加载速度也比较慢 ...

  3. 【UOJ#22】【UR#1】外星人

    2044年,Picks建成了人类第一台基于量子理论的银河系信息传递机. Picks游遍了宇宙,雇用了 n 个外星人来帮他作为信息传递机的中转站.我们将外星人依次编号为 1 到 n,其中 i 号外星人有 ...

  4. 【BZOJ4300】 绝世好题

    傻逼题都不能一眼看出思路…… 原题: 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). n<=100000,ai&l ...

  5. 你真的了解word-wrap和word-break的区别吗? (转载)

    这两个东西是什么,我相信至今还有很多人搞不清,只会死记硬背的写一个word-wrap:break-word;word-break:break-all;这样的东西来强制断句,又或者是因为这两个东西实在是 ...

  6. 新安装的win7/win10系统,所有驱动都没安装,插入U盘也无法识别解决方法

    我是使用老毛挑安装的系统,结果安装好之后,才发现所有驱动都没有安装,例如usb,网卡驱动等 解决方法就是先把驱动下载到系统安装盘里面,然后再次进入安装系统界面,相当于重新安装系统,但实际上我们不需要. ...

  7. mysql将某数据库的全部权限赋给某用户,提示1044错误Access denied

    mysql> grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbix'; ERROR 1044 (4 ...

  8. zabbix——拓扑图入门

    zabbix的拓扑图是动态的,当你配置好拓扑图后,一旦网络中那个节点出现了问题,很容易在拓扑图中看出问题具体出在哪个位置. 新建一个拓扑图 我们常用到的图标有rack(机柜)还有rackmountab ...

  9. 基于lfslivecd-x86-6.3-r2145安装vnc和qemu

    文章目录 把lfslivecd复制到硬盘上使用 编译安装vnc 前后下载了多个软件包进行编译安装 编译VNC 启动VNC 编译安装qemu 启动VNC客户端并连接虚拟机的vncviewer 把lfsl ...

  10. Unity Blog 学习

    The Profiler window https://unity3d.com/cn/learn/tutorials/temas/performance-optimization/profiler-w ...