ibdata1文件过大

原因分析

ibdata1是一个用来构建innodb系统表空间的文件,关于系统表空间详细介绍参考MySQL官网文档

上面是一个数据库的ibdata1文件,达到了780多G,而且还在不断增长。

这个文件包含了innodb数据字典、修改buffer和双写buffer、撤销日志,还包含在用户在系统表空间创建的表信息和索引数据。

显然,由于所有表的数据索引和缓存都存在这个文件中,随着数据库的不断增大,这个文件肯定会越来越大的。

解决方法

和系统表空间(也称作共享表空间)对应,MySQL提供了另外一种存储文件的方式:独立表空间。

独立表空间模式下,每个innodb表都有自己独立的表空间文件(.ibd文件),存储各种表的索引和数据。

通过配置项:innodb_file_per_table指定MySQL使用独立表空间,MySQL5.6.6以后的版本默认值是ONMySQL5.6.5以前的版本默认值是OFF

解决ibdata1文件过大具体操作步骤

如果当前MySQL使用系统表空间的模式,是无法在开启数据库的情况下进行切换到共享表空间的。必须关闭MySQL重建数据结构。步骤如下:

备份数据库

使用mysqldump备份所有InnoDB数据表,包括MySQL的系统表。

使用下面的命令可以参考当前系统表:

SELECT TABLE_NAME from INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='mysql' and ENGINE='InnoDB';

MySQL5.6中包含五张系统表:

  • innodb_index_stats
  • innodb_table_stats
  • slave_master_info
  • slave_relay_log_info
  • slave_worker_info

如果数据库只用了InnoDB表,可以直接备份所有数据库。

mysqldump -h localhost -uroot -pxxxxx –all-databases > dump.sql

关闭MySQL服务

使用mysqld_safe关闭MySQL服务。

mysqladmin -uroot -pxxxxx shutdown

删除现有数据库文件

首先需要删除当前存在的所有表空间文件(.idb),包括ibdata1和ib_log文件,以及数据库自带的.idb文件。

然后需要删除所有的表结构描述文件:*.frm。位于数据库名称相应的文件夹下。

修改配置文件

在数据库配置文件my.cnf中的[mysqld]下添加innodb_file_per_table=1配置。

[mysqld]
innodb_file_per_table=1

重新启动服务器并导入数据

最后使用新的配置文件重新启动mysql服务。

mysqld_safe --defaults-file=/your/config/path/my.cnf &

然后导入mysaldump备份的数据

# 登录进入mysql
mysql -hlocalhost -uroot -pxxxxx database_name # 导入数据
source /your/backup/file/path/dump.sql

独立表空间的优点

刚开始建立数据库时,就推荐使用独立表空间,MySQL5.6.6以后的版本默认是独立表空间。

使用独立表空间很显然能够提高存储效率,拆分表和表之间的耦合,将对数据库的操作粒度降低到表级别。

独立表空间对于存储优化,迁移,备份,恢复和监控来说,都更加灵活和强大。下面列举一些代表性的好处:

  • truncate和drop表时会释放掉磁盘空间,共享表空间并不会释放而是在ibdata1中开辟新的空间
  • truncate table时速度更快
  • 可以将表放在不同的磁盘上(用于I/O优化等),共享表空间必须所有表都反正ibdata1中
  • 可以对每个表使用 OPTIMIZE TABLE命令进行优化和重建,回收未使用的空间
  • 可以移动单个表,或者将单个表从一个实例复制到另外一个实例
  • 使用Barracuda文件格式,至此压缩和动态行等功能
  • 使用动态行(dynamic row format)可以使得存储大型BLOB和TEXT格式数据更高效
  • 当文件损坏时,提高成功恢复机会,节省服务器重启或备份的时间

当然独立表空间也有一些潜在的缺点:

  • 由于每个表都存在为使用的空间,这些空间只能同一个表使用,可能会造成空间浪费
  • fsync操作必须在每个打开的表上运行
  • mysqld必须为每个表保留一个打开的文件句柄,如果表过多,可能会影响性能
  • 在删除表空间的文件时会扫描缓冲池,如果缓冲池达到几十G,则需要几秒的时间,而扫描会造成锁,可能会延迟其他操作
  • 如果许多表正在增长,可能会存在更多的碎片,这回妨碍删除表和扫描表的性能。

详解MySQL表空间以及ibdata1文件过大问题的更多相关文章

  1. Oracle管理表空间和数据文件详解

    介绍 表空间是数据库的逻辑组成部分 从物理上将:数据库数据存放在数据文件中 从逻辑上将:数据库则是存放在表空间中 表空间由一个或是多个数据文件组成 数据库的逻辑结构 介绍: Oracle中逻辑结构包括 ...

  2. MySQL简单查询详解-单表查询

    MySQL简单查询详解-单表查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查询的执行路径 一条SQL查询语句的执行过程大致如下图所示: 1>.客户端和服务端通过my ...

  3. Mysql常用show命令,show variables like xxx 详解,mysql运行时参数

    MySQL中有很多的基本命令,show命令也是其中之一,在很多使用者中对show命令的使用还容易产生混淆,本文汇集了show命令的众多用法. 详细: http://dev.mysql.com/doc/ ...

  4. 详解MySQL索引

    原文链接详解MySQL索引 索引介绍 索引是帮助MySQL高效获取数据的数据结构.在数据之外,数据库系统还维护着一个用来查找数据的数据结构,这些数据结构指向着特定的数据,可以实现高级的查找算法. 本文 ...

  5. [深入学习Web安全](5)详解MySQL注射

    [深入学习Web安全](5)详解MySQL注射 0x00 目录 0x00 目录 0x01 MySQL注射的简单介绍 0x02 对于information_schema库的研究 0x03 注射第一步—— ...

  6. MySQL数据类型 int(M) 表示什么意思?详解mysql int类型的长度值问题

    MySQL 数据类型中的 integer types 有点奇怪.你可能会见到诸如:int(3).int(4).int(8) 之类的 int 数据类型.刚接触 MySQL 的时候,我还以为 int(3) ...

  7. MySQL存储过程详解 mysql 存储过程

    原文地址:MySQL存储过程详解  mysql 存储过程作者:王者佳暮 mysql存储过程详解 1.     存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储 ...

  8. MySQL表空间集

    --MySQL表空间集 ----------------------2014-09-20 1. 收缩ibdata的方法,目前MySQL依然没有提供收缩ibdata的方法,只能重构,下面是5.7的步骤. ...

  9. oracle数据库表空间追加数据库文件方法

    oracle数据库表空间追加数据库文件方法   针对非大文件方式表空间,允许追加文件进行表空间的扩展,单个文件最大大小是32G  第一种方式:表空间增加数据文件    www.2cto.com   1 ...

随机推荐

  1. BZOJ_3252_攻略_线段树+dfs序

    BZOJ_3252_攻略_线段树+dfs序 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏< ...

  2. 记一次产品需求:图片等比缩放和CSS自适应布局16:9

    前言 前阵子,产品跑过来问我现有的模板中没有图片模板,需要添加一个图片模板:然而,他要求图片在展示区最好能够实现随着窗口的变化而自动按图片比例等比缩放,并且居中展示图片.我当时想着,抛开技术实现层面, ...

  3. ThreadLocal的应用与实现原理

    本文对ThreadLocal的分析基于JDK 8. 本文大纲 1. ThreadLocal快速上手 2. ThreadLocal应用场景 3. TheadLocal set与get方法简析 4. Th ...

  4. 浅谈URL跳转与Webview安全

    学习信息安全技术的过程中,用开阔的眼光看待安全问题会得到不同的结论. 在一次测试中我用Burpsuite搜索了关键词url找到了某处url,测试一下发现waf拦截了指向外域的请求,于是开始尝试绕过.第 ...

  5. spring mvc+redis实现微信小程序登录

    本文将详细的介绍微信小程序的登录流程以及在ssm框架下如何实现小程序用户登录 登录流程概要 主要的登录流程可以参考官方提供的一张流程图: 1.微信前台页面: 在微信版本更新之后,提高了安全机制,我们需 ...

  6. 读书笔记:深入理解java虚拟机(二)创建对象的时候需要访问哪几块内存

    @TOC 对象在内存中如何储存 对象访问在java语言中无处不在,是最普通的程序行为,但即使是最简单的访问,也会涉及到java栈,java堆,方法去三个最重要的内存区域的关联关系,比如下面这段代码: ...

  7. python输出彩色字体

    Python终端如何输出彩色字体 实现过程:       终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关.       转义序列是以ESC开头,即用\033来完成(ES ...

  8. C#串口通讯概念以及简单实现

    最近在研究串口通讯,其中有几个比较重要的概念,RS-232这种适配于上位机和PC端进行连接,RS-232只限于PC串口和设备间点对点的通信.它很简单的就可以进行连接,由于串口通讯是异步的,也就是说你可 ...

  9. C++线程安全日志库-Win32接口实现

    分享一个C++日志库,使用Win32接口编写,而且是线程安全的日志库.比较简单,只有2个文件,容易上手,使用起来也很简单 头文件 如下是日志库的头文件,接口看似很多,但是使用起来最常用的也就那么几个 ...

  10. .Net Core使用Redis(CSRedis)

    前言 CSRedis是国外大牛写的.git地址:https://github.com/2881099/csredis,让我们看看如果最简单的 使用一下CSRedis吧. 引入NuGet 获取Nuget ...