mysql Innodb表空间卸载、迁移、装载的使用方法
发布时间:2024-01-25 16:41:56
条件:
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


猜你喜欢
- 最近有一个需求:将日志以json格式输出, 并且有些字段是logging模块没有的.看了很多源码和资料, 终于搞定, 抽取精华分享出来, 一
- jupyter介绍jupyter的全称为Jupyter Notebook,之前一度被称为(IPython notebook),是一种交互式的
- 一.先看一些最简单的例子例子Table Aaid adate 1 &n
- 之前遇到技术问题总能在技术博客上得到启发,十分感谢各位的无私分享。而自己却很少发文,固然是水平有限,但也限制了知识积累和总结。今后多总结分享
- 骨骼识别的应用场景如今,当前疫情大环境之下。很多人,因为居家办公或者其他原因闷在家里不能外出健身。那么,借助骨骼识别和卷积神经网络模型,计算
- 问:怎样才能指定MySQL只监听某个特定地址?答:比较常见的办法是,在my.cnf之mysqld节,添加bind-address=127.0
- 如下所示:import ospath="/home/test/" #待读取的文件夹path_list=os.listdi
- 数据库计算机 databasecomputer 实现数据库的存储、管理和控制的一种专用计算机系统。它能十分快速而有效地完成各种数据库操作,并
- 前面已经提到,CSS之所以如此强大,是因为它采用HTML文档结构来决定其样式的应用。但这仅仅只是一方面,因为它只暗示了CSS之所以使用文档结
- 一般在卸载完数据库时,大家都希望能够将注册表信息完全删干净,下面就将教您彻底删除SQL Server注册表的方法,供您参考。在卸载SQL S
- 技术背景本文主要涵盖两个领域的知识点:python的魔法函数和量子计算模拟,我们可以通过一个实际的案例来先审视一下这两个需求是如何被结合起来
- maketrans()方法返回的字符串intab每个字符映射到字符的字符串outtab相同位置的转换表。然后这个表被传递到tra
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN&q
- WINDOWS 1、MySQL是有一些环境变量可以设置, 可输入:show variables;可查看当前的环境变量设置; 2、这些变量当中
- 为什么使用Python假设我们有这么一项任务:简单测试局域网中的电脑是否连通.这些电脑的ip范围从192.168.0.101到192.168
- // 添加function col_add() { var selObj = $("#mySelect");&
- 由于一些原因,视频录制要告一段落了。再写一篇关于cntk的文章分享出来吧。我也很想将这个事情进行下去。以后如果条件允许还会接着做。cntk2
- 打过了趟深圳回来后,已经快半个月,在广州购书中心逛了下,发现2本前端书《重构HTML-改善WEB应用的设计》、《CSS3 实战》,看了一半《
- pycharm安装cv2模块安装失败和无法使用的解决步骤一我们先到这个网址:cv2下载地址去下载与自己python版本号和电脑位数对应的op
- 介绍代码地址:https://github.com/taishan1994/chinese_chengyujielong读完该文,你可以收获