从MySQL的Innodb特性中我们知道,Inndob的表空间有共享和独享的特点,如果是共享的。则默认会把表空间存放在一个文件中(ibdata1),当开启独享表空间参数Innodb_file_per_table时,会为每个Innodb表创建一个.ibd的文件。文章讨论在独享表空间卸载、装载、迁移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

报错了,查看错误日志:

131112 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.
131112 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,则会有:

131112 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.
131112 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 datetimedef 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 icreate_table(conn)drop_table(conn)

View Code

也可以开启多线程去处理,加快效率。

当执行完之后,再重新按照上面的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.iamcjd.com/?p=1307 p10~13

http://imysql.cn/2008_12_17_migrate_innodb_tablespace_smoothly

http://www.chriscalender.com/?p=28

转载于:https://www.cnblogs.com/zhoujinyi/p/3419142.html

Innodb 表空间卸载、迁移、装载相关推荐

  1. mysql5.7.16 表空间加密,MySQL :: MySQL 5.7参考手册:: A.16 MySQL 5.7 FAQ:InnoDB表空间加密...

    A.16.1. 数据是否被授权查看的用户解密? 是.InnoDB表空间加密旨在为客户提供在数据库中透明地应用加密而不影响现有应用程序的能力.以加密格式返回数据会破坏大多数现有的应用程序.InnoDB表 ...

  2. mysql创建数据库时候同时创建表空间_MySQL 创建InnoDB表空间_编程学问网

    15.2.5. 创建InnoDB表空间 假设你已经安装了MySQL,并且已经编辑了选项文件,使得它包含必要的InnoDB配置参数.在启动MySQL之前,你应该验证你为InnoDB数据文件和日志文件指定 ...

  3. oracle11 删除表空间,oracle11g启动停止服务,修改字符集,导入导出,创建删除表空间,卸载oracle等...

    oracle11g启动停止服务,修改字符集,导入导出,创建删除表空间,卸载oracle等 1. [启动停止服务] //启动停止监听  www.2cto.com lsnrctl start; lsnrc ...

  4. mysql表空间权限_MySQL InnoDB表空间加密示例详解

    前言 从 MySQL5.7.11开始,MySQL对InnoDB支持存储在单独表空间中的表的数据加密 .此功能为物理表空间数据文件提供静态加密.该加密是在引擎内部数据页级别的加密手段,在数据页写入文件系 ...

  5. mysql 查看表v空间自增涨_MySQL InnoDB表空间加密

    从 MySQL5.7.11开始,MySQL对InnoDB支持存储在单独表空间中的表的数据加密 .此功能为物理表空间数据文件提供静态加密.该加密是在引擎内部数据页级别的加密手段,在数据页写入文件系统时加 ...

  6. MYSQL 5.7 INNODB 表空间

    背景介绍 由于InnoDB 引擎支持ACID.良好的读写性能,还有许多其他对数据库服务具有重要意义的特性,InnoDB已经成为MySQL最受欢迎的存储引擎. 在本文中,我们将介绍InnoDB表空间和它 ...

  7. mysql表空间不足_MySQL Innodb表空间不足的处理方法 风好大

    官方给出的解决方案: 添加和删除 InnoDB 数据和日志文件 这一节描述在InnoDB表空间耗尽空间之时,或者你想要改变日志文件大小之时,你可以做的一些事情. 最简单的,增加InnoDB表空间大小的 ...

  8. MySQL(九):InnoDB 表空间(Tables)

    本节着重分析一下表空间,通过本节我们将清楚以下几个问题: 1.什么是表空间(Tablespace)? 2.InnoDB 存储引擎有哪些表空间(Tablespace)? 3.InnoDB 存储引擎中的表 ...

  9. MySQL怎么运行的系列(五)Innodb表空间(table space)、区(extent)和段(segment)

    本系列文章目录 展开/收起 MySQL怎么运行的系列(一)mysql体系结构和存储引擎 MySQL怎么运行的系列(二)Innodb缓冲池 buffer pool 和 改良版LRU算法 Mysql怎么运 ...

最新文章

  1. mongoDB 文档概念
  2. Linux文件实时同步--inotify + rsync + pyinotify
  3. python培训出来的有公司要吗-Python培训班出来好找工作吗?
  4. 47. Leetcode 107 - 二叉树的层次遍历 ii (二叉树-二叉树遍历)
  5. Linux下ps -ef和ps aux的区别及格式详解
  6. 阿里开发者招聘节 | 2019阿里巴巴技术面试题分享:20位专家28道题
  7. activemq的使用场景
  8. 【leetcode 简单】 第三十五题 环形链表
  9. 堆排序工具类(适用于top k问题,java泛型实现)
  10. 吉利成立数字科技新公司 经营范围涉区块链等
  11. MySQL数据库企业级应用实践(主从复制)
  12. JAVA栅栏密码解密程序
  13. linux安装rz命令
  14. DSP CCS12.00 芯片:TMS320F28335 ADC 的运用
  15. linux下看pcie的设备id,linux lspci查看pci总线设备信息
  16. 计算机组成原理多级先行进位,计算机组成原理—最系统的算机基础知识.ppt
  17. 【知识图谱问答】DBpedia介绍
  18. kafka Process ‘command ‘/jdk1.8.0_77/jre/bin/java.exe finished with non-zero exit value 1
  19. SpringBoot2学习笔记
  20. 使用Sendinput函数模拟鼠标键盘操作

热门文章

  1. LeetCode 918. 环形子数组的最大和(前缀和+单调队列)
  2. 程序员面试金典 - 面试题 16.04. 井字游戏(计数)
  3. LeetCode 1403. 非递增顺序的最小子序列(排序)
  4. LeetCode 106. 已知中序后序 求二叉树
  5. c++ qt qlistwidget清空_Qt编写控件属性设计器12-用户属性
  6. 利用Python爬取网易上证所有股票数据(代码
  7. 自动化运维Shell课堂笔记
  8. ubuntu server安装hadoop和spark,并设置集群
  9. 【错误纠正】关于文章《绕开数学,讲讲信息论》
  10. Java经典基础与高级面试36题和答案