共享InnoDB / var / lib / mysql / ibdata1存储的问题
InnoDB表当前将数据和索引存储到共享表空间(/ var / lib / mysql / ibdata1)。由于共享表空间,一个InnoDB表的数据损坏可能导致MySQL无法在整个计算机上启动。修复InnoDB损坏可能非常难以执行,并且可能导致在修复过程中最初未损坏的表的数据丢失。
由于MySQL 5.5将使用InnoDB作为默认存储引擎,因此考虑继续利用/ var / lib / mysql / ibdata1中的共享表空间的后果非常重要。
使用innodb_file_per_table更改为每表表空间
作为解决问题的选项,MySQL有一个名为innodb_file per_table的配置变量。要使用此变量,可以将以下内容放入/etc/my.cnf,以将InnoDB转换为每个InnoDB引擎表的每个表文件:
innodb_file_per_table = 1
添加该行后,需要在机器上重新启动MySQL。
在/etc/my.cnf中使用该行的结果将导致在添加行之后的任何数据库在/ var / lib / mysql / database / location中创建.idb文件。请注意,共享表空间仍将保留内部数据字典和撤消日志。
转换旧的InnoDB表
任何设置为先前在ibdata1中共享表空间的InnoDB表的旧数据库仍将使用该文件,因此需要将这些旧数据库切换到新系统。MySQL CLI中的以下命令将创建InnoDB引擎表的列表以及为每个引擎运行的命令,以将它们转换为新的innodb_file_per_table系统:
select concat('alter table ',TABLE_SCHEMA ,'.',table_name,' ENGINE=InnoDB;') FROM INFORMATION_SCHEMA.tables where table_type='BASE TABLE' and engine = 'InnoDB';
我的测试计算机上的Roundcube示例在运行previous命令时显示以下返回值:
alter table roundcube.cache ENGINE = InnoDB; alter table roundcube.contacts ENGINE = InnoDB; alter table roundcube.identities ENGINE = InnoDB; alter table roundcube.messages ENGINE = InnoDB; alter table roundcube.session ENGINE = InnoDB; alter table roundcube.users ENGINE = InnoDB;
然后,您只需发出MySQL CLI指出的命令,然后将每个表转换为新的innodb_file_per_table格式。
请注意,这些命令只需要在MySQL命令行中进行转换,可以通过在bash提示符下输入mysql在root SSH中访问。
转换旧InnoDB表的可能问题
1.转换期间可能发生系统负载
2.驱动器空间填满转换的可能问题