6种innodb数据字典恢复方法

https://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting-datadict.html

frm文件重于一切,无论是改表结构还是删表

问题一
误删frm文件或者把frm文件改名为其他名字,比如123.frm改为123.txt的解决办法
或者把frm文件删除了

CREATE TABLE Failure Due to Orphan Table

A symptom of an out-of-sync data dictionary is that a CREATE TABLE statement fails. If this occurs, look in the server's error log. If the log says that the table already exists inside the InnoDB internal data dictionary, you have an orphan table inside the InnoDB tablespace files that has no corresponding .frm file. The error message looks like this:

InnoDB: Error: table test/parent already exists in InnoDB internal
InnoDB: data dictionary. Have you deleted the .frm file
InnoDB: and not used DROP TABLE? Have you used DROP DATABASE
InnoDB: for InnoDB tables in MySQL version <= 3.23.43?
InnoDB: See the Restrictions section of the InnoDB manual.
InnoDB: You can drop the orphaned table inside InnoDB by
InnoDB: creating an InnoDB table with the same name in another
InnoDB: database and moving the .frm file to the current database.
InnoDB: Then MySQL thinks the table exists, and DROP TABLE will
InnoDB: succeed.

解决方法
如果只是改名把frm文件重新改回123.frm即可
如果是误删frm文件,那么在另一个库新建一个表结构和表名一样的表,然后把frm文件拷贝到当前数据库下

 CREATE TABLE `tt` (
`id` int() NOT NULL AUTO_INCREMENT,
`name` varchar() DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT= DEFAULT CHARSET=utf8 删除frm文件之后,不停止mysql,执行show create table依然能显示tt表的表结构
根据表结构在school2库创建tt表,拷贝frm文件到school库,改文件权限,重启mysql,tt表正常 rm -f ./tt.frm
ll cd school2
ll
cp tt.frm ../school/
cd ../school/
ll
chown mysql:mysql ./tt.frm
/etc/init.d/mysql stop
/etc/init.d/mysql start
/usr/local/mysql/bin/mysql -uroot -p -S /data/mysql/mysql3306/tmp/mysql.sock

问题二
误删了ibd文件
ERROR 1016: Can't open file: 'child2.ibd'. (errno: 1)

解决方法
直接把frm文件删除即可,整个表就会删除

我的测试结果是 ,直接drop table就可以了,连frm文件也会删除


问题三
Orphan Intermediate Tables
删除孤儿中间表
ALTER TABLE 操作 (ALGORITHM=INPLACE),一般会产生孤儿中间表


问题四
Orphan Temporary Tables
删除孤儿临时表
在做table-copying表数据拷贝的时候 ALTER TABLE 操作 (ALGORITHM=COPY),mysql突然挂了
会产生孤儿临时表


问题五
表空间不存在
Tablespace Does Not Exist
ibd文件和frm文件被误删
但是ibdata1里面的InnoDB data dictionary 数据字典依然保留着表空间ID tablespace id N

解决方法
在其他库里创建一个相同表结构的表,然后把frm文件拷贝到当前库,然后drop table把表删除
innodb会把ibd文件丢失的信息打印到errorlog里面

CREATE TABLE `t6` (
`id` int() DEFAULT NULL,
`name` varchar() DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 删除frm和ibd文件之后,不停止mysql,执行show create table依然能显示t6表的表结构
根据表结构在school2库创建t6表,拷贝frm文件到school库,改文件权限,然后删除t6表,drop table t6,删除成功 -- :: 7fe40808b700 InnoDB: Operating system error number in a file operation.
InnoDB: The error means the system cannot find the path specified.
-- :: [ERROR] InnoDB: File ./school/tt.ibd: 'delete' returned OS error .
-- :: 7fe40808b700 InnoDB: Operating system error number in a file operation.
InnoDB: The error means the system cannot find the path specified.
-- :: [ERROR] InnoDB: File ./school/t6.ibd: 'delete' returned OS error .

问题六
还原孤儿 File-Per-Table ibd文件
Restoring Orphan File-Per-Table ibd Files
没有frm文件只有ibd文件

解决方法
利用表空间传输,根据表结构新建同样的表,然后导入ibd文件

http://www.cnblogs.com/gomysql/p/3702216.html

mysql> CREATE DATABASE sakila;

mysql> USE sakila;

mysql> CREATE TABLE actor (
-> actor_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
-> first_name VARCHAR() NOT NULL,
-> last_name VARCHAR() NOT NULL,
-> last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-> PRIMARY KEY (actor_id),
-> KEY idx_actor_last_name (last_name)
-> )ENGINE=InnoDB DEFAULT CHARSET=utf8; mysql> ALTER TABLE sakila.actor DISCARD TABLESPACE; shell> cp /backup_directory/actor.ibd path/to/mysql-5.7/data/sakila/ mysql> ALTER TABLE sakila.actor IMPORT TABLESPACE; SHOW WARNINGS;
Query OK, rows affected, warning (0.15 sec) Warning | | InnoDB: IO Read error: (, No such file or directory)
Error opening './sakila/actor.cfg', will attempt to import
without schema verification mysql> SELECT COUNT(*) FROM sakila.actor;
+----------+
| count(*) |
+----------+
| |
+----------+

6种innodb数据字典恢复方法的更多相关文章

  1. Cisco设备IOS的恢复方法 两种方法

    如果不小心把Router或者Switch的IOS删除了,特别是Flash中的IOS和ROM中的Mini IOS都没有了的话,连启动都不行的话,有什么方法恢复它呢?答案是方法不只一种,而是两种.其实是我 ...

  2. linux系统文件被删的几种恢复方法

    参考链接:https://www.cnblogs.com/276815076/p/5703796.html 1.几种恢复方法,这里只是记录别的博客提到的方法,本人并未亲自验证. ext3用ext3gr ...

  3. Redo丢失的4种情况及处理方法

    这篇文章重点讨论Redo丢失的几种情况,及每种情况的处理方法. 一.说明:1.以下所说的当前日志指日志状态为CURRENT,ACTIVE,非当前日志指日志状态为INACTIVE2.不用考虑归档和非归档 ...

  4. Vertica集群单节点宕机恢复方法

    Vertica集群单节点宕机恢复方法 第一种方法: 直接通过admintools -> 5 Restart Vertica on Host 第二种方法: 若第一种方法无法恢复,则清空宕机节点的c ...

  5. Oracle数据库常见的误操作恢复方法(上)

    实验环境:Linux6.4 + Oracle 11g 面向读者:Oracle开发维护人员 概要: 1.误操作drop了emp表 2.误操作delete了emp表 3.误操作delete了emp表的部分 ...

  6. MySQL · 引擎特性 · InnoDB 崩溃恢复过程

    MySQL · 引擎特性 · InnoDB 崩溃恢复过程 在前面两期月报中,我们详细介绍了 InnoDB redo log 和 undo log 的相关知识,本文将介绍 InnoDB 在崩溃恢复时的主 ...

  7. ORACLE表数据误删除的恢复方法(提交事务也可以)

    ORACLE表数据误删除的恢复方法(提交事务也可以) 缓存加时间戳 开启行移动功能:ALTER TABLE tablename ENABLE row movement 把表还原到指定时间点:flash ...

  8. SQLMAP注入教程-11种常见SQLMAP使用方法详解

    sqlmap也是渗透中常用的一个注入工具,其实在注入工具方面,一个sqlmap就足够用了,只要你用的熟,秒杀各种工具,只是一个便捷性问题,sql注入另一方面就是手工党了,这个就另当别论了.今天把我一直 ...

  9. MySQL全备+binlog恢复方法之伪装master【原创】

    利用mysql全备 +binlog server恢复方法之伪装master 单实例试验 一.试验环境 10.72.7.40 实例 mysql3306为要恢复的对象,mysql3306的全备+binlo ...

随机推荐

  1. js 六种数据类型的区别及bool 转换判断

    一.bool型转换判断: 1.true 和 1 比较是相同,false 和 0 比较是相同(是 “==” 比较),因为内部会实现数据类型的 转化,将true 转换成1,将false 转换成0, js ...

  2. [algorithm] Dijkstra双栈算法表达式求值算法

    一.原理 Dijkstra所做的一个算法,双栈求值,用两个栈(一个保存运算符,一个用于保存操作数), 表达式由括号,运算符和操作数组成. (1).将操作数压入操作数栈 (2).将运算符压入运算符栈: ...

  3. Tomcat -- 启动错误 -- 解决锦集

    java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addFilter :在Tomacat7的context.xml文 ...

  4. 前端html、CSS快速编写代码插件-Emmet使用方法技巧详解

    前端html.CSS快速编写代码插件-Emmet使用方法技巧详解   Emmet的前身是大名鼎鼎的Zen coding,如果你从事Web前端开发的话,对该插件一定不会陌生.它使用仿CSS选择器的语法来 ...

  5. 在移动端如何用swiper实现导航栏效果

    我们在写移动端的时候会有滑动和点击导航后滑动到目标页面功能:而这个功能如果自己写的话会很麻烦,所以我在这推荐一下swiper这个插件. 其实swiper中的官网中也有这种功能的实现,但是我认为是有点麻 ...

  6. db2 MON_GET_PKG_CACHE_STMT 表函数 抓取分析SQL

    MON_GET_PKG_CACHE_STMT 表函数 还可以使用 MON_GET_PKG_CACHE_STMT 表函数来查询当前 PACKAGE CACHE 中 SQL 语句(包括动态 SQL 和静态 ...

  7. PAT甲级1013-1014-1015

    题目:1013 Battle Over Cities 思路:城市数也就1000, 对于每次询问暴力bfs一下看一下有多少连通块就行了.答案就是联通块数减一. #include<stdio.h&g ...

  8. 英语专业出身也要走向python

    这两年一直徘徊在学习python和放弃python的道路上不断的徘徊,今年终于没有在蹉跎下去,选择了开始新的自我挑战,零基础开始学习python. 作为一名英语专业毕业的文科生,学习编程还是相对有些困 ...

  9. Codeforces 1096D - Easy Problem - [DP]

    题目链接:http://codeforces.com/problemset/problem/1096/D 题意: 给出一个小写字母组成的字符串,如果该字符串的某个子序列为 $hard$,就代表这个字符 ...

  10. [No000010E]Git7/9-标签管理

    发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本.将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来.所以,标签也是版本库的一个快照 ...