如何:清理mysql InnoDB存储引擎?

如何:清理mysql InnoDB存储引擎?,mysql,innodb,Mysql,Innodb,是否可以清理mysql innodb存储引擎,使其不存储已删除表中的数据 还是每次都必须重建一个新的数据库?InnoDB引擎不存储已删除的数据。插入和删除行时,InnoDB存储文件中会保留未使用的空间。随着时间的推移,总体空间不会减少,但随着时间的推移,“已删除和已释放”空间将被DB服务器自动重新使用 您可以通过手动重新组织表来进一步优化和管理引擎使用的空间。为此,请使用mysqldump转储受影响表中的数据,删除表,重新启动mysql服务,然后从转储文件中重新创建表。以下是有关InnoDB的更

是否可以清理mysql innodb存储引擎,使其不存储已删除表中的数据


还是每次都必须重建一个新的数据库?

InnoDB引擎不存储已删除的数据。插入和删除行时,InnoDB存储文件中会保留未使用的空间。随着时间的推移,总体空间不会减少,但随着时间的推移,“已删除和已释放”空间将被DB服务器自动重新使用


您可以通过手动重新组织表来进一步优化和管理引擎使用的空间。为此,请使用mysqldump转储受影响表中的数据,删除表,重新启动mysql服务,然后从转储文件中重新创建表。

以下是有关InnoDB的更完整答案。这是一个有点漫长的过程,但值得付出努力

请记住,
/var/lib/mysql/ibdata1
是InnoDB基础设施中最繁忙的文件。它通常包含六种类型的信息:

  • 表数据
  • 表索引
  • 资料
    • 回滚段
    • 撤消空间
  • 表元数据(数据字典)
  • 双写缓冲区(后台写入以防止依赖操作系统缓存)
  • 插入缓冲区(管理对非唯一二级索引的更改)
InnoDB体系结构

许多人创建多个
ibdata
文件,希望获得更好的磁盘空间管理和性能,但这种想法是错误的

我能跑吗? 不幸的是,对存储在共享表空间文件
ibdata1
中的InnoDB表运行时会做两件事:

  • 使表的数据和索引在
    ibdata1
  • 使
    ibdata1
    增长,因为连续的数据和索引页被附加到
    ibdata1
但是,您可以将表数据和表索引从
ibdata1
中分离出来,并独立管理它们

我能和你一起跑步吗? 假设您要添加到
/etc/my.cnf(my.ini)
。然后你能在所有InnoDB表上运行吗

好消息:在启用的情况下运行时,将为该表生成一个
.ibd
文件。例如,如果您的table
mydb.mytable
的datadir为
/var/lib/mysql
,它将生成以下内容:

  • /var/lib/mysql/mydb/mytable.frm
  • /var/lib/mysql/mydb/mytable.ibd
.ibd
将包含该表的数据页和索引页。太好了

坏消息:您所做的只是从生活在
ibdata
中提取
mydb.mytable
的数据页和索引页。每个表(包括
mydb.mytable
)的数据字典条目仍保留在数据字典中(请参阅)此时您不能简单地删除
ibdata1
请注意,
ibdata1
根本没有收缩

InnoDB基础设施清理 要一次性收缩
ibdata1
,必须执行以下操作:

  • 将所有数据库转储(例如,使用
    mysqldump
    )到
    .sql
    文本文件中(下面使用
    SQLData.sql

  • 删除所有数据库(除了
    mysql
    information\u schema
    警告:作为预防措施,请运行此脚本以确保您拥有所有用户授权:

    mkdir /var/lib/mysql_grants
    cp /var/lib/mysql/mysql/* /var/lib/mysql_grants/.
    chown -R mysql:mysql /var/lib/mysql_grants
    
  • 登录mysql,运行
    设置全局innodb\u fast\u shutdown=0(这将完全清除
    ib_logfile0
    ib_logfile1
    中的所有剩余事务更改)

  • 关闭MySQL

  • 将以下行添加到
    /etc/my.cnf
    (或Windows上的
    my.ini

    (旁注:无论您为
    innodb\u buffer\u pool\u size
    设置了什么,请确保
    innodb\u log\u file\u size
    innodb\u buffer\u pool\u size
    的25%

    另外:
    innodb\u flush\u method=O\u DIRECT
    在Windows上不可用)

  • 删除
    ibdata*
    ibu日志文件*
    ,您可以选择删除
    /var/lib/mysql
    中的所有文件夹,但
    /var/lib/mysql/mysql
    除外

  • 启动MySQL(这将分别以1G的速度重新创建
    ibdata1
    [10MB默认值]和
    ib_logfile0
    ib_logfile1

  • 导入
    SQLData.sql

  • 现在,
    ibdata1
    仍将增长,但只包含表元数据,因为每个InnoDB表都将存在于
    ibdata1
    之外
    ibdata1
    将不再包含其他表的InnoDB数据和索引

    例如,假设您有一个名为
    mydb.mytable
    的InnoDB表。如果查看
    /var/lib/mysql/mydb
    ,您将看到代表该表的两个文件:

    • mytable.frm
      (存储引擎标题)
    • mytable.ibd
      (表数据和索引)
    使用
    /etc/my.cnf
    中的
    innodb\u file\u per\u table
    选项,您可以运行
    优化表mydb.mytable
    ,文件
    /var/lib/mysql/mydb/mytable.ibd
    将实际收缩

    在MySQL DBA的职业生涯中,我已经做过很多次了。事实上,在我第一次这样做时,我将50GB
    ibdata1
    文件压缩到只有500MB

    试试看。如果你对此有进一步的问题,尽管问。相信我;这将在短期和长期内起作用

    警告 在第6步,如果mysql因为删除了
    mysql
    schema begin而无法重新启动,请回顾第2步。您创建了
    mysql
    模式的物理副本。您可以按如下方式还原它:

    mkdir /var/lib/mysql/mysql
    cp /var/lib/mysql_grants/* /var/lib/mysql/mysql
    chown -R mysql:mysql /var/lib/mysql/mysql
    
    返回步骤6并继续

    更新日期2013-06-04 11:13美国东部时间 关于设置为中的25%
    mkdir /var/lib/mysql/mysql
    cp /var/lib/mysql_grants/* /var/lib/mysql/mysql
    chown -R mysql:mysql /var/lib/mysql/mysql