Chapter 01 · MariaDB Foundations, Release Model, Editions, and Lab Setup
What MariaDB Is: Origins, Server Architecture, Ecosystem, and Common Deployment Roles
Build a precise MariaDB mental model: origins and independent evolution, mariadbd/client boundaries, sessions and threads, databases, storage engines, plugins, and the external replication/cluster/proxy ecosystem.
Learning outcomes
The fictional ServiceHub field-service platform has outgrown a prototype database. One engineer says, “MariaDB is basically MySQL, so our old MySQL runbook is enough.” Another assumes every table is transactional because the server is MariaDB, while a third treats MaxScale and Galera as if they were automatically part of a single server process. All three statements blur boundaries that become critical during backup, security, replication, and incident response.
This lesson builds a precise MariaDB mental model before you learn tuning or high availability. MariaDB Server is a client/server relational database management system with a pluggable storage-engine and plugin architecture. It shares ancestry and protocol compatibility with MySQL, but it has evolved independently for many years. You therefore need evidence from the server you are actually operating, not assumptions inherited from a different product or version.
Explain MariaDB Server’s origin and why shared MySQL ancestry does not imply permanent feature parity.
Distinguish the mariadbd server daemon, client
programs, sessions/threads, databases, storage engines,
plugins, connectors, and external ecosystem components.
Use MariaDB SQL and client evidence to identify the connected server, active storage engines, loaded plugins, and current session.
Separate a single MariaDB Server instance from replication, Galera Cluster, proxies, orchestrators, and managed-service control planes.
Diagnose a common architecture mistake and verify a corrected, explicit storage-engine choice.
Courses 01 and 02 introduced relational modeling and SQL. SQLite showed an embedded engine; MySQL and PostgreSQL introduced separately operated database servers. Reuse those concepts, but do not transfer engine-specific assumptions. MariaDB’s independent evolution, storage-engine choices, GTID model, Galera integration, SQL modes, and tooling require their own verification.
1. MariaDB began as a fork—and then became its own moving target
MariaDB Server began in 2009 as a fork of MySQL created by MySQL founder Michael “Monty” Widenius and other original MySQL developers after Oracle announced its acquisition of Sun Microsystems, which owned MySQL. The first MariaDB Server release was 5.1.38 in October 2009. That history explains why many applications, connectors, administrative concepts, and SQL constructs initially looked familiar to MySQL users.
A fork is not a permanent mirror. Once two projects make independent design, release, security, optimizer, replication, authentication, storage-engine, and compatibility decisions, the distance between them grows. MariaDB still speaks a MySQL-compatible client/server protocol in many common cases and preserves a large shared SQL surface, but “it connected” is only evidence that one compatibility boundary succeeded. It is not evidence that every SQL feature, default, plugin, GTID rule, binary-log event, JSON behavior, collation, or operational tool is interchangeable.
Treat MySQL compatibility as a hypothesis to test for a specific source version, target version, workload, connector, SQL surface, and operational feature. Chapter 02 is devoted to that compatibility assessment; this lesson only establishes the boundary.
2. One server instance: daemon, connections, threads, and databases
The server executable is mariadbd. It owns the
configured data directory, listens on configured connection
endpoints, authenticates clients, parses and optimizes SQL,
coordinates storage engines and plugins, and exposes server
state. Client programs such as mariadb and
mariadb-admin are separate executables. Application
connectors—Connector/C, Connector/J, Connector/Node.js, Python
drivers, and others—are client libraries, not embedded copies of
the server.
When an application connects, MariaDB creates server-side
session state and executes the work through server threads. Do
not import PostgreSQL’s process-per-connection model: MariaDB is
commonly described and observed in terms of threads and
connections. SHOW PROCESSLIST exposes
connection/thread identifiers, users, hosts, selected databases,
commands, elapsed time, and current statements. The exact
threading implementation and thread-pool availability can vary
by version, package, platform, and product, so later performance
chapters verify rather than assume it.
SELECT VERSION() AS server_version, @@version_comment AS build_comment, @@hostname AS server_host, @@port AS tcp_port, @@socket AS socket_path, CONNECTION_ID() AS connection_id, USER() AS authenticated_from, CURRENT_USER() AS privilege_account, DATABASE() AS current_database;SHOW PROCESSLIST;
A representative local result will show a MariaDB version
string, a build/distribution comment, a port commonly equal to
3306, and a connection identifier. The socket path
is meaningful on Unix-like systems and can be empty or
represented differently on Windows.
USER() describes the user/host presented by the
client; CURRENT_USER() identifies the account
MariaDB matched for privilege evaluation. These are useful
operational clues, not durable business identifiers.
The query proves what the connected server reports for this session. It does not prove which operating-system package repository installed the binary, whether a managed provider has patched it, whether a proxy sits in front of it, or whether another node in a topology is configured identically.
3. Storage engines are part of MariaDB’s architecture—not a footnote
MariaDB exposes a pluggable storage-engine layer. SQL parsing, privileges, metadata, and many server services sit above that layer, while the chosen engine implements important table-level behavior such as physical storage, transaction support, locking, crash recovery, and indexing details. InnoDB is the general-purpose default engine in modern MariaDB and is the course baseline for transactional tables. Other engines—including Aria, MyISAM, MEMORY, CONNECT, and specialized engines—exist for different use cases and carry different guarantees.
That means “the server supports transactions” is too vague. A transaction that touches an InnoDB table and a non-transactional table does not magically give the non-transactional table InnoDB semantics. Later chapters examine this in depth. For now, learn to ask two separate questions: which engines are available on this server, and which engine backs this specific table?
SELECT @@default_storage_engine AS default_engine;SHOW ENGINES;SELECT ENGINE, SUPPORT, TRANSACTIONS, XA, SAVEPOINTSFROM information_schema.ENGINESORDER BY ENGINE;
On a typical Community Server installation, InnoDB should report
transaction support and appear as the default. Other rows can
vary with packaging, plugins, and version.
SHOW ENGINES is an availability inventory; it does
not tell you which existing tables actually use each engine.
CREATE DATABASE IF NOT EXISTS servicehub_probe;CREATE TABLE servicehub_probe.engine_probe ( id BIGINT PRIMARY KEY, note VARCHAR(100) NOT NULL) ENGINE=InnoDB;SELECT TABLE_SCHEMA, TABLE_NAME, ENGINEFROM information_schema.TABLESWHERE TABLE_SCHEMA='servicehub_probe' AND TABLE_NAME='engine_probe';
4. Plugins extend the server, but availability is not approval
A MariaDB plugin is a software component that extends server functionality without requiring you to rebuild the whole server. Storage engines are one plugin category; authentication, auditing, encryption/key management, information-schema additions, and other features can also be implemented as plugins. Some plugins are built in, some are packaged but not loaded, and some require a separate library or package.
SHOW PLUGINS;SELECT PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_STATUS, PLUGIN_TYPE, PLUGIN_LIBRARY, PLUGIN_MATURITYFROM information_schema.PLUGINSORDER BY PLUGIN_TYPE, PLUGIN_NAME;
A loaded plugin is evidence that a capability is active in this server process. It is not evidence that the plugin is configured safely, licensed for your intended use, supported in your topology, compatible with backup/upgrade procedures, or approved by your organization. The course therefore treats plugin installation as a change-management action, not as a casual “feature toggle.”
5. External ecosystem components are not the server itself
Replication and clustering introduce multiple MariaDB Server instances plus additional state and protocols. Asynchronous replication uses primary/replica roles, binary logs, relay logs, and MariaDB GTIDs. Galera Cluster adds write-set replication, certification, quorum, node state, State Snapshot Transfer (SST), and Incremental State Transfer (IST). Those are topologies built from server nodes; they are not hidden inside every standalone installation.
Likewise, MariaDB MaxScale is a separate proxy/product that can
provide routing and other data-plane capabilities.
Orchestrators, monitoring systems, backup repositories,
Kubernetes operators, load balancers, DNS, and managed-service
control planes are external components. They can be essential to
a production platform, but an operator must know which layer
generated a symptom. A client timeout caused by a proxy policy
is not the same failure as a query blocked inside
mariadbd.
| Layer | Typical responsibility | Evidence to inspect |
|---|---|---|
| MariaDB Server | SQL execution, privileges, engines, transactions, local logs and variables |
VERSION(), SHOW VARIABLES,
SHOW STATUS, metadata schemas, error log
|
| Storage engine/plugin | Table storage or plugin-specific behavior |
SHOW ENGINES, SHOW PLUGINS,
engine/plugin variables and status
|
| Replication/Galera topology | Data movement, apply/certification, node state |
replication status, GTID state,
wsrep_* status, topology diagrams
|
| Proxy/orchestrator | Routing, failover decisions, connection policy | its own config, logs, health checks, API/status |
| Managed service | Provisioning, patch windows, backups, network/security policy | provider control plane plus server evidence |
6. Deliberately wrong: “SHOW ENGINES says InnoDB exists, so every table is transactional”
A learner runs SHOW ENGINES, sees InnoDB, and
concludes that any table created on the server receives InnoDB’s
transactional semantics. That conclusion confuses server
capability with object configuration. A legacy schema, imported
dump, or explicit ENGINE=MyISAM clause can still
produce a non-transactional table when that engine is available.
CREATE TABLE servicehub_probe.transactional_probe ( id INT PRIMARY KEY, note VARCHAR(50)) ENGINE=InnoDB;CREATE TABLE servicehub_probe.nontransactional_probe ( id INT PRIMARY KEY, note VARCHAR(50)) ENGINE=MyISAM;START TRANSACTION;INSERT INTO servicehub_probe.transactional_probe VALUES (1,'rollback me');INSERT INTO servicehub_probe.nontransactional_probe VALUES (1,'cannot be rolled back');ROLLBACK;SELECT * FROM servicehub_probe.transactional_probe;SELECT * FROM servicehub_probe.nontransactional_probe;
Where MyISAM is available, the InnoDB insert is rolled back
while the MyISAM insert remains. The exact warning/error
behavior can differ with SQL mode and engine availability, which
is precisely why the lab first checks SHOW ENGINES.
The repair is not “never use another engine” as a slogan; it is
to choose an engine deliberately, verify the table metadata, and
understand the correctness contract before mixing engines in one
transactional workflow.
Run this only in the disposable
servicehub_probe database. If MyISAM is disabled
or unavailable, treat that as evidence about your package and
skip the creation rather than installing an engine merely to
complete the example.
7. Hands-on lab: build an architecture evidence card
Use a local Community Server instance. Do not install Enterprise components, a proxy, or a multi-node cluster for this lesson. The goal is to prove what a single server exposes.
SELECT NOW(6) AS observed_at, VERSION() AS version, @@version_comment AS version_comment, @@hostname AS hostname, @@port AS port, @@socket AS socket, @@datadir AS data_directory, @@default_storage_engine AS default_engine, @@sql_mode AS sql_mode;SELECT ENGINE, SUPPORT, TRANSACTIONSFROM information_schema.ENGINESORDER BY ENGINE;SELECT PLUGIN_TYPE, COUNT(*) AS active_pluginsFROM information_schema.PLUGINSWHERE PLUGIN_STATUS='ACTIVE'GROUP BY PLUGIN_TYPEORDER BY PLUGIN_TYPE;SELECT CONNECTION_ID() AS my_connection_id, USER() AS login_identity, CURRENT_USER() AS privilege_identity;SHOW PROCESSLIST;
Save the output as lab evidence, then answer: What exact server version accepted the connection? Which engine is the default? Does your build report a socket path or only TCP? Which plugin categories are active? Can you find your current connection in the process list? If any answer differs from a screenshot or tutorial, prefer your server’s evidence and record the difference.
Verification checklist
- The server version is obtained from SQL, not only a client executable.
-
SHOW ENGINESandinformation_schema.ENGINESagree on the default engine. -
You can distinguish
USER()fromCURRENT_USER(). - You can explain why a plugin list is not an approval list.
- You can state whether the lab is standalone, replicated, Galera, proxied, or managed.
DROP DATABASE IF EXISTS servicehub_probe;
8. Production judgment: architecture is a boundary map
Use this mental model whenever you triage incidents or design changes. First identify the layer: client/connector, proxy, server, storage engine/plugin, replication/Galera, or managed control plane. Then collect evidence from that layer and correlate it with server state. Avoid diagnosing a database from a single application error or assuming a server feature exists because another MariaDB installation had it.
For production, record the exact Community/Enterprise product, server series and patch, package source, operating system, storage engines in use, loaded plugins, connector versions, backup tooling, topology, and proxy/orchestrator versions. Those facts become prerequisites for safe upgrades and recovery. The next lesson adds product and licensing boundaries so you can tell which parts of an architecture are freely reproducible, subscription-delivered, separately licensed, or externally operated.
Check your understanding
- Why does MariaDB’s MySQL ancestry not prove that a MySQL runbook is safe for a current MariaDB server?
-
What is the difference between
mariadbdand themariadbclient? -
Why does
SHOW ENGINESnot prove that an existing table is transactional? -
What does
SHOW PLUGINSprove—and what does it not prove? - Name two components that may be part of a MariaDB platform but are not the standalone server daemon.
Review the answers
Shared ancestry explains compatibility, but independent
evolution requires version-specific testing.
mariadbd is the database server daemon;
mariadb is a client program.
SHOW ENGINES lists server engine capability,
while table metadata identifies the engine actually used
by a table. SHOW PLUGINS proves which plugins
are visible/active, not that they are approved, configured
safely, or supported for every topology. Proxies such as
MaxScale, orchestrators, managed-service control planes,
external monitoring, and load balancers are examples of
platform components outside the standalone daemon.