MYSQL教程mysql Innodb表空间卸载、迁移、装载的使用方法
《MYSQL教程mysql Innodb表空间卸载、迁移、装载的使用方法》要点: MYSQL教程条件: zjy@B : db_test 09:50:30>alter table sysUser discard tablespace; MYSQL教程2:把A服务器表的表空间(ibd)复制到B服务器的相应数据目录. chown mysql:mysql sysUser.ibd MYSQL教程4:最后就开始加载: 代码如下:zjy@B : db_test 10:00:03>alter table sysUser import tablespace; ERROR 1030 (HY000): Got error -1 from storage engine MYSQL教程报错了,查看错误日志: 代码如下:10:05:44? InnoDB: Error: tablespace id and flags in file './db_test/sysUser.ibd' are 2428 and 0,but in the InnoDB InnoDB: data dictionary they are 2430 and 0. InnoDB: Have you moved InnoDB .ibd files around without using the InnoDB: commands DISCARD TABLESPACE and IMPORT TABLESPACE? InnoDB: Please refer to InnoDB: http://dev.mysql.com/doc/refman/5.5/en/innodb-troubleshooting-datadict.html InnoDB: for how to resolve the issue. 10:05:44? InnoDB: cannot find or open in the database directory the .ibd file of InnoDB: table `db_test`.`sysUser` InnoDB: in ALTER TABLE ... IMPORT TABLESPACE MYSQL教程当遇到这个的情况:A服务器上的表空间ID 为2428,而B服务器上的表空间ID为2430.所以导致这个错误发生,解决办法是:让他们的表空间ID一致,即:B找出表空间ID为2428的表(CREATE TABLE innodb_monitor (a INT) ENGINE=INNODB;),修改成和sysUser表结构一样的的表,再import.要不就把A服务器的表空间ID增加到大于等于B的表空间ID.(需要新建删除表来增加ID) MYSQL教程要是A的表空间ID大于B的表空间ID,则会有: 代码如下:11:01:45? InnoDB: Error: tablespace id and flags in file './db_test/sysUser.ibd' are 44132 and 0,but in the InnoDB InnoDB: data dictionary they are 2436 and 0. InnoDB: Have you moved InnoDB .ibd files around without using the InnoDB: commands DISCARD TABLESPACE and IMPORT TABLESPACE? InnoDB: Please refer to InnoDB: http://dev.mysql.com/doc/refman/5.5/en/innodb-troubleshooting-datadict.html InnoDB: for how to resolve the issue. 11:01:45? InnoDB: cannot find or open in the database directory the .ibd file of InnoDB: table `db_test`.`sysUser` InnoDB: in ALTER TABLE ... IMPORT TABLESPACE MYSQL教程这时的情况:A服务器上的表空间ID 为44132,而B服务器上的表空间ID为2436.(因为A是测试机子,经常做还原操作,所以表空间ID已经很大了,正常情况下.表空间ID不可能这么大. MYSQL教程既然表空间ID不对导致这个错误报出,那我们手动的让B的表空间ID追上A的表空间ID. MYSQL教程需要建立的表数量:44132-2436 = 41696个,才能追上.因为他本身就需要再建立一个目标表,所以需要建立的表数量为:41695.不过安全起见,最好也不要超过41695,以防B的表空间ID超过了A,则比如设置安全的值:41690,即使B没有到达A表空间ID的值,也应该差不多了,可以再手动的去增加.用一个脚本跑(需要建立的表比较多),少的话完全可以自己手动去处理: 代码如下:#!/bin/env python # -*- encoding: utf-8 -*- MYSQL教程import MySQLdb MYSQL教程def create_table(conn): MYSQL教程if __name__ == '__main__': MYSQL教程也可以开启多线程去处理,加快效率. zjy@B : db_test 01:39:23>alter table sysUser import tablespace; Query OK,0 rows affected (0.00 sec) MYSQL教程要是再提示A表空间ID大于B表的话,就再手动的按照脚本里面的方法来增加ID,这时候就只需要增加个位数就可以追上A的表空间ID了. 2013-11-12 15:25:09 2378 [Note] InnoDB: Sync to disk 2013-11-12 15:25:09 2378 [Note] InnoDB: Sync to disk - done! 2013-11-12 15:25:09 2378 [Note] InnoDB: Phase I - Update all pages 2013-11-12 15:25:09 2378 [Note] InnoDB: Sync to disk 2013-11-12 15:25:09 2378 [Note] InnoDB: Sync to disk - done! 2013-11-12 15:25:09 2378 [Note] InnoDB: Phase III - Flush changes to disk 2013-11-12 15:25:09 2378 [Note] InnoDB: Phase IV - Flush complete (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |