IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> MySQL InnoDB 表不存在问题修复 -> 正文阅读

[大数据]MySQL InnoDB 表不存在问题修复

MySQL 可能会由于各种原因表空间损坏,导致 show tables 可以看到表,但 show create table 或 select 查询等操作时,提示表不存在

问题

MySQL InnoDB 引擎的表 show tables 可以看到表存在,但使用时提示表不存在,为了避免数据丢失,需要进行数据恢复。如果数据可以丢失或再次写入,可直接 drop 之后,手动删除表物理文件,并重新创建表写入数据。
这里只针对需要保留数据的情况进行恢复

前提条件

  • 数据文件ibd文件存在
  • 存在表结构备份,可以找到一模一样的create table语句
  • 这里以系统表 mysql.gtid_executed 表为例

恢复步骤

为了避免操作失误导致数据丢失,可先将对应数据文件多复制一份到临时路径
本身可以直接在业务库进行恢复,但这里为了避免恢复重要数据,导致其他不可控异常,所以新建临时库进行恢复

-- 在问题数据库创建一个临时测试库,修复完成可进行删除
create database gtid_recover;

use gtid_recover
-- 创建对应异常的表,所以此操作需要存在表结构备份
CREATE TABLE `gtid_executed` (
  `source_uuid` char(36) NOT NULL COMMENT 'uuid of the source where the transaction was originally executed.',
  `interval_start` bigint(20) NOT NULL COMMENT 'First number of interval.',
  `interval_end` bigint(20) NOT NULL COMMENT 'Last number of interval.',
  PRIMARY KEY (`source_uuid`,`interval_start`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 数据库临时表上操作
-- 丢弃该表的表空间,这步会删除 ibd 文件
ALTER TABLE gtid_executed DISCARD TABLESPACE;
-- 在机器上进行操作,将备份 ibd 文件放入表中
cp /backup_dir/gtid_executed.ibd /mysqldatadir/mysql/
chown -R mysql.mysql /mysqldatadir
-- 导入表空间
alter table gtid_executed IMPORT TABLESPACE;
-- 此时在测试库的临时表已经恢复,show create table 和 select 应该都可以正常执行

-- 删除故障表,rename 到业务库中,恢复业务,这里使用的是 MySQL 系统库示例,所以 rename 到了 mysql 库
use gtid_recover
rename table gtid_executed to mysql.gtid_executed_bak;
use mysql
-- 此时drop会报错,但相关数据仍可以被删除,下步 rename 可以执行成功
drop table gtid_executed;
rename table gtid_executed_bak to gtid_executed;

改表期间数据库崩溃导致异常

如果使用临时表的方式改表,改表过程中数据库异常崩溃,此时需要先找到删除该表中间的临时表,再进行上述操作。

如果数据库存在主从架构,需执行完成后,根据主从异常报错信息处理对应主从问题即可

  1. 查找临时表名称 SQL
    SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE '%#sql%';
  2. 在物理机上,将临时表空间文件改为查询后的表名
    mv \#sql-物理机显示名称.frm \#sql-上步查询结果.frm
  3. 删除这个孤立的临时表
    drop table 第一步查询结果的临时表名
  4. 按照前面恢复步骤再重构表,恢复数据库异常
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-07-03 10:53:18  更:2022-07-03 10:55:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 2:06:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码