MySQL 独立表空间恢复案例
创建表的时候就会得到元数据。可以通过定义的方式对表的元数据进行生成
这个地方要注意的是
独立表空间当中 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 独立表空间恢复案例的更多相关文章
- mysql共享表空间转独立表空间
使用innodb_export_import.py脚本: https://github.com/thecpaneladmin/innodb-tools 安装MySQL-python模块: shell ...
- MySQL Innodb Engine --独立表空间参数(innodb_file_per_table)
MySQL中参数innodb_file_per_table决定将表存放于ibdata*的共享表空间还是独立的.ibd文件的独立表空间. ================================ ...
- mysql 共享空间转为独立表空间
由于以前的mysql配置为共享表空间,服务器空间不足,清理日志表里的数据后,数据库并没缩小,照成空间浪费,现在修改为独立表空间 #独立表空间innodb_file_per_table=1 #停止事物日 ...
- Mysql InnoDB 共享表空间和独立表空间
前言:学习mysql的时候总是习惯性的和oracle数据库进行比较.在学习mysql InnoDB的存储结构的时候也免不了跟oracle进行比较.Oracle的数据存储有表空间.段.区.块.数据文件: ...
- MySQL 参数- Innodb_File_Per_Table(独立表空间)
Innodb存储引擎可将所有数据存放于ibdata*的共享表空间,也可将每张表存放于独立的.ibd文件的独立表空间.共享表空间以及独立表空间都是针对数据的存储方式而言的. 共享表空间某一个数据库的所有 ...
- mysql中独立表空间与共享表空间之前如何切换
环境 mysql版本:5.7.19 官方文档:(https://dev.mysql.com/doc/refman/5.7/en/innodb-multiple-tablespaces.html) 查看 ...
- [Mysql]Innodb 独立表空间和共享表空间
innodb有2中表空间方式: 共享表空间 和 独立表空间 查询数据的设置: show variables like '%per_table'; 默认是共享表空间,独立表空间在配置文件中添加 inno ...
- mysql tablespace(独立表空间)超速备份大数据
前序 对于用户自主创建的表,会采用此种模式,每个表由一个独立的表空间进行管理备份(速度相当的猛) 首先介绍一下文件 .ibd就被称之为独立表空间的数据文件 .frm就是元数据文件 就是创建表后生成的 ...
- MySQL如何判别InnoDB表是独立表空间还是共享表空间
InnoDB采用按表空间(tablespace)的方式进行存储数据, 默认配置情况下会有一个初始大小为10MB, 名字为ibdata1的文件, 该文件就是默认的表空间文件(tablespce file ...
随机推荐
- (5)css样式导入
样式的组成 1.选择器:将样式与页面中的某一个或某些标签建立联系,就要使用选择器,在head标签下写一个style标签,将需控制参数的标签名写在这个style标签下,设置属性即可通过css来控制htm ...
- hdu4549 M斐波那契数列 矩阵快速幂+快速幂
M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给出a, b, n,你能求出F[n]的 ...
- redux笔记 进阶
1 拆分UI组件和容器组件 import React from 'react' const AppUI = (props) =>{ return ( <div className=&quo ...
- SpringMVC(二)高级
高级参数绑定 1.1. 绑定数组 1.1.1. 需求 在商品列表页面选中多个商品,然后删除. 1.1.2. 需求分析 功能要求商品列表页面中的每个商品前有一个checkbok,选中多个商品后点击删除按 ...
- SQLite数据库下载
一:SQLite简介 SQLite是一种嵌入式数据库,它的数据库就是一个文件.体积很小,经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以集成. 要操作关系数据库,首先需要连接到 ...
- centos7上部署vnc服务器并实现远程桌面
centos7上进行一下操作 [root@localhost ~]# yum install tigervnc-server -y#安装vnc服务器 Loaded plugins: fastestmi ...
- MySQL Binlog常用参数
====================================================================== MySQL Binlog常用参数 log_bin 设置此参 ...
- 使用btrace需要注意的几个问题
1. @ProbeClassName String clazz 此处String不能写为java.lang.String 2. location=@Location(Kind.RETURN) publ ...
- (android高仿系列)今日头条 --新闻阅读器 (二)
高仿今日头条 --- 第一篇:(android高仿系列)今日头条 --新闻阅读器 (一) 上次,已经完毕了头部新闻分类栏目的拖动效果. 这篇文章是继续去完好APP 今日头条 这个新闻阅读器的其 ...
- 让使用SQLite的.NET应用自适应32位/64位系统
如果一个.NET应用要自适应32位/64位系统,只需要在项目的“目标平台”设置为“Any CPU”.但是如果应用中使用了SQLite,情况就不同了. SQLite的.NET开发包来自是System.D ...