innodb-utils 5.1.0

InnoDB file analysis toolkit
Documentation
# Undo Log Analysis

This guide explains how to use `inno undo` to inspect undo tablespace internals, diagnose long-running transactions, and understand rollback segment utilization.

## When to Use

- **Long-running transaction investigation** — identify active transactions holding undo history
- **Undo tablespace bloat** — check segment states and purge backlog
- **XA transaction recovery** — find PREPARED transactions that may need manual resolution
- **Forensic analysis** — review transaction IDs and types from undo log headers

## Undo Tablespace Structure

MySQL 8.0+ dedicated undo tablespaces (`.ibu` files) have this internal layout:

```text
Page 0: FSP_HDR (file space header)
Page 1: IBUF_BITMAP (unused in undo tablespaces)
Page 2: INODE
Page 3: RSEG_ARRAY — rollback segment slot directory
Page 4+: RSEG header pages and undo segment pages
```

The RSEG array page contains up to 128 slots, each pointing to a rollback segment header page. Each rollback segment header manages up to 1024 undo log slots.

## Basic Analysis

```bash
inno undo -f /var/lib/mysql/undo_001.ibu
```

This shows the RSEG slot layout, per-segment states, and transaction summary.

## Identifying Active Transactions

```bash
inno undo -f undo_001.ibu --json | jq '.segments[] | select(.segment_header.state == "Active")'
```

Active segments are currently in use by running transactions. If you see many active segments while no queries are running, you may have abandoned XA transactions or a hung purge thread.

## Checking Purge Backlog

```bash
inno undo -f undo_001.ibu --json | jq '{
  total: .total_transactions,
  active: .active_transactions,
  to_purge: [.segments[] | select(.segment_header.state == "ToPurge")] | length
}'
```

A large number of `ToPurge` segments indicates the purge thread is falling behind, which causes undo tablespace growth.

## Verbose Record Inspection

```bash
inno undo -f undo_001.ibu -v
```

Verbose mode walks individual undo records within each segment, reporting record types (INSERT, UPDATE_EXIST, UPDATE_DEL, DEL_MARK) and table IDs. This is useful for understanding which tables are generating the most undo history.

## Single Page Inspection

```bash
inno undo -f undo_001.ibu -p 5
```

Inspect a specific undo page to see its page header, segment header, and all undo log headers on that page.

## Encrypted Undo Tablespaces

MySQL 8.0.16+ supports encryption of undo tablespaces:

```bash
inno undo -f undo_001.ibu --keyring /var/lib/mysql-keyring/keyring
```

The keyring file must contain the master encryption key matching the tablespace.

## Undo Segment Lifecycle

Understanding segment states helps diagnose undo tablespace issues:

```text
┌─────────┐    ┌─────────┐    ┌──────────┐    ┌─────────┐
│  Free   │───▶│ Active  │───▶│ ToPurge  │───▶│ Cached  │
└─────────┘    └─────────┘    └──────────┘    └─────────┘
                    │                              │
                    ▼                              │
               ┌──────────┐                        │
               │ Prepared │                        │
               └──────────┘                        │
                    │              ┌──────────┐    │
                    └─────────────▶│  ToFree  │◀───┘
                                   └──────────┘
```

- **Free** — slot is empty, available for allocation
- **Active** — transaction is actively writing undo records
- **ToPurge** — transaction committed, waiting for purge
- **Cached** — purged and available for reuse without reallocation
- **Prepared** — XA transaction in PREPARED state
- **ToFree** — segment being deallocated during truncation