MYSQL教程mysql Innodb表空间卸载、迁移、装载的使用方法

MYSQL教程mysql Innodb表空间卸载、迁移、装载的使用方法,第1张

概述介绍《MYSQL教程mysql Innodb表空间卸载迁移、装载的使用方法》开发教程,希望对您有用。

《MysqL教程MysqL Innodb表空间卸载、迁移、装载的使用方法》要点:
本文介绍了MysqL教程MysqL Innodb表空间卸载、迁移、装载的使用方法,希望对您有用。如果有疑问,可以联系我们。

MysqL教程条件:
2台服务器:A和B,需要A服务器上的表迁移到B服务器.
Innodb表:sysUser,记录数:351781.
以下测试在MysqL 5.5.34中进行.
开始处理:
1:在B服务器上建立sysUser表,并且执行:

代码如下:
zjy@B : db_test 09:50:30>alter table sysUser discard tablespace;

MysqL教程2:把A服务器表的表空间(ibd)复制到B服务器的相应数据目录.
3:修改复制过来的ibd文件权限:

代码如下:
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
import datetime

MysqL教程def create_table(conn):
    query = '''
create table tmp_1 (ID int) engine =innodb
    '''
    cursor = conn.cursor()
    cursor.execute(query)
    conn.commit()
def drop_table(conn):
    query = '''
drop table tmp_1
    '''
    cursor = conn.cursor()
    cursor.execute(query)
    conn.commit()

MysqL教程if __name__ == '__main__':
    conn = MysqLdb.connect(host='B',user='zjy',passwd='123',db='db_test',port=3306,charset='utf8')
    for i in range(41690):
        print i
        create_table(conn)
        drop_table(conn)

MysqL教程也可以开启多线程去处理,加快效率.
当执行完之后,再重新按照上面的1-3步骤进行一次,最后再装载:

代码如下:
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了.
总结:
上面只是一个方法,虽然可以迁移Innodb,但是出问题之后可能会引其Innodb的页损坏,所以最安全的还是直接用MysqLdump、xtrabackup等进行迁移.
5.6 可以不用考虑这些tablespace ID,可以直接import 进来.

代码如下:
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
总结

以上是内存溢出为你收集整理的MYSQL教程mysql Innodb表空间卸载、迁移、装载的使用方法全部内容,希望文章能够帮你解决MYSQL教程mysql Innodb表空间卸载、迁移、装载的使用方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/1160378.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存