如何在删除ibdata1和ib

如何在删除ibdata1和ib,第1张

解决方案:仅从上述信息看,是innodb 的数据文件损坏,在我安装Mysql的数据目录:C:\ProgramData\MySQL\MySQL Server 56\data下,一般来说,直接删除ibdata1, ib_logfile0, 等innodb的文件,让MYSQL自动重建即可。

ibdata1不断增长,应该是你的mysql没有开启独立表空间,所有数据都写在ibdata1内;如果你是开启了的,那么开启之前肯定已经有数据库,那些数据无法独立分开,随着数据插入ibdata1文件也会增长。

已试过的方法:

1、停止MySQL服务

2、修改myini,在[mysql] 中追加 innodb_force_recovery=4 配置

3、启动MySQL服务,能正常启动服务,但数据库并没有恢复,完成的err日志如下:

130205 16:01:26 [Note] Plugin 'FEDERATED' is disabled

130205 16:01:26 InnoDB: The InnoDB memory heap is disabled

130205 16:01:26 InnoDB: Mutexes and rw_locks use Windows interlocked functions

130205 16:01:26 InnoDB: Compressed tables use zlib 123

130205 16:01:26 InnoDB: Initializing buffer pool, size = 5540M

130205 16:01:26 InnoDB: Completed initialization of buffer pool

130205 16:01:26 InnoDB: highest supported file format is Barracuda

130205 16:01:26 InnoDB: Waiting for the background threads to start

130205 16:01:27 InnoDB: 118 started; log sequence number 1595675

130205 16:01:27 InnoDB: !!! innodb_force_recovery is set to 4 !!!

130205 16:01:28 [Note] Event Scheduler: Loaded 0 events

130205 16:01:28 [Note] H:\MySQL Server\bin\mysqld: ready for connections

Version: '5522' socket: '' port: 3306 MySQL Community Server (GPL)

---------------------------------------------------------------------------------------------------

一、系统表空间

在 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 引擎。通用表空间和系统表空间一样,也是共享表空间。每个表空间可以包含一张或者多张表,也就是说通用表空间和表之间是一对多的关系。

先来说说临时表的概念。 临时表顾名思义,就是临时的,用完销毁掉的表。 数据既可以保存在临时的文件系统上,也可以保存在固定的磁盘文件系统上。 临时表有下面几种:

1全局临时表

这种临时表从数据库实例启动后开始生效,在数据库实例销毁后失效。在MySQL里面这种临时表对应的是内存表,即memory引擎。

2会话级别临时表

这种临时表在用户登录系统成功后生效,在用户退出时失效。在MySQL里的临时表指的就是以 create temporary table 这样的关键词创建的表。

3事务级别临时表

这种临时表在事务开始时生效,事务提交或者回滚后失效。 在MySQL里面没有这种临时表,必须利用会话级别的临时表间接实现。

4检索级别临时表

这种临时表在SQL语句执行之间产生,执行完毕后失效。 在MySQL里面这种临时表不是很固定,跟随MySQL默认存储引擎来变化。比如默认存储引擎是MyISAM,临时表的引擎就是MyISAM,并且文件生成形式以及数据运作形式和MyISAM一样,只是数据保存在内存里;如果默认引擎是INNODB,那么临时表的引擎就是INNODB,此时它的所有信息都保存在共享表空间ibdata里面。

MySQL 57对于InnoDB存储引擎的临时表空间做了优化。在MySQL 57之前,INNODB引擎的临时表都保存在ibdata里面,而ibdata的贪婪式磁盘占用导致临时表的创建与删除对其他正常表产生非常大的性能影响。在MySQL57中,对于临时表做了下面两个重要方面的优化:

MySQL57 把临时表的数据以及回滚信息(仅限于未压缩表)从共享表空间里面剥离出来,形成自己单独的表空间,参数为innodb_temp_data_file_path。

在MySQL57 中把临时表的相关检索信息保存在系统信息表中:information_schemainnodb_temp_table_info 而MySQL 57之前的版本想要查看临时表的系统信息是没有太好的办法。

需要注意的一点就是,虽然INNODB临时表有自己的表空间,但是目前还不能自己定义临时表空间文件的保存路径,只能是继承innodb_data_home_dir。此时如果想要拿其他的磁盘,比如内存盘来充当临时表空间的保存地址,只能用老办法,做软链。举个小例子:

我现在用的OS是 Ubuntu12X,想用tmpfs文件系统充当临时表空间,

root@ytt-master-VirtualBox:/usr/local/mysql/data# ln -s/run/shm/ /usr/local/mysql/data/tmp_space2

root@ytt-master-VirtualBox:/usr/local/mysql/data#ls -l | grep 'shm'

lrwxrwxrwx1 root root 9 Nov 13 10:28tmp_space2 -> /run/shm/

然后把

innodb_temp_data_file_path=tmp_space2/ibtmp2:200M:autoextend

添加到mycnf里的[mysqld]下面一行

重启MySQL服务后,

mysql>select @@innodb_temp_data_file_path\G

1 row

@@innodb_temp_data_file_path:tmp_space2/ibtmp2:200M:autoextend

1 rowin set (000 sec)

先写一个批量创建临时表的存储过程:

DELIMITER$$

USE`t_girl`$$

DROPPROCEDURE IF EXISTS `sp_create_temporary_table`$$

CREATEDEFINER=`root`@`localhost` PROCEDURE `sp_create_temporary_table`(

IN f_cnt INT UNSIGNED )

BEGIN

DECLARE i INT UNSIGNED DEFAULT 1;

WHILE i <= f_cnt

DO

SET @stmt = CONCAT('create temporarytable tmp',i,' ( id int, tmp_desc varchar(60));');

PREPARE s1 FROM @stmt;

EXECUTE s1;

SET i = i + 1;

END WHILE;

DROP PREPARE s1;

END$$

DELIMITER;

现在来创建10张临时表:

mysql>call sp_create_temporary_table(10);

QueryOK, 0 rows affected (007 sec)

如果在以前,我们只知道创建了10张临时表,但是只能凭记忆或者手工记录下来临时表的名字等信息。

现在可以直接从数据字典里面检索相关数据。

mysql> select frominformation_schemainnodb_temp_table_info;

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

|TABLE_ID | NAME | N_COLS | SPACE| PER_TABLE_TABLESPACE | IS_COMPRESSED |

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

| 56 | #sql1705_2_9 | 5 | 36 | FALSE | FALSE |

| 55 | #sql1705_2_8 | 5 | 36 | FALSE |FALSE |

| 54 | #sql1705_2_7 | 5 | 36 | FALSE | FALSE |

| 53 | #sql1705_2_6 | 5 | 36 | FALSE | FALSE |

| 52 | #sql1705_2_5 | 5 | 36 | FALSE |FALSE |

| 51 | #sql1705_2_4 | 5 | 36 | FALSE | FALSE |

| 50 | #sql1705_2_3 | 5 | 36 | FALSE | FALSE |

| 49 | #sql1705_2_2 | 5 | 36 | FALSE |FALSE |

| 48 | #sql1705_2_1 | 5 | 36 | FALSE | FALSE |

| 47 | #sql1705_2_0 | 5 | 36 | FALSE | FALSE |

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

10rows in set (000 sec)

功能性我就写到这里,大家性能方面如果有兴趣可以找时间去测试。

以上就是关于如何在删除ibdata1和ib全部的内容,包括:如何在删除ibdata1和ib、为什么 MySQL里的 ibdata1 文件不断增长、如何从 ibdata文件 恢复 MySQL 数据库等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: https://www.outofmemory.cn/sjk/9599072.html

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

发表评论

登录后才能评论

评论列表(0条)

保存