inno log

Analyze InnoDB redo log files.

Synopsis

inno log -f <file> [-b <blocks>] [--no-empty] [-v] [--json]

Description

Opens an InnoDB redo log file and displays its internal structure. Supports both legacy and modern redo log formats:

  • Legacy format (MySQL < 8.0.30): ib_logfile0 and ib_logfile1 files in the data directory.
  • Modern format (MySQL 8.0.30+): #ib_redo* files in the #innodb_redo/ subdirectory.

InnoDB redo logs are organized as a sequence of 512-byte blocks:

  • Block 0: Log file header (group ID, start LSN, file number, creator string).
  • Block 1: Checkpoint record 1 (checkpoint number, LSN, offset, buffer size, archived LSN).
  • Block 2: Reserved/unused.
  • Block 3: Checkpoint record 2.
  • Blocks 4+: Data blocks containing the actual redo log records.

For each data block, the header is decoded to show the block number, data length, first-record-group offset, checkpoint number, flush flag, and CRC-32C checksum validation status.

With --verbose, the payload bytes of each non-empty data block are scanned for MLOG record type bytes (e.g., MLOG_REC_INSERT, MLOG_UNDO_INSERT, MLOG_WRITE_STRING) and a frequency summary is printed. MLOG record type decoding is skipped for MariaDB redo logs due to incompatible format.

Vendor detection is performed automatically from the log file header's creator string.

Flags

FlagShortRequiredDefaultDescription
--file <path>-fYes--Path to redo log file (ib_logfile0, ib_logfile1, or #ib_redo*).
--blocks <count>-bNoAll data blocksLimit output to the first N data blocks.
--no-empty--NoOffSkip blocks that contain no redo log data.
--verbose-vNoOffDecode and display MLOG record types within each data block.
--json--NoOffOutput in JSON format.

Examples

Analyze a legacy redo log

inno log -f /var/lib/mysql/ib_logfile0

Analyze a MySQL 8.0.30+ redo log

inno log -f '/var/lib/mysql/#innodb_redo/#ib_redo10'

Show only the first 10 data blocks

inno log -f ib_logfile0 -b 10

Skip empty blocks

inno log -f ib_logfile0 --no-empty

Verbose output with MLOG record types

inno log -f ib_logfile0 -v

JSON output

inno log -f ib_logfile0 --json | jq '.header'

Output

Text Mode

InnoDB Redo Log File
  File:       ib_logfile0
  Size:       50331648 bytes
  Blocks:     98304 total (98300 data)

Log File Header (block 0)
  Group ID:   0
  Start LSN:  19217920
  File No:    0
  Created by: MySQL 8.0.40
  Vendor:     MySQL

Checkpoint 1 (block 1)
  Number:       42
  LSN:          19218432
  Offset:       1024
  Buffer size:  8388608

Checkpoint 2 (block 3)
  Number:       41
  LSN:          19218000
  Offset:       512
  Buffer size:  8388608

Data Blocks
  Block      4  no=4          len=492   first_rec=12    chk_no=42         csum=OK
  Block      5  no=5          len=512   first_rec=0     chk_no=42         csum=OK FLUSH
  Block      6  no=6          len=200   first_rec=12    chk_no=42         csum=OK

Displayed 3 data blocks (of 98300)

With --verbose, record type summaries appear under each data block:

  Block      4  no=4          len=492   first_rec=12    chk_no=42         csum=OK
    record types: MLOG_COMP_REC_INSERT(12), MLOG_WRITE_STRING(8), MLOG_COMP_PAGE_CREATE(2)

JSON Mode

{
  "file": "ib_logfile0",
  "file_size": 50331648,
  "total_blocks": 98304,
  "data_blocks": 98300,
  "header": {
    "group_id": 0,
    "start_lsn": 19217920,
    "file_no": 0,
    "created_by": "MySQL 8.0.40"
  },
  "checkpoint_1": {
    "number": 42,
    "lsn": 19218432,
    "offset": 1024,
    "buf_size": 8388608,
    "archived_lsn": 0
  },
  "checkpoint_2": { "..." : "..." },
  "blocks": [
    {
      "block_index": 4,
      "block_no": 4,
      "flush_flag": false,
      "data_len": 492,
      "first_rec_group": 12,
      "checkpoint_no": 42,
      "checksum_valid": true,
      "record_types": ["MLOG_COMP_REC_INSERT", "MLOG_WRITE_STRING"]
    }
  ]
}