从ibd文件获取表空间id
xtrabackup恢复过程中出现如下错误
InnoDB: Doing recovery: scanned up to log sequence number ( %)
InnoDB: Doing recovery: scanned up to log sequence number ( %)
:: InnoDB: Starting an apply batch of log records to the database...
InnoDB: Progress in percents: :: InnoDB: Error: space id and page n:o stored in the page
InnoDB: read in are :, should be :!
InnoDB: Database page corruption on disk or a failed
InnoDB: file read of page .
InnoDB: You may have to recover from a backup.
:: InnoDB: Page dump in ascii and hex ( bytes):
从错误信息中可以看出,有页损坏了,并给出了space id和page no (51,8406774).
在非共享表空间(即innodb_file_per_table=on)时,每个表对应一个表空间。那么我们怎么通过表空间id(即space id)得到对应的表呢?
在mysql 5.6以上版本中,可通过查询information_schema.INNODB_SYS_DATAFILES得到表空间id和表的对应关系,
http://dev.mysql.com/doc/refman/5.6/en/innodb-sys-datafiles-table.html
mysql> select * from information_schema.INNODB_SYS_DATAFILES where space=;
+-------+---------------+
| SPACE | PATH |
+-------+---------------+
| | .\test\t2.ibd |
+-------+---------------+
然而出现此问题的mysql版本为5.1.那么我们怎么得到5.6以下版本表空间id和表的对应关系呢。
从源码中可以看到,每个表空间第一个页的偏移38字节处,用4个字节存储了表空间id信息。参看函数fsp_header_init_fields
于是写了个小工具直接从idb文件读取表空间id信息。
例如获取表t1的表空间为795
$ sudo ./test /u01/mysql/data/test/t1.ibd
spaceid: , file:/u01/mysql/data/test/t1.ibd
工具源码如下:
#include "stdlib.h"
#include "stdio.h" #ifdef _WIN64
typedef unsigned __int64 ulint;
#else
typedef unsigned long int ulint; #endif /* _WIN64 */ typedef unsigned char byte; ulint
mach_read_from_4(
byte* b) /*!< in: pointer to four bytes */
{
return( ((ulint)(b[]) << )
| ((ulint)(b[]) << )
| ((ulint)(b[]) << )
| (ulint)(b[])
);
} void main(int argc,char *argv[])
{
FILE *fp;
byte ret[];
int offset;
ulint spaceid; if ((fp=fopen(argv[],"r"))==NULL)
{
printf("cannot open this file\n");
exit();
} offset=;
if (fseek(fp,offset,)!=)
{
printf("cannot move pointer there.\n");
exit();
} fread(ret,sizeof(byte),,fp);
spaceid = mach_read_from_4(ret); printf("spaceid:%lu , file:%s\n",spaceid,argv[]); fclose(fp);
}
从ibd文件获取表空间id的更多相关文章
- MySQL innodb引擎下根据.frm和.ibd文件恢复表结构和数据
记录通过.frm和.ibd文件恢复数据到本地 .frm文件:保存了每个表的元数据,包括表结构的定义等: .ibd文件:InnoDB引擎开启了独立表空间(my.ini中配置innodb_file_per ...
- MySQL 利用frm文件和ibd文件恢复表结构和表数据
文章目录 frm文件和ibd文件简介 frm文件恢复表结构 ibd文件恢复表数据 通过脚本利用ibd文件恢复数据 通过shell脚本导出mysql所有库的所有表的表结构 frm文件和ibd文件简介 在 ...
- mysql innodb 从 ibd 文件恢复表数据
最近内部的 mysql 数据库发生了一件奇怪的事,其中有一个表 users625 突然出现问题, 所有对它的操作都报错误 数据表不存在. mysql> select count(*) from ...
- mysql5.7根据.frm和.ibd文件恢复表结构和数据
一.恢复表结构 1.环境:Windows .mysql5.7:首先创建一个数据库,可以通过navicat来创建: 2.使用当前创建的数据库:use ww; 3.随意创建一张表,但是这张表的名字 ...
- 获取表空间的语句 以及 建表和索引的ddl
alter session set container=PHD1; SET SERVEROUTPUT ON SET LINESIZE SET FEEDBACK OFF SET PAGESIZE sel ...
- 通过Oracle DUMP 文件获取表的创建语句
1. 有了dump文件之后 想获取表的创建语句. 之前一直不知道 dump文件能够直接解析文件. 今天学习了下 需要的材料. dump文件, dump文件对应的schema和用户. 以及一个版本合适的 ...
- oracle创建表空间 扩展表空间文件 修改表空间自动增长
1. 创建表空间 create tablespace SIRM2 datafile 'D:\oracle\product\10.2.0\oradata\orcl\SIRM2.dbf' size 10 ...
- mssql 获取表空间大小
create table #Data(name varchar(100),row varchar(100),reserved varchar(100),data varchar(100),index_ ...
- MYSQL获取表空间大小
SELECT table_name AS "Table", round(((data_length + index_length) / 1024 / 1024), 2) as si ...
随机推荐
- Spring Boot + docker +mongo
启动mongo镜像 docker run --name mongo-container -d -P mongo 连接到容器内 docker exec -it eb sh 输入:mongo 输入:sho ...
- eclipse maven jdk全局设置
<profile> <id>jdk-1.8</id> <activation> <activeByDefault>true</acti ...
- Redis注意事项
1.Redis3.0没有虚拟内存概念,已从2.4就移除: 2.redis挂掉并重启时,如果有主从备份的,主机挂掉重启时先关掉主从备份,不然从机的数据会被冲洗掉 数据恢复时如果有 AOF(原理是将Rei ...
- 程序员必知的8大排序(一)-------直接插入排序,希尔排序(java实现)
http://blog.csdn.net/pzhtpf/article/details/7559896 程序员必知的8大排序(一)-------直接插入排序,希尔排序(java实现) 程序员必知的8大 ...
- tomcat之日志切割
日志分割 场景:日志量比较大,且研发程序没有设置分卷 1.配置样例: 文件路径:/etc/logrotate.d/tomcat /data/logs/catalina.out { daily comp ...
- 对Java虚拟机理解
深入理解Java虚拟机 Java技术体系 Java体系分为四个平台 Java card 运行在小内存上的 Java ME 运行在手机上 Java SE 完整Java 核心api JavaEE 支持使用 ...
- #if defined 和 #if ! defined 的用法
背景:MFC初学,头文件中有#if !defined(AFX_HELLOMFC_H__706D36F5_2F1B_40AC_8BE9_0BD6A1D7BBDE__INCLUDED_)#define A ...
- 获取ip 笔记
使用命令 Request.UserHostAddress;//IP地址 Request.UserHostName;//用户名. 1. 在ASP.NET中专用属性: 获取服务器电脑名:Page.Serv ...
- ADO.NET 【攻击及防御】
sql字符串注入攻击 SQL注入攻击是黑客对数据库进行攻击的常用手段之一.SQL注入的手法相当灵活 SQL注入攻击会导致的数据库安全风险包括:刷库.拖库.撞库. 一般来说,SQL注入一般存在于形如:H ...
- CSS 分类 选择器
CSS:层叠样式表(英文全称:Cascading Style Sheets) 后缀名:css 标志 style 对网页中元素位置的排版进行像素级精 ...