For the complete documentation index, see llms.txt. This page is also available as Markdown.

Storage I/O: Buffering and Persistence

Defines the OS-agnostic terms MariaDB documentation uses for disk I/O — unbuffered I/O, write-through, persist — and shows how each one maps to Unix-like and Windows mechanisms.

This page defines the I/O behavior terms that other MariaDB documentation pages use — unbuffered I/O, write-through, persist to non-volatile storage — and shows how each one maps to the underlying mechanism on Unix-like systems and Windows. Other pages refer here for the OS-level details rather than embedding system-specific flag names inline.

Why This Matters

The MariaDB server, and especially the InnoDB storage engine, needs precise control over when writes actually reach non-volatile storage. The operating system normally buffers writes in memory (the page cache) and flushes them to disk on its own schedule. That is fast, but unsafe for a transactional database: a power loss between the application write and the OS flush would lose committed data.

MariaDB therefore exposes configuration that lets administrators choose between OS-buffered performance and database-controlled durability. The configuration uses general I/O terms — buffering, write-through, persistence — that describe the behavior independent of the operating system. This page is the reference for what those terms mean and how each OS implements them.

Unbuffered I/O

Behavior: Reads and writes bypass the operating system's page cache. Each read fetches directly from the storage device; each write is handed to the device without keeping a copy in OS memory.

Trade-off: Avoids "double buffering" — that is, caching the same data both in MariaDB's own buffer pool and in the OS page cache, which costs memory and CPU. The trade-off is the loss of the OS's read-ahead and write-coalescing optimizations. Unbuffered I/O is most appropriate when MariaDB itself manages most of the memory available for caching data (for example, when the InnoDB buffer pool is sized to most of system RAM).

Operating system
Underlying mechanism

Unix-like

File opened with O_DIRECT. Supported on Linux, FreeBSD, NetBSD, Dragonfly BSD, Illumos / Solaris, and IBM AIX; not supported on OpenBSD or Apple macOS.

Windows

File opened with FILE_FLAG_NO_BUFFERING

Write-Through

Behavior: Every individual write call returns only after the storage layer has accepted the data for non-volatile storage. Equivalent to issuing a write followed by an immediate persist, on every single write.

Trade-off: Maximum durability per write, at the cost of write latency. The application does not need to issue a separate persist call to know that data is safe.

Operating system
Underlying mechanism

Unix-like

File opened with O_DSYNC. Supported on Linux, FreeBSD, NetBSD, Solaris, and IBM AIX; not supported on Dragonfly BSD (which has O_FSYNC, not used by MariaDB), OpenBSD, or Apple macOS.

Windows

File opened with FILE_FLAG_WRITE_THROUGH

Persist to Non-Volatile Storage

Behavior: After one or more buffered writes, force any data still in the OS page cache or the storage device's own write cache out to non-volatile media. The call returns only once the data is durable.

Trade-off: Lets the application batch many writes cheaply and persist them with a single explicit call, instead of paying the durability cost on every write (as write-through does). This is the foundation of MariaDB's group-commit and binary-log durability behavior.

MariaDB does not validate file access or modification timestamps anywhere, so on each platform it prefers the lighter-weight call that omits those metadata updates, falling back to the full-persist call only when the lighter one is not available.

Operating system
Underlying mechanism

Unix-like

fdatasync() when available (Linux, FreeBSD, Dragonfly BSD, NetBSD, OpenBSD, Solaris, IBM AIX); fsync() otherwise (notably Apple macOS).

Windows

NtFlushBuffersFileEx() with the FLUSH_FLAGS_FILE_DATA_SYNC_ONLY flag when available — documented for NTFS, and observed to work on ReFS as well. FlushFileBuffers() otherwise (older Windows versions, non-NTFS filesystems, or if the lighter call fails at run time).

See Also

Last updated

Was this helpful?