mysql数据存入到ibdata_MySQL的ibdata1详解

关于 MySQL 的 ibdata1 文件的这个问题:

当监控服务器发送一个关于 MySQL 服务器存储的报警时,恐慌就开始了 —— 就是说磁盘快要满了。

一番调查后你意识到大多数地盘空间被 InnoDB 的共享表空间 ibdata1 使用。而你已经启用了 innodb_file_per_table,所以问题是:

ibdata1存了什么?

当你启用了 innodb_file_per_table,表被存储在他们自己的表空间里,但是共享表空间仍然在存储其它的 InnoDB 内部数据:

数据字典,也就是 InnoDB 表的元数据

变更缓冲区

双写缓冲区

撤销日志

其中的一些在 Percona 服务器上可以被配置来避免增长过大的。例如你可以通过 innodb_ibuf_max_size 设置最大变更缓冲区,或设置 innodb_doublewrite_file 来将双写缓冲区存储到一个分离的文件。

MySQL 5.6 版中你也可以创建外部的撤销表空间,所以它们可以放到自己的文件来替代存储到 ibdata1。可以看看这个文档。

什么引起 ibdata1 增长迅速?

当 MySQL 出现问题通常我们需要执行的第一个命令是:

SHOW ENGINE INNODB STATUS/G

这将展示给我们一些很有价值的信息。我们从** TRANSACTION(事务)**部分开始检查,然后我们会发现这个:

---TRANSACTION 36E,ACTIVE 1256288sec

MySQLthread id42,OS thread handle 0x7f8baaccc700,query id7900290localhost root<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
清理 `ibdata1` 数据需要谨慎操作,因为这是 MySQL 的核心数据文件,包含了所有的表结构和数据。如果清理不当,可能会导致数据丢失或 MySQL 无法启动。 以下是清理 `ibdata1` 数据的步骤: 1. 备份数据:在进行任何操作之前,请先备份 MySQL 数据。 2. 停止 MySQL 服务。 3. 进入 MySQL 数据目录,找到 `ibdata1` 文件和 `ib_logfile*` 文件,这些文件都是 MySQL 的核心数据文件。 4. 删除 `ibdata1` 文件和 `ib_logfile*` 文件。 5. 修改 MySQL 配置文件 `my.cnf`,添加以下内容: ``` innodb_file_per_table = 1 ``` 这个参数的作用是让每个 InnoDB 表的数据单独存放在一个 `.ibd` 文件中,而不是存放在 `ibdata1` 文件中。 6. 启动 MySQL 服务。 7. 对于每个 InnoDB 表,将其数据导出到一个 `.sql` 文件中,然后删除该表。导出表数据的命令如下: ``` mysqldump -u username -p dbname table_name > table_name.sql ``` 其中 `username` 是 MySQL 用户名,`dbname` 是数据库名,`table_name` 是表名。 8. 创建新的 InnoDB 表,将导出的数据导入新表中。创建表的命令如下: ``` CREATE TABLE table_name (...) ENGINE=InnoDB; ``` 其中 `...` 是表的列定义。 将数据导入新表的命令如下: ``` mysql -u username -p dbname < table_name.sql ``` 9. 重复步骤 7 和 8,直到所有的 InnoDB 表都被清理。 10. 删除备份数据。 请注意,清理 `ibdata1` 数据是一个非常危险的操作,需要谨慎操作。如果您不确定自己的操作,建议寻求专业人士的帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值