# innobase_reader
**Repository Path**: jeanhwea/innobase_reader
## Basic Information
- **Project Name**: innobase_reader
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2024-08-08
- **Last Updated**: 2025-08-09
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
#+TITLE: ibr - Innobase Reader
#+AUTHOR: Jinghui Hu
#+EMAIL: hujinghui@buaa.edu.cn
#+DATE: <2024-08-11 Sun>
#+STARTUP: overview num indent
#+OPTIONS: ^:nil
* Install
1. Download latest package from github release page | [[https://github.com/Jeanhwea/innobase_reader/releases/latest][here]]
- Windows user choose innobase_reader_xxx_x86_64-pc-windows-gnu.zip
- Linux user choose innobase_reader_xxx_x86_64-unknown-linux-musl.tar.gz
2. Uncompress package to get executable binary file (*ibr* or *ibr.exe*), THAT IT
- The executable binary has no dependencies
- You can put it on any directory in your system PATH
* Introduction
** Usage
#+BEGIN_SRC sh :exports both :results output
ibr -h
#+END_SRC
#+RESULTS:
#+begin_example
The innobase datafile(*.ibd) reader
Usage: ibr
Commands:
info Print basic information
list List all page. page_type, page_number and more
desc Describe datafile information by sdi page
sdi Print SDI json
view View page data with given page_no
dump Dump index page user records
help Print this message or the help of the given subcommand(s)
Arguments:
Input innodb datafile. for example departments.ibd
Options:
-h, --help Print help
-V, --version Print version
#+end_example
** Commands
*** info - list basic information
#+BEGIN_SRC sh :exports both :results output
ibr ./data/departments.ibd info
#+END_SRC
#+RESULTS:
#+begin_example
Meta Information:
version => server(80037), space(1)
space_id => 3
page_count => 8
file_size => 131072
PageTypes Statistics:
ALLOCATED => 2
INODE => 1
IBUF_BITMAP => 1
FSP_HDR => 1
SDI => 1
INDEX => 2
#+end_example
*** list - list all page basic information
#+BEGIN_SRC sh :exports both :results output
ibr ./data/departments.ibd list
#+END_SRC
#+RESULTS:
: page_no=0, page_type=FSP_HDR, space_id=3, lsn=20329829, offset=0x0(0)
: page_no=1, page_type=IBUF_BITMAP, space_id=3, lsn=20328997, offset=0x4000(16384)
: page_no=2, page_type=INODE, space_id=3, lsn=20329829, offset=0x8000(32768)
: page_no=3, page_type=SDI, space_id=3, lsn=20338300, offset=0xc000(49152)
: page_no=4, page_type=INDEX, space_id=3, lsn=20449347, offset=0x10000(65536)
: page_no=5, page_type=INDEX, space_id=3, lsn=20449393, offset=0x14000(81920)
: page_no=6, page_type=ALLOCATED, space_id=0, lsn=0, offset=0x18000(98304)
: page_no=7, page_type=ALLOCATED, space_id=0, lsn=0, offset=0x1c000(114688)
*** desc - like desc on mysql client, it prints table structure
#+BEGIN_SRC sh :exports both :results output
ibr ./data/departments.ibd desc
#+END_SRC
#+RESULTS:
#+begin_example
COL1: name=dept_no, type=STRING, nullable=false, data_len=16, utf8_def=char(4)
COL2: name=dept_name, type=VARCHAR, nullable=false, data_len=161, utf8_def=varchar(40)
COL3: name=DB_TRX_ID, type=INT24, nullable=false, data_len=6, utf8_def=
COL4: name=DB_ROLL_PTR, type=LONGLONG, nullable=false, data_len=7, utf8_def=
IDX1: name=PRIMARY, type=IT_PRIMARY, id=155, root=4, algorithm=IA_BTREE
(1-1): column_opx=0, col_name=dept_no, order=ORDER_ASC, ele_len=16, hidden=false, isnil=false, isvar=true
(1-2): column_opx=2, col_name=DB_TRX_ID, order=ORDER_ASC, ele_len=-1, hidden=true, isnil=false, isvar=false
(1-3): column_opx=3, col_name=DB_ROLL_PTR, order=ORDER_ASC, ele_len=-1, hidden=true, isnil=false, isvar=false
(1-4): column_opx=1, col_name=dept_name, order=ORDER_ASC, ele_len=-1, hidden=true, isnil=false, isvar=true
IDX2: name=dept_name, type=IT_UNIQUE, id=156, root=5, algorithm=IA_BTREE
(2-1): column_opx=1, col_name=dept_name, order=ORDER_ASC, ele_len=160, hidden=false, isnil=false, isvar=true
(2-2): column_opx=0, col_name=dept_no, order=ORDER_ASC, ele_len=-1, hidden=true, isnil=false, isvar=true
#+end_example
*** sdi - like ibd2sdi, it prints SDI data on SDI page
#+BEGIN_SRC sh :exports both :results output
ibr ./data/departments.ibd sdi | grep -A 40 "columns"
#+END_SRC
#+RESULTS:
#+begin_example
"columns": [
{
"name": "dept_no",
"type": 29,
"is_nullable": false,
"is_zerofill": false,
"is_unsigned": false,
"is_auto_increment": false,
"is_virtual": false,
"hidden": 1,
"ordinal_position": 1,
"char_length": 16,
"numeric_precision": 0,
"numeric_scale": 0,
"numeric_scale_null": true,
"datetime_precision": 0,
"datetime_precision_null": 1,
"has_no_default": true,
"default_value_null": false,
"srs_id_null": true,
"srs_id": 0,
"default_value": "ICAgICAgICAgICAgICAgIA==",
"default_value_utf8_null": true,
"default_value_utf8": "",
"default_option": "",
"update_option": "",
"comment": "",
"generation_expression": "",
"generation_expression_utf8": "",
"options": "interval_count=0;",
"se_private_data": "table_id=1065;",
"engine_attribute": "",
"secondary_engine_attribute": "",
"column_key": 2,
"column_type_utf8": "char(4)",
"elements": [],
"collation_id": 255,
"is_explicit_collation": false
},
{
"name": "dept_name",
#+end_example
*** view - prints page structure
#+BEGIN_SRC sh :exports both :results output
ibr ./data/departments.ibd view 0 | grep -A 20 BasePage
#+END_SRC
#+RESULTS:
#+begin_example
BasePage {
addr: 0x0000@(0),
fil_hdr: FilePageHeader {
addr: 0x0000@(0),
check_sum: 0xbfb1ff11(3216113425),
page_no: 0,
prev_page: 0x000138a5(80037),
next_page: 0x00000001(1),
lsn: 0x0000000001363565(20329829),
page_type: FSP_HDR,
flush_lsn: 0x0000000000000000(0),
space_id: 3,
},
page_body: FileSpaceHeaderPageBody {
addr: 0x0026@(38),
fsp_hdr: FileSpaceHeader {
addr: 0x0026@(38),
space_id: 3,
notused: 0,
fsp_size: 8,
free_limit: 64,
#+end_example
*** dump - dump row data
#+BEGIN_SRC sh :exports both :results output
ibr ./data/departments.ibd dump 4 -l 3
#+END_SRC
#+RESULTS:
#+begin_example
,**************************************** Row 1 ****************************************
dept_no => Str("d001")
DB_TRX_ID => TrxId(0x00000000053d)
DB_ROLL_PTR => RollPtr(0x820000008d0110)
dept_name => Str("Marketing")
,**************************************** Row 2 ****************************************
dept_no => Str("d002")
DB_TRX_ID => TrxId(0x00000000053d)
DB_ROLL_PTR => RollPtr(0x820000008d011d)
dept_name => Str("Finance")
,**************************************** Row 3 ****************************************
dept_no => Str("d003")
DB_TRX_ID => TrxId(0x00000000053d)
DB_ROLL_PTR => RollPtr(0x820000008d012a)
dept_name => Str("Human Resources")
ONLY dump 3 of 9 rows, use `--limit num' to dump more
#+end_example
* Build
Install rust toolchain and build with cargo
#+BEGIN_SRC sh
cargo build
#+END_SRC
* Limitation
1. only support *ibd* in MySQL 8.0.x
- cannot parse *frm* table structure now
2. only support limited data type
- char/varchar
- int/bigint
- date/datetime/timestamp
3. don't support overflow page now