C语言版Mysql存储块(page)格式读取工具(源代码)

本文原创为freas_1990,转载请标明出处:http://blog.csdn.net/freas_1990/article/details/45843615

C版本的Mysql存储块格式读取工具源代码如下:

其中mysql块存储采用大端字节,所以需要做一定的转换,C语言指针强力转换方式如下:

#include <stdio.h>
#include <stdlib.h>

int readpage(unsigned char * page_hdr,int page_off,FILE *fd) {
	int ret = -1;
	if((ret = fseek(fd,page_off,SEEK_SET)) != 0) {	//fseek error may not be caught successfully here
		printf("fseek failed\n");
		exit(-1);
	}
	printf("now from our calclation page_off is %d\n",page_off);
	if(!(ret = fread(page_hdr,62,1,fd))) {
		printf("read page failed! ret is %d\n",ret);
		return -1;
	}
	return 1;
}

int main() {
	unsigned char page_hdr_tmp[62];
	unsigned char * tmp;
	unsigned int page_offset = 0;
	unsigned short page_type = 0;
	unsigned int tab_space_id = 0;
	unsigned short page_level = 0;
	int ret = -1;
	int page_count = 0;
	int filesize = 0;
	FILE *fd;
	if(!freopen("C:\\MinGW\\bin\\log.txt", "w", stdout)) {
		printf("log file created failed!\n");
	}

	if(!(fd = fopen("C:\\MinGW\\bin\\payment.ibd","rb"))) {
		printf("fopen failed!\n");
		return -1;
	}
	if((ret = fseek(fd,0,SEEK_END)) != 0) {
		printf("fseek failed\n");
		exit(-1);
	}
	filesize = ftell(fd);

	printf("filesize is %d\n",filesize);

	while (page_count < filesize/1024/16) {
		printf("processing the %d [rd] page\n",page_count);
		if(ret = readpage(page_hdr_tmp, page_count*16*1024, fd)) {
			page_count++;
		} else {
			printf("readpage failed!\n");
			system("pause");
			exit -1;
		}
		//for page_offset
		tmp = (unsigned char *)&page_offset;
		tmp[0] = page_hdr_tmp[7];
		tmp[1] = page_hdr_tmp[6];
		tmp[2] = page_hdr_tmp[5];
		tmp[3] = page_hdr_tmp[4];

		//for page_type
		tmp = (unsigned char *)&page_type;
		tmp[0] = page_hdr_tmp[25];
		tmp[1] = page_hdr_tmp[24];

		//for tab_space_id
		tmp = (unsigned char *)&tab_space_id;
		tmp[0] = page_hdr_tmp[37];
		tmp[1] = page_hdr_tmp[36];
		tmp[2] = page_hdr_tmp[35];
		tmp[3] = page_hdr_tmp[34];

		//for page_level
		tmp = (unsigned char *)&page_level;
		tmp[0] = page_hdr_tmp[61];
		tmp[1] = page_hdr_tmp[60];

		printf("page_offset is %d\n",page_offset);
		printf("page_type is %x\n",page_type);
		printf("tab_space_id is %x\n",tab_space_id);
		printf("page_level is %x\n\n",page_level);
	}
	fclose(fd);
	system("pause");
	return 0;
}

我们打开程序输出的log来看,信息如下:

filesize is 10485760
processing the 0 [rd] page
now from our calclation page_off is 0
page_offset is 0
page_type is 8
tab_space_id is 11
page_level is b

processing the 1 [rd] page
now from our calclation page_off is 16384
page_offset is 1
page_type is 5
tab_space_id is 11
page_level is 0

processing the 2 [rd] page
now from our calclation page_off is 32768
page_offset is 2
page_type is 3
tab_space_id is 11
page_level is 0

processing the 3 [rd] page
now from our calclation page_off is 49152
page_offset is 3
page_type is 45bf
tab_space_id is 11
page_level is 0

其中page_type的45bf代表的是索引节点。而page_level是0,意思是,索引节点的层级为0。

到了第75 [rd]块的时候,所有块都是空白块了。

processing the 74 [rd] page
now from our calclation page_off is 1212416
page_offset is 74
page_type is 45bf
tab_space_id is 11
page_level is 0

processing the 75 [rd] page
now from our calclation page_off is 1228800
page_offset is 0
page_type is 0
tab_space_id is 0
page_level is 0

processing the 76 [rd] page
now from our calclation page_off is 1245184
page_offset is 0
page_type is 0
tab_space_id is 0
page_level is 0

测试的ibd文件是mysql 5.6自带的sakila库下的payment.ibd。

时间: 2024-10-31 21:06:54

C语言版Mysql存储块(page)格式读取工具(源代码)的相关文章

用C语言操纵Mysql

原文:用C语言操纵Mysql 以下代码块是用来连接数据库的通讯过程,要连接MYSQL,必须建立MYSQL实例,通过mysql_init初始化方能开始进行连接. typedef struct st_mysql { NET net; /* Communication parameters */ gptr connector_fd; /* ConnectorFd for SSL */ char *host,*user,*passwd,*unix_socket, *server_version,*hos

搞定linux上MySQL编程(六):C语言编写MySQL程序(结)

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 在实际应用中,我们不可能在命令行登录进数据库进行数据的查询.插入等操作,用户一般是使用一个界面良好的应用程序软件来对数据进行管理.为了方便应用程序的开发,MySQL提供了多种编程语言(C.perl.php等)的编程接口,供开发者使用. 对于C语言来说,MySQL提供了C语言客户机库,它允许从任何C程序的内部访问MySQL数据库,客户机实现API,API定义了客户机如何建立和执

使用C语言调用mysql数据库编程实战以及技巧

今天编写使用C语言调用mysql数据库编程实战以及技巧.为其它IT同行作为參考,当然有错误能够留言,共同学习. 一.mysql数据库的C语言经常使用接口API 1.首先当然是链接数据库mysql_real_connect,原型例如以下: MYSQL * STDCALL mysql_real_connect( MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned

寒假答辩作品——掘地求升C语言版

寒假答辩—掘地求升(C语言版) 前言 这个是作为寒假答辩作品写的. 之前考虑过用Unity写个游戏,但毕竟不熟悉C#,感觉几乎都是在套模板,而且写着不顺手,有想法却只能 看着C#发呆,很是无奈,所以决定还是选熟悉的C语言写一个大程序.正愁没灵感的时候,我突然看见了它: 然后我开始了几天快乐并痛苦的自闭抡锤子之旅,然后又痛苦并快乐的用C写下了这个游戏qwq. github代码:https://github.com/404name/C-game/blob/master/掘地求升 答辩网页:https

人事管理系统 c语言版

int menu(){ printf("请按提示输入完成操作!\n"); printf("1.查询员工信息\n"); printf("2.统计员工数量\n"); printf("3.录入员工信息\n"); printf("4.删除员工信息\n"); printf("5.按id排序所有员工\n"); printf("6.打印所有员工信息\n"); printf(&quo

c语言操作mysql数据库

c语言操作Mysql数据库,主要就是为了实现对数据库的增.删.改.查等操作,操作之前,得先连接数据库啊,而连接数据库主要有两种方法.一.使用mysql本身提供的API,在mysql的安装目录中可可以看到大量的头文件.lib文件.dll文件,这说明mysql原生就支持了c语言,操作起来相当简单.二.使用win32 api(这里只探讨windows平台),主要是ODBC. ODBC API 接口是(Open Database Connectivity)开放式数据库接口,它建立了一组规范,并提供了一组

有道云笔记网页版(Cloud notes page)

插件介绍: 说到储存,小伙伴们都有自己的储存方法,今天为大家推荐一款云储存的插件.有道云笔记(note.youdao.com)是网易旗下有道搜索推出的笔记类应用,通过云存储技术帮助用户建立一个可以轻松访问.安全存储的云笔记空间,解决个人资料和信息跨平台跨地点的管理问题. 使用说明: 将有道云笔记网页版(Cloud notes page)添加至chrome,并在应用中启动它. 功能介绍: -免去数据线传输烦恼,手机电脑轻松同步; -资料多重备份,云端存储永不丢失;-分类整理纷繁资料,支持丰富附件格

C语言对mysql数据库的操作

原文:C语言对mysql数据库的操作 这已经是一相当老的话题.不过今天我才首次使用,把今天的一些体会写下来,也许能给一些新手带来一定的帮助,更重要的是供自己今后忘记的怎么使用而进行查阅的! 我们言归正传 1.头文件: #include <stdio.h> #include <stdlib.h> #include <mysql/mysql.h> //这个是必需要包含的,下面对mysql的所有操作函数,都出自这里 2.定义一个MYSQL变量: MYSQL mysql: 这里

Linux C语言操作MySQL

原文:Linux C语言操作MySQL 1.MySQL数据库简介 MySQL是一个开源码的小型关系数据库管理系统,体积小,速度快,总体成本低,开源.MySQL有以下特性: (1) 使用C和C++编写,并使用了多种编译器进行测试,保证源码的可移植性. (2) 支持多线程,利用CPU资源,支持多用户. (3) 可以处理拥有上千万条记录的大型数据库. (4)既可以作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为 一个库而嵌入到其他软件中去. 2. MySQL数据库的安装 安装MySQL数