≡
  • 网络编程
  • 数据库
  • CMS技巧
  • 软件编程
  • PHP笔记
  • JavaScript
  • MySQL
位置:首页 > 数据库 > MySQL

MySQL Innodb表空间卸载、迁移、装载的使用方法

人气:382 时间:2020-07-09

这篇文章主要为大家详细介绍了MySQL Innodb表空间卸载、迁移、装载的使用方法,具有一定的参考价值,可以用来参考一下。

感兴趣的小伙伴,下面一起跟随四海网的小编小韵来看看吧!

条件:
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;

 

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

 

代码如下:


chown mysql:mysql sysUser.ibd

 

4:最后就开始加载:

 

代码如下:


zjy@B : db_test 10:00:03>alter table sysUser import tablespace;
ERROR 1030 (HY000): Got error -1 from storage engine

 

报错了,查看错误日志:

 

代码如下:


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

 

当遇到这个的情况: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)

要是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

 

这时的情况:A服务器上的表空间ID 为44132,而B服务器上的表空间ID为2436。(因为A是测试机子,经常做还原操作,所以表空间ID已经很大了,正常情况下。表空间ID不可能这么大。

既然表空间ID不对导致这个错误报出,那我们手动的让B的表空间ID追上A的表空间ID。

需要建立的表数量:44132-2436 = 41696个,才能追上。因为他本身就需要再建立一个目标表,所以需要建立的表数量为:41695。不过安全起见,最好也不要超过41695,以防B的表空间ID超过了A,则比如设置安全的值:41690,即使B没有到达A表空间ID的值,也应该差不多了,可以再手动的去增加。用一个脚本跑(需要建立的表比较多),少的话完全可以自己手动去处理:

 

代码如下:


#!/bin/env python
# -*- encoding: utf-8 -*-

 

import MySQLdb
import datetime

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()

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)

 

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

 

代码如下:


zjy@B : db_test 01:39:23>alter table sysUser import tablespace;
Query OK, 0 rows affected (0.00 sec)

 

要是再提示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

 

本文来自:http://www.q1010.com/177/9621-0.html

注:关于MySQL Innodb表空间卸载、迁移、装载的使用方法的内容就先介绍到这里,更多相关文章的可以留意四海网的其他信息。

关键词:MYSQL

您可能感兴趣的文章

  • MySQL快速添加百万条记录的语句
  • MySQL自增ID起始值修改方法
  • Linux自动备份MySQL数据库脚本代码
  • MySQL InnoDB建表时设定初始大小的方法
  • MySQL中sum float类型使用小数点的方法
  • linux正确重启MySQL的方法
  • MySQL函数讲解(MySQL函数大全)
  • MySQL无GROUP BY直接HAVING返回空的问题分析
  • MySQL SELECT FOR UPDATE语句使用示例
  • MySQL获取随机数据的方法
上一篇:MySQL删除重复数据的简单方法
下一篇:MySQL无GROUP BY直接HAVING返回空的问题分析
热门文章
  • mysql 修改character_set_server为utf-8的简单示例
  • 解决MySQL丢失文件localhost.localdomain.pid、mysql.sock的示例
  • MySQL 数据类型binary和varbinary的简单示例
  • MySQL:reading initial communication packet问题解决方法
  • MySql 表类型MYISAM、InnoDB区别
  • bash: mysql: command not found 的解决方法
  • MYSQL默认用户名ROOT修改方法
  • MySQL 常用命令菜鸟教程
  • MySQL 使用命令行新建用户并授予权限
  • MySql 数据库物理文件存放位置查看示例
  • 最新文章
    • MySQL查看死锁与解除死锁的简单示例
    • MySQL 慢查询的功能实例
    • MySQL查看死锁与去除死锁的简单示例
    • MySQL找出未提交事务的SQL的简单示例
    • MySQL锁阻塞的的简单示例
    • MySQL中的binary类型使用操作的示例
    • SQL优化教程之in与range查询的简单示例
    • MySQL 的 21 个规范、优化最佳实践!
    • MySQL 字符类型大小写敏感的简单示例
    • 解决mybatis-plus分页传入参数后sql where条件没有limit分页信息的问题

四海网收集整理一些常用的php代码,JS代码,数据库mysql等技术文章。