MySQL如何利用ibd文件恢复数据?(2)
以上举例为单个库表的恢复过程,看到这里大家一定会产生另一个疑问吧?线上的场景不可能是只有一个表的,数据库表很多的情况下,这样一个个表的修改,速度无疑是太慢了.那么存在大量表的情况下如何恢复呢?思路是,取得备份的ibd文件的id值,按id值顺序来建表,中间跨度随便建表语句来凑够数(每个表空间索引id由创建新表的数量依次递增).实现方式如下: 1. 获取备份数据库ibd文件的space id号,并排序.
生成的ibd.txt文件,格式如下:(库名–表名–SpaceId) 2. 新建表,查看当前表空间id(假设space id为10)
3. 先创建所有库,准备所有表结构,写脚本,依据space id号自动创建新表 准备好数据库表结构,可以从备份文件里取出来(我们备份方式是把结构和数据分开备份的),或者从其他有相同表结构的服务器上备份再拷贝过来. 参考备份语句:
创建原有的数据库:
恢复表id创建表脚本:
4. 检查表空间id 和备份的是否一致
确认一致后,拷贝备份的.ibd文件到新数据库实例目录下,修改my.cnf
启动数据库.后续步骤如同单表恢复,直接导出恢复到原来实例中即可. 当然,这种方式是在数据库出现极端情况下,不得不采取的一种方式,线上最重要的还是做好主从同步和定时备份,从而规避此类风险. 关于InnoDB引擎独立表空间说明: 使用过MySQL的同学,刚开始接触最多的莫过于MyISAM表引擎了,这种引擎的数据库会分别创建三个文件:表结构、表索引、表数据空间.我们可以将某个数据库目录直接迁移到其他数据库也可以正常工作.然而当你使用InnoDB的时候,一切都变了. InnoDB默认会将所有的数据库InnoDB引擎的表数据存储在一个共享空间中:ibdata1,这样就感觉不爽,增删数据库的时候,ibdata1文件不会自动收缩,单个数据库的备份也将成为问题.通常只能将数据使用mysqldump导出,然后再导入解决这个问题. 但是可以通过修改MySQL配置文件[mysqld]部分中innodb_file_per_table的参数来开启独立表空间模式,每个数据库的每个表都会生成一个数据空间. 优点: 1.每个表都有自已独立的表空间. 2.每个表的数据和索引都会存在自已的表空间中. 3.可以实现单表在不同的数据库中移动. 4.空间可以回收(除drop table操作处,表空不能自已回收) a) Drop table操作自动回收表空间,如果对于统计分析或是日值表,删除大量数据后可以通过:alter table TableName engine=innodb;回缩不用的空间. b) 对于使innodb-plugin的Innodb使用turncate table也会使空间收缩. c) 对于使用独立表空间的表,不管怎么删除,表空间的碎片不会太严重的影响性能,而且还有机会处理. 缺点: 单表增加过大,如超过100个G. 结论: 共享表空间在Insert操作上少有优势.其它都没独立表空间表现好.当启用独立表空间时,请合理调整一下:innodb_open_files. 配置方式: 1.innodb_file_per_table设置.开启方法: 在my.cnf中[mysqld]下设置 innodb_file_per_table=1 2.查看是否开启: mysql> show variables like ‘%per_table%’; 3.关闭独享表空间 innodb_file_per_table=0关闭独立的表空间 mysql> show variables like ‘%per_table%’; (编辑:ASP站长网) |