求助mysql innodb

求助mysql innodb,第1张

数据库:物理 *** 作系统或其他形式文件类型的集合。在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是怎么做数据存储的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9352180.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存