数据库:物理 *** 作系统或其他形式文件类型的集合。在mysql下数据库文件可以是frm,myd,myi,ibd结尾的文件。
数据库实例:由数据库后台进程/线程以及一个共享内存区组成。数据库实例才是真正用来 *** 作数据库文件的。
mysql数据库是单进程多线程的程序,与sql server比较类似。也就是说,Mysql数据库实例在系统上的表现就是一个进程。
在使用独立表空间的情况下,如果不慎使得innodb存储引擎的元数据文件ibdata损坏,我们还可以挽救宝贵的数据因为在innodb使用独立表空间的情况下,ibdata文件会记录每个innodb表的id,只要使得ibd中的表id和ibdata文件中记录的表id相同,就能够打开表,读取到数据
#创建表
CREATE TABLE `ibdtest` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`fid` int(11) NOT NULL COMMENT '表b中的id',
`content` char(255) NOT NULL COMMENT ' *** 作内容,系统生成',
`mark` char(255) NOT NULL COMMENT '备注',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
#添加数据
INSERT ibdtest (fid,content,mark) VALUES (1,'1','1'),(2,'2','2');
SELECT FROM ibdtest;
关闭MySQL将ibdtestibd copy出来,放到其他数据库中来模拟灾难
[root@localhost ~]#/opt/soft/mysql/bin/mysqladmin -p123456 shutdown
120130 18:31:50 mysqld_safe mysqld from pidfile /opt/soft/mysql/60137localdomainpid ended
[1]+ Done /opt/soft/mysql/bin/mysqld_safe--defaults-file=/opt/soft/mysql/config/mycnf --user=mysql
[root@localhost ~]# cd /home/soft/mysql/data/test/
[root@localhost test]# ll
total 1296
-rw-rw---- 1 mysql mysql 8612 Jan 18 00:06 afrm
-rw-rw---- 1 mysql mysql 98304 Jan 18 00:24 aibd
-rw-rw---- 1 mysql mysql 8624 Jan 30 08:34 areafrm
-rw-rw---- 1 mysql mysql 98304 Jan 30 08:36 areaibd
-rw-rw---- 1 mysql mysql 8642 Jan 18 00:05 bfrm
-rw-rw---- 1 mysql mysql 98304 Jan 18 00:08 bibd
-rw-rw---- 1 mysql mysql 8693 Jan 30 18:27 ibdtestfrm
-rw-rw---- 1 mysql mysql 98304 Jan 30 18:28 ibdtestibd
-rw-rw---- 1 mysql mysql 8728 Jan 6 16:23 testafrm
-rw-rw---- 1 mysql mysql 98304 Jan 10 04:10 testaibd
-rw-rw---- 1 mysql mysql 8693 Jan 30 14:30 testmcfrm
-rw-rw---- 1 mysql mysql 98304 Jan 30 14:30 testmcibd
-rw-rw---- 1 mysql mysql 8693 Jan 30 13:54 testmefrm
-rw-rw---- 1 mysql mysql 98304 Jan 30 13:55 testmeibd
-rw-rw---- 1 mysql mysql 8693 Jan 30 14:40 testmmfrm
-rw-rw---- 1 mysql mysql 98304 Jan 30 14:45 testmmibd
-rw-rw---- 1 mysql mysql 8693 Jan 30 13:40 testmufrm
-rw-rw---- 1 mysql mysql 98304 Jan 30 13:40 testmuibd
-rw-rw---- 1 mysql mysql 8693 Jan 30 11:08 testmvfrm
-rw-rw---- 1 mysql mysql 98304 Jan 30 11:10 testmvibd
-rw-rw---- 1 mysql mysql 8694 Jan 4 21:55 testuserfrm
-rw-rw---- 1 mysql mysql 98304 Jan 4 22:04 testuseribd
-rw-rw---- 1 mysql mysql 8644 Jan 14 21:55 userfrm
-rw-rw---- 1 mysql mysql 98304 Jan 14 21:55 useribd
[root@localhost test]# cp ibdtestibd /home/download/
[root@localhost test]# cd /home/download/
#vim打开ibd,使用16进制查看
[root@localhost download]# vim -b ibdtestibd
:%!xxd
从下图中能看到 此表在 当前mysql数据库中的id为0x10,即16
此时,我们假设灾难发生,ibdata损坏…
只剩下了ibdtestibd文,我们跳转到另一个mysql服务器上,用同样的建表语句创建ibdtest表
这时我们打开这个mysql服务器下的ibdtestibd看看:
这个表的id为0x16,即为22,那么,我们只需将原有的ibdtestibd表id修改为0x16即可
出保存的时候一定要记得使用:%!xxd -r
退出保存
并将修改好的文件覆盖掉新的ibdtestibd即可,
此mysql服务器会认为该表损毁,无法打开,没关系,修改innodb_force_recovery = 6,
重启mysql服务:
Select下,就知道数据是否恢复了没有:
此时,无法执行写 *** 作,应尽快将数据dump出来,修改innodb_force_recovery = 0,重启服务,创建新表后,把数据倒回去就ok了恢复数据就不演示了
1,每个数据库对应一个文件夹,文件夹名和库名相同;
2,(单独的表空间中) 每张表对应几个文件,文件名和表名相同,innodb引擎中对应两个文件,后缀名为:frm、ibd;
frm文件:存储的是表结构信息。
ibd文件:存储的是表里的数据、索引等。
一、系统表空间
在 MySQL 数据目录下有一个名为 ibdata1 的文件,可以保存一张或者多张表。
923275 12M -rw-r----- 1 mysql mysql 12M 3月 18 10:42 ibdata1
这个文件就是 MySQL 的系统表空间文件,默认为 1 个,可以有多个,只需要在配置文件 mycnf 里面这样定义即可。
innodb_data_file_path=ibdata1:200M;ibdata2:200M:autoextend:max:800M系统表空间不仅可以是文件系统组成的文件,也可以是非文件系统组成的磁盘块,比如裸设备,定义也很简单innodb_data_file_path=/dev/nvme0n1p1:3Gnewraw;/dev/nvme0n1p2:2Gnewraw
系统表空间里都有些啥内容?
具体内容包括:double writer buffer、 change buffer、数据字典(MySQL 80 之前)、表数据、表索引。
那 MySQL 为什么现在主流版本默认都不是系统表空间?
究其原因,系统表空间有三个最大的缺点:原因 1:无法做到自动收缩磁盘空间,造成很大的空间浪费。即使它包含的表都被删掉,这部分空间也不会自动释放。
二、单表空间
单表空间不同于系统表空间,每个表空间和表是一一对应的关系,每张表都有自己的表空间。具体在磁盘上表现为后缀为 ibd 的文件。比如表 t1,对应的表空间文件为 t1ibd917107 96K -rw-r----- 1 mysql mysql 96K 3月 18 16:13 t1ibd
单表空间如何应用到具体的表呢?
有两种方式:方式 1:在配置文件中开启。在配置文件中开启单表空间设置参数 innodb_filer_per_table,这样默认对当前库下所有表开启单表空间。innodb_file_per_table=1另外也可以直接建表时指定单表空间mysql> create table t1 (id int, r1 char(36)) tablespace innodb_file_per_table;
Query OK, 0 rows affected (004 sec)
单表空间除了解决之前说的系统表空间的几个缺点外,还有其他的优点,详细如下:
1 truncate table *** 作比其他的任何表空间都快;
2 可以把不同的表按照使用场景指定在不同的磁盘目录;
比如日志表放在慢点的磁盘,把需要经常随机读的表放在 SSD 上等。
mysql> create table ytt_dedicated (id int) data directory = '/var/lib/mysql-files';
Query OK, 0 rows affected (004 sec)3 可以用 optimize table 来收缩或者重建经常增删改查的表。一般过程是这样的:建立和原来表一样的表结构和数据文件,把真实数据复制到临时文件,再删掉原始表定义和数据文件,最后把临时文件的名字改为和原始表一样的。
三、通用表空间
通用表空间先是出现在 MySQL Cluster 里,也就是 NDB 引擎。从 MySQL 57 引入到 InnoDB 引擎。通用表空间和系统表空间一样,也是共享表空间。每个表空间可以包含一张或者多张表,也就是说通用表空间和表之间是一对多的关系。
以上就是关于求助mysql innodb全部的内容,包括:求助mysql innodb、如何从ibd文件中恢复数据、mysql是怎么做数据存储的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)