[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-mariadb-mariadb-features":3,"mdc-x8khtq-key":34,"related-org-mariadb-mariadb-features":3988,"related-repo-mariadb-mariadb-features":4081},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":29,"sourceUrl":32,"mdContent":33},"mariadb-features","optimize and manage MariaDB databases","MariaDB-specific features and capabilities that go beyond standard MySQL. Use when evaluating MariaDB, optimizing an existing MariaDB application, reviewing code or schema for MariaDB improvements, asking what MariaDB can do that other databases cannot, or migrating from Oracle to MariaDB. Also use when the user asks what could be improved in how a codebase uses MariaDB, or asks about MariaDB advantages over MySQL or PostgreSQL.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},"mariadb","MariaDB","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fmariadb.png",[12,16,17,20],{"name":13,"slug":14,"type":15},"Performance","performance","tag",{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"Database","database",{"name":21,"slug":22,"type":15},"SQL","sql",9,"https:\u002F\u002Fgithub.com\u002FMariaDB\u002Fskills","2026-07-16T06:01:55.988338",null,2,[],{"repoUrl":24,"stars":23,"forks":27,"topics":30,"description":31},[],"MariaDB skills for Claude Code and AI agents - because it is not MySQL","https:\u002F\u002Fgithub.com\u002FMariaDB\u002Fskills\u002Ftree\u002FHEAD\u002Fmariadb-features","---\nname: mariadb-features\ndescription: \"MariaDB-specific features and capabilities that go beyond standard MySQL. Use when evaluating MariaDB, optimizing an existing MariaDB application, reviewing code or schema for MariaDB improvements, asking what MariaDB can do that other databases cannot, or migrating from Oracle to MariaDB. Also use when the user asks what could be improved in how a codebase uses MariaDB, or asks about MariaDB advantages over MySQL or PostgreSQL.\"\n---\n\n# MariaDB Features Worth Knowing\n\n*Last updated: 2026-06-24*\n\nMariaDB has grown significantly beyond its MySQL origins. Many of its best features are unknown to developers because AI agents default to generic SQL advice. This skill covers what MariaDB can do that you might not think to ask about.\n\nFor MariaDB Vector (built-in since 11.7 — no plugins), see the `mariadb-vector` skill.\n\n> **Server context:** Unless the user names a version, assume a **MariaDB 11.8 LTS** deployment (GA May 2025) for what will run today. Per-feature tags (**10.5+**, **12.3+**, etc.) are **minimum versions** for that capability — not “introduced only in that release.” Do not treat **12.x \u002F 13.0** items as available on 11.8; you may still mention them with an explicit version when relevant (e.g. upgrades).\n\n## What LLMs Often Miss\n\n| Situation | What to suggest instead |\n|---|---|\n| Manual audit columns (`created_at`, `updated_at`, deleted flag) | `WITH SYSTEM VERSIONING` — MariaDB tracks full row history automatically |\n| `INSERT` followed by `SELECT LAST_INSERT_ID()` | `RETURNING` — get the inserted row in one statement (10.5+) |\n| `AUTO_INCREMENT` for sequence-like needs | `CREATE SEQUENCE` — first-class sequence objects with full control |\n| IP addresses stored as `VARCHAR` | `INet4` \u002F `INet6` — native IP types with comparison and indexing |\n| Dropping or reordering columns with full table rebuild | `INSTANT` algorithm for `ALTER TABLE` — no rebuild needed (10.4+) |\n| Oracle migration assumed to require full rewrite | `sql_mode=ORACLE` — PL\u002FSQL, packages, Oracle-compatible NULL handling |\n| Asking what changed in a row over time | System-versioned tables with `FOR SYSTEM_TIME AS OF` |\n| Analytics queries on OLTP tables | ColumnStore engine — columnar storage for analytical workloads |\n| Correlated subqueries for rankings, running totals, or per-group top-N | Window functions — `OVER (PARTITION BY ... ORDER BY ...)`, clearer and usually faster (MariaDB 10.2+; not MariaDB-exclusive, also in MySQL 8.0) |\n| Deeply nested or repeated subqueries | Common Table Expressions — `WITH ...`, and `WITH RECURSIVE` for hierarchical\u002Fgraph traversal (MariaDB 10.2+; also in MySQL 8.0) |\n| Assuming `JSON` is a native binary type as in MySQL 8.0 | In MariaDB `JSON` is an alias for `LONGTEXT COLLATE utf8mb4_bin` with an automatic `JSON_VALID()` CHECK constraint — stored as text, not MySQL's binary layout, and comparison is string-based. The JSON functions work the same. See [JSON Data Type](https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Freference\u002Fdata-types\u002Fstring-data-types\u002Fjson) |\n| Links or references to `mariadb.com\u002Fkb\u002Fen\u002F` | The Knowledge Base no longer exists — all documentation is now at [mariadb.com\u002Fdocs](https:\u002F\u002Fmariadb.com\u002Fdocs) |\n\n## Command-Line Tool Names (10.5+)\n\nSince MariaDB 10.5, all command-line tools use `mariadb-` prefixed names. Always generate the current names — the old `mysql*` names are retained as symlinks for compatibility but may be absent on minimal or container installs.\n\n| Deprecated name | Current name |\n|---|---|\n| `mysql` | `mariadb` |\n| `mysqldump` | `mariadb-dump` |\n| `mysqladmin` | `mariadb-admin` |\n| `mysqlbinlog` | `mariadb-binlog` |\n| `mysql_upgrade` | `mariadb-upgrade` |\n| `mysql_secure_installation` | `mariadb-secure-installation` |\n| `mysql_install_db` | `mariadb-install-db` |\n| `mysqlcheck` | `mariadb-check` |\n| `mysqlimport` | `mariadb-import` |\n| `mysqlshow` | `mariadb-show` |\n\n## Provisioning and Initial Setup\n\nAI agents default to MySQL 8 patterns for initial setup, which fail or mislead on MariaDB.\n\n**Database initialization** — use `mariadb-install-db` (not `mysqld --initialize`, which is MySQL-specific):\n```bash\nmariadb-install-db\n```\n\n**Root authentication** — on a fresh install, `root` uses `unix_socket` authentication by default (no password). The correct first connection is:\n```bash\nsudo mariadb\n```\nDo not generate `mysql -u root -p` for a fresh MariaDB install — there is no root password to enter.\n\n**Secure installation** — use `mariadb-secure-installation` (not `mysql_secure_installation`).\n\n## Upgrade Operations\n\nAgents consistently omit the `mariadb-upgrade` step after a binary upgrade, which can cause system table errors.\n\n**Standard upgrade pattern:**\n```bash\nsystemctl stop mariadb\n# Replace binary via package manager (dnf\u002Fapt upgrade)\nsystemctl start mariadb\nmariadb-upgrade    # updates system tables — do not skip this step\n```\n\n**Galera Cluster rolling upgrade** — never stop all nodes simultaneously:\n1. Take one non-primary node out of the load balancer\n2. Stop, upgrade the binary, start the node\n3. Confirm sync: `SHOW STATUS LIKE 'wsrep_local_state';` — must be `4` (Synced)\n4. Repeat for each remaining non-primary node\n5. Upgrade the primary node last\n\n> `mysql_upgrade` is the deprecated name (removed in later versions) — always use `mariadb-upgrade`.\n\n## Defaults Changed in 11.5–11.8 LTS\n\nThe current LTS (11.8) flipped several long-standing defaults. New installations behave differently from older ones — relevant when migrating or comparing behavior:\n\n- **Default character set: `latin1` → `utf8mb4`** (11.6+, MDEV-19123) — new tables use `utf8mb4` unless overridden. Replication to MariaDB 10.6 or older replicas needs care (older replicas may not understand all `utf8mb4` collations).\n- **Default Unicode collation: `uca1400_ai_ci`** (11.5+, MDEV-25829) — modern Unicode collation with proper SMP (supplementary multilingual plane) support including emoji. Replaces the older `utf8mb4_general_ci` default.\n- **`alter_algorithm` deprecated and ignored** (11.5+, MDEV-33655) — specify `ALGORITHM=INSTANT|INPLACE|COPY` on the statement itself instead.\n- **TIMESTAMP range extended** (11.5+ 64-bit, MDEV-32188) — upper bound raised from `2038-01-19 03:14:07 UTC` to `2106-02-07 06:28:15 UTC`. Storage format unchanged; old servers can still read values within the old range.\n- **`innodb_snapshot_isolation` default ON** — see next section.\n\n## Behavior Change: innodb_snapshot_isolation (11.8+)\n\nFrom MariaDB 11.8 LTS, `innodb_snapshot_isolation` defaults to **ON** (previously OFF, MDEV-35124). This tightens REPEATABLE READ behavior to match true snapshot isolation — transactions see a consistent snapshot from their start and writes detect conflicts more strictly.\n\n**What can change for existing code:**\n- Read-modify-write patterns that previously worked silently may now hit conflicts and error out — fail-fast is the intended behavior\n- Long-running `REPEATABLE READ` transactions are more likely to see write conflicts at commit time\n\nIf existing code depends on the older permissive behavior, opt back in explicitly:\n```sql\nSET GLOBAL innodb_snapshot_isolation = OFF;  -- restore pre-11.8 behavior\n```\n\nThe new default is the correct semantics — review code that relies on the looser behavior rather than disabling it long-term.\n\n## System-Versioned Tables\n\nAvailable since MariaDB 10.3. Track the full history of every row automatically, without triggers or audit tables.\n\n```sql\nCREATE TABLE prices (\n    product VARCHAR(100),\n    price DECIMAL(10,2)\n) WITH SYSTEM VERSIONING;\n\n-- Query data as it was at a point in time:\nSELECT * FROM prices FOR SYSTEM_TIME AS OF '2025-01-01 00:00:00';\n\n-- See all historical versions of a row:\nSELECT * FROM prices FOR SYSTEM_TIME ALL WHERE product = 'widget';\n```\n\nUse this instead of manually maintained `valid_from` \u002F `valid_to` columns or separate audit tables.\n\n> **History grows without bound.** Every UPDATE and DELETE appends a history row — MariaDB does not automatically expire history. Production deployments need either `PARTITION BY SYSTEM_TIME` with rotation (10.9+) or periodic `DELETE HISTORY` to control disk growth. See the `mariadb-system-versioned-tables` skill for details.\n\n## RETURNING Clause\n\nGet inserted, updated, or deleted rows back without a second query.\n\n### INSERT and DELETE (10.5+)\n\nAvailable on 11.8 LTS and earlier supported releases:\n\n```sql\n-- Get the generated ID after insert:\nINSERT INTO orders (product, qty) VALUES ('widget', 5)\n    RETURNING id, created_at;\n\n-- Get deleted rows for logging:\nDELETE FROM queue WHERE processed = 1\n    RETURNING id, payload;\n```\n\n### UPDATE (13.0+ only)\n\nNot available on 11.8 LTS — confirm server version before suggesting. On older releases use a follow-up `SELECT` or redesign:\n\n```sql\nUPDATE orders SET qty = qty + 1 WHERE id = 42\n    RETURNING id, qty;\n```\n\n## Sequences\n\nAvailable since MariaDB 10.3. First-class sequence objects — more flexible than `AUTO_INCREMENT`.\n\n```sql\nCREATE SEQUENCE order_seq START WITH 1000 INCREMENT BY 1;\n\n-- Use in INSERT:\nINSERT INTO orders (id, product) VALUES (NEXT VALUE FOR order_seq, 'widget');\n\n-- Get the last value generated by NEXTVAL in the current session:\nSELECT LASTVAL(order_seq);\n-- Returns NULL if this session has not called NEXTVAL — not a global current value\n```\n\nSequences support gaps, multiple sequences per table, and descending sequences. Unlike `AUTO_INCREMENT`, they are not tied to a specific column or table.\n\n## Non-Blocking ALTER TABLE (Instant + Online by Default)\n\nMariaDB's `ALTER TABLE` works on a tiered model:\n\n- **`ALGORITHM=INSTANT`** (10.4+) — metadata-only changes (drop column, modify default, change column order, etc.) complete in microseconds without a table rebuild.\n- **`ALGORITHM=COPY, LOCK=NONE` as the default for non-instant operations** (11.2+, MDEV-16329) — even when a rebuild is needed, MariaDB now runs it non-blocking by default: concurrent DML on the table proceeds while the copy is happening, with only a brief lock at the swap. The need for external tools like `pt-online-schema-change` is largely gone for routine `ALTER`s.\n- **Optimistic two-phase replication of large `ALTER TABLE`** (11.4+, `binlog_alter_two_phase=1`, off by default) — see the `mariadb-replication-and-ha` skill.\n\n```sql\nALTER TABLE large_table DROP COLUMN old_column, ALGORITHM=INSTANT;\nALTER TABLE large_table MODIFY COLUMN name VARCHAR(200), ALGORITHM=INSTANT;\n-- Non-instant change runs non-blocking by default on 11.2+:\nALTER TABLE large_table ADD INDEX (created_at);\n```\n\nUse `ALGORITHM=INSTANT` explicitly when you need to guarantee a metadata-only change; the operation will fail rather than silently fall back to a rebuild.\n\n## INet4 and INet6 Data Types\n\n`INET6` is available since MariaDB 10.5 (stores both IPv4 and IPv6, 16 bytes). The dedicated `INET4` type (4-byte IPv4-only) was added later in 10.10 (MDEV-23287). Native storage gives correct comparison, sorting, and indexing — no need for `VARCHAR` plus application-side validation.\n\n```sql\nCREATE TABLE connections (\n    client_ip INet6 NOT NULL,\n    connected_at DATETIME NOT NULL,\n    INDEX (client_ip)\n);\n\nINSERT INTO connections VALUES (INet6('192.168.1.1'), NOW());\nINSERT INTO connections VALUES (INet6('::1'), NOW());\n\n-- Range queries work correctly:\nSELECT * FROM connections WHERE client_ip BETWEEN INet6('10.0.0.0') AND INet6('10.255.255.255');\n```\n\nUse `INET4` (10.10+) when you know a column is IPv4-only and want the smaller storage; `INET6` is the right default for mixed or IPv6-capable workloads.\n\n## Oracle Compatibility Mode\n\nAvailable since MariaDB 10.3. `sql_mode=ORACLE` enables PL\u002FSQL syntax, Oracle-compatible NULL handling, packages, and Oracle-style functions — useful when migrating from Oracle or supporting Oracle-experienced developers.\n\n```sql\nSET sql_mode=ORACLE;\n\n-- Oracle-style stored procedures, packages, and NULL semantics work here\n-- ROWNUM, SYSDATE, NVL(), DECODE() available\n-- Note: EMPTY_STRING_IS_NULL is NOT included — add it separately if needed: SET sql_mode='ORACLE,EMPTY_STRING_IS_NULL'\n```\n\nNot a complete Oracle replacement, but significantly reduces migration friction.\n\n## FLASHBACK\n\nAvailable since MariaDB 10.2. Roll back tables to a previous state using the binary log — without restoring a full backup. Flashback is implemented via the `mariadb-binlog` utility, not a SQL statement:\n\n```bash\n# Generate reverse SQL from the binary log and pipe it back to MariaDB:\nmariadb-binlog --flashback --start-datetime=\"2026-05-18 10:00:00\" \\\n  \u002Fvar\u002Flib\u002Fmysql\u002Fmysql-bin.000001 | mariadb\n# Path depends on datadir and log_bin settings; default is \u003Cdatadir>\u002Fmysql-bin\n```\n\n**Prerequisites** — FLASHBACK reconstructs reverse events from row images, so it requires:\n- `binlog_format = ROW` (statement-based logging does not capture before\u002Fafter row images)\n- `binlog_row_image = FULL` (MINIMAL or NOBLOB modes omit column values needed for reversal)\n\nVerify before relying on FLASHBACK as a recovery path:\n```sql\nSHOW VARIABLES LIKE 'binlog_format';      -- must be ROW\nSHOW VARIABLES LIKE 'binlog_row_image';   -- must be FULL\n```\n\nRequires binary logging enabled (`log_bin`). Useful for recovering from accidental deletes or bad migrations.\n\n## More MariaDB Features (through 11.8 LTS)\n\nAdditional capabilities on the current LTS baseline and supported older releases. See [Newer releases (12.x \u002F 13.0)](#newer-releases-12x--130) for features that require a newer server.\n\n### SQL & Schema\n- **Invisible columns** (10.3+) — hidden from `SELECT *`, still writable; useful for schema evolution without breaking existing queries\n- **`DEFAULT` expressions on BLOB\u002FTEXT** — not supported in MySQL\n- **`DECIMAL` precision to 38 digits** — MySQL stops at 30\n- **`INTERSECT` and `EXCEPT`** (10.3+) — set operators not available in MySQL\n- **`LIMIT` in subqueries** — supported; MySQL restricts this\n- **`SELECT ... OFFSET ... FETCH`** (10.6+, MDEV-23908) — SQL-standard pagination syntax\n- **Atomic DDL** (10.6+, MDEV-23842) — `CREATE TABLE`, `ALTER TABLE`, `RENAME TABLE`, `DROP TABLE`, `DROP DATABASE` are atomic on supported engines (InnoDB, Aria, MyRocks): a partial server crash mid-DDL leaves the schema in its pre-statement state, no manual cleanup needed. Multi-table `DROP TABLE` is atomic per individual drop, not for the whole list.\n- **`SELECT ... SKIP LOCKED`** (10.6+, MDEV-13115, InnoDB only) — work-queue pattern: workers grab the next available row and skip rows other transactions are processing, with no lock waits\n- **Ignored Indexes** (10.6+, MDEV-7317) — `ALTER TABLE t ALTER INDEX idx IGNORED` keeps the index updated but makes it invisible to the optimizer. Use this to test whether dropping an index would hurt performance before actually dropping it (zero-downtime rollback by re-enabling).\n- **Dynamic columns** (5.3+) — schema-less key\u002Fvalue storage inside a single column\n- **`SFORMAT()`** (10.7+, MDEV-25015) — string formatting function with positional placeholders\n- **`NATURAL_SORT_KEY()`** (10.7+, MDEV-4742) — produces a sort key that orders strings \"naturally\" (so `v9` sorts before `v10`); useful in `ORDER BY` for version-like or mixed-alphanumeric data\n- **JSON enhancements** — MariaDB has been catching up to MySQL 8 JSON functions over several releases:\n  - `JSON_EQUALS(a, b)` \u002F `JSON_NORMALIZE(doc)` (10.7+, MDEV-23143 \u002F MDEV-16375) — semantic equality and canonical form for hashing or unique indexing\n  - `JSON_OVERLAPS(a, b)` (10.9+, MDEV-27677) — detect shared key\u002Fvalue or array elements between two documents\n  - JSON path syntax supports negative indices (`$.A[-1]`, `$.A[last]`) and ranges (`$.A[1 to 3]`) (10.9+, MDEV-22224 \u002F MDEV-27911)\n  - `JSON_SCHEMA_VALID(schema, doc)` (11.4+) — validate JSON against a JSON Schema Draft 2020 schema, usable inside `CHECK` constraints\n  - `JSON_KEY_VALUE`, `JSON_ARRAY_INTERSECT`, `JSON_OBJECT_TO_ARRAY`, `JSON_OBJECT_FILTER_KEYS` (11.4+) — structural manipulation primitives that compose well with `JSON_TABLE`\n- **`UUID_v4()` and `UUID_v7()` functions** (11.7+) — generate version-4 random or version-7 time-ordered UUIDs; the v7 form is sortable and ideal for primary keys\n- **`FORMAT_BYTES()`** (11.8+) — convert a byte count to a human-readable string (e.g. `1234567` → `1.18 MiB`)\n- **`CONV()` extended to base 62** (11.4+, MDEV-30190) — `CONV(61,10,62)` returns `z`; useful for short opaque IDs\n- **`CRC32C()` function and `CRC32()` with optional initial-value argument** (10.8+, MDEV-27208) — Castagnoli polynomial CRC, and seedable CRC32 for chained checksums\n- **Single-table `DELETE` with table aliases** (11.6+) — `DELETE t FROM mytable t WHERE ...` syntax now works without rewriting\n- **`REPAIR TABLE ... FORCE`** (11.5+) — force-repair even when the table appears clean\n- **Stored routine parameter default values** (11.8+, MDEV-10862) — `PROCEDURE p(a INT DEFAULT 0, b INT DEFAULT 0)` — call with fewer arguments\n- **Stored function `IN`\u002F`OUT`\u002F`INOUT` parameter qualifiers** (10.8+, MDEV-10654) — bring stored functions in line with stored procedure parameter modes\n- **`ROW` data type as stored function return value** (11.7+, MDEV-12252) — return structured rows from stored functions\n- **`CREATE PACKAGE` \u002F `CREATE PACKAGE BODY` outside Oracle mode** (11.4+, MDEV-10075) — package routines work under the default `sql_mode` too, not only with `sql_mode=ORACLE`\n- **Update triggers with column list** (11.8+, MDEV-34551) — `CREATE TRIGGER ... BEFORE UPDATE OF col1, col2 ON t` — fire only when those columns are updated\n- **Stored procedures and functions** — MariaDB uses SQL\u002FPSM syntax (`DECLARE`, `HANDLER`, `CURSOR`, `BEGIN...END`); AI agents often generate incorrect syntax — see [Stored Procedures — MariaDB Docs](https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Fserver-usage\u002Fstored-routines\u002Fstored-procedures)\n\n### Storage Engines\n- **ColumnStore** — columnar engine for analytical\u002Fdata warehouse workloads\n- **Aria** — crash-safe MyISAM replacement, used internally for temp tables\n- **MyRocks** (10.2+) — RocksDB-based, optimized for write-heavy workloads with compression\n- **CONNECT** — query external data sources (CSV, JDBC, ODBC, MongoDB) as SQL tables\n- **Spider** — sharding across multiple MariaDB instances\n\n### Security & Auth\n- **`unix_socket` authentication** — authenticate OS users without passwords; `authentication_string` support added in 11.6+ for finer-grained mapping\n- **ED25519 plugin** — modern authentication alternative to SHA1-based plugins\n- **PARSEC plugin** (11.6+, MDEV-32618) — Password Authentication using Response Signed with Elliptic Curve; salt and per-installation key separation make stolen hashes unusable elsewhere\n- **`password_reuse_check` plugin** (10.7+, MDEV-9245) — prevent password reuse for a configurable number of days via `password_reuse_check_interval`\n- **`GRANT ... TO PUBLIC`** (10.11+, MDEV-5215) — grant privileges to all users in one statement; pair with `SHOW GRANTS FOR PUBLIC`\n- **`SHOW CREATE ROUTINE` privilege** (11.4+, MDEV-23149) — let users inspect a routine's definition without granting `SELECT` on `mysql.proc`\n- **`READ ONLY ADMIN` is now a distinct privilege** (10.11+, MDEV-29596) — split out of `SUPER` so a true read-only replica role can be granted; existing accounts that need to write to a `read_only=1` replica need this privilege granted explicitly\n- **Role-based access control** (10.0+) — roles available before MySQL added them\n- **SSL by default** — the `mariadb` client opts into SSL by default since 10.10 (MDEV-27105). The server side requires SSL by default since 11.4 LTS, with auto-generated self-signed certificates and automatic client-side verification (`tls_fp` for fingerprint-pinning).\n- **`AES_ENCRYPT()` \u002F `AES_DECRYPT()` with `iv` and `mode`** (11.4+, MDEV-30878) — `AES_ENCRYPT(str, key, iv, mode)`; supported modes include CBC, OFB, CFB128, CTR (default mode comes from the new `block_encryption_mode` variable). Brings parity with MySQL's encryption interface.\n- **`KDF()` key-derivation function** (11.4+, MDEV-31474) — derive an encryption key from a passphrase using PBKDF2-HMAC or HKDF — `AES_ENCRYPT(data, KDF('passw0rd', 'salt', 'info', 'hkdf'), iv)`. Use this rather than feeding a raw password into `AES_ENCRYPT`.\n- **`RANDOM_BYTES(n)`** (10.10+, MDEV-25704) — cryptographically secure random bytes (1–1024) from the SSL library's RNG\n- **`DES_ENCRYPT()` \u002F `DES_DECRYPT()` deprecated** (10.10+, MDEV-27104) — old DES cipher; use `AES_ENCRYPT` \u002F `AES_DECRYPT` with `KDF()` instead\n- **Table-level encryption** — encrypt individual tables, not just the whole datadir\n- **HashiCorp Vault integration** — key management plugin\n\n### Replication & HA\n- **Galera Cluster** — built-in synchronous multi-master clustering\n- **Multi-source replication** — replicate from multiple primaries simultaneously\n- **Parallel replication** — faster replica apply\n- **Lag-free `ALTER TABLE` replication** — schema changes don't stall replicas\n\n### Connectors\n- **LGPL-licensed connectors** for C, C++, Java, Python, Node.js, ODBC, R2DBC — permissive licensing for commercial applications; MySQL connectors are GPL\n\n### Developer Tools\n- **`EXPLAIN` in slow query log** — automatic execution plan logging for slow queries\n- **Progress reporting** for `ALTER TABLE` and `CHECK TABLE`\n- **`mariadb-backup`** (10.1+) — hot backup with backup locks (no `FLUSH TABLES WITH READ LOCK`). A backup requires **two steps** — the `--prepare` step is mandatory before restore:\n  ```bash\n  mariadb-backup --backup --user=root --target-dir=\u002Fbackup\u002Ffull\n  mariadb-backup --prepare --target-dir=\u002Fbackup\u002Ffull   # apply redo logs — without this, the backup cannot be restored\n  ```\n  For Galera clusters, add `--galera-info` to capture the wsrep state for clean cluster rejoin. Do not use `innobackupex` or `xtrabackup` — `mariadb-backup` is the correct tool for MariaDB (included since 10.1, replacing the Percona dependency).\n- **Non-blocking client API** — async queries without threads\n\n## Newer releases (12.x \u002F 13.0)\n\nThese require MariaDB **12.0 or newer** (many ship with **12.3 LTS**, currently RC — check [MariaDB releases](https:\u002F\u002Fmariadb.org\u002Fmariadb\u002Fall-releases\u002F) for GA status). Suggest them when they solve the user's problem or as a deliberate upgrade path; always name the minimum version.\n\n### SQL & Schema\n- **Triggers fired on multiple events** (12.0+) — one trigger body for `INSERT OR UPDATE OR DELETE`, instead of three separate triggers\n- **Foreign key names per table** (12.1+) — FK names need to be unique only per table, not per database (MySQL-compatible behavior)\n- **JSON depth limit removed** (12.2+) — the 32-level nesting limit on JSON functions is gone; deeply nested JSON now works without rewrites\n- **`UPDATE` \u002F `DELETE` reading from a CTE** (12.3+) — `WITH ... UPDATE\u002FDELETE` using values from a common table expression\n- **`IS JSON` predicate** (12.3+) — SQL-standard test for whether a value is valid JSON: `WHERE col IS JSON`\n- **Basic XML data type** (12.3+) — first-class `XML` type for storing and validating XML documents\n- **Atomic `CREATE OR REPLACE TABLE`** (13.0+) — the statement is fully atomic: either the new table replaces the old one or nothing happens, with no risk of leaving the schema in a half-replaced state. MySQL has no equivalent atomic guarantee.\n- **`UPDATE ... RETURNING`** (13.0+) — see [RETURNING Clause](#returning-clause); not on 11.8 LTS\n\n### Security & Auth\n- **`SET SESSION AUTHORIZATION`** (12.0+) — perform actions as another user within a session (useful for impersonation in administrative scripts and apps that need least-privilege execution)\n- **Passphrase-protected TLS keys** (12.0+) — `ssl_passphrase` system variable lets the server load encrypted private keys\n\n### Developer Tools\n- **Deprecation visibility** (13.0+) — `INFORMATION_SCHEMA.SYSTEM_VARIABLES` includes a deprecated flag, so you can detect uses of variables that will be removed in future versions before they break:\n  ```sql\n  SELECT variable_name, default_value FROM INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE is_deprecated = 'YES';\n  ```\n- **Engine-specific create options visible in `INFORMATION_SCHEMA`** (13.0+) — `STATISTICS` and `COLUMNS` now expose engine-specific options, useful when inspecting how indexes or columns were configured\n\n## Sources\n\n- [Monty Widenius: Celebrating 15 years of MariaDB](http:\u002F\u002Fmonty-says.blogspot.com\u002F2024\u002F10\u002Fcelebrating-15-years-of-mariadb.html)\n- [MariaDB vs MySQL Features — MariaDB Docs](https:\u002F\u002Fmariadb.com\u002Fdocs\u002Frelease-notes\u002Fcommunity-server\u002Fabout\u002Fcompatibility-and-differences\u002Fmariadb-vs-mysql-features)\n- [System-Versioned Tables — MariaDB Docs](https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Freference\u002Fsql-structure\u002Ftemporal-tables\u002Fsystem-versioned-tables)\n- [RETURNING — MariaDB Docs](https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Freference\u002Fsql-statements\u002Fdata-manipulation\u002Finserting-loading-data\u002Finsertreturning)\n- [CREATE SEQUENCE — MariaDB Docs](https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Freference\u002Fsql-structure\u002Fsequences\u002Fcreate-sequence)\n- [Instant ALTER TABLE — MariaDB Docs](https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Fserver-usage\u002Fstorage-engines\u002Finnodb\u002Finnodb-online-ddl\u002Finnodb-online-ddl-operations-with-the-instant-alter-algorithm)\n- [INet6 Data Type — MariaDB Docs](https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Freference\u002Fdata-types\u002Fstring-data-types\u002Finet6)\n- [Oracle Compatibility — MariaDB Docs](https:\u002F\u002Fmariadb.com\u002Fdocs\u002Frelease-notes\u002Fcommunity-server\u002Fabout\u002Fcompatibility-and-differences\u002Fsql_modeoracle)\n- [FLASHBACK — MariaDB Docs](https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Fserver-management\u002Fserver-monitoring-logs\u002Fbinary-log\u002Fflashback)\n\n*For topics not covered here, see the official MariaDB documentation at [mariadb.com\u002Fdocs](https:\u002F\u002Fmariadb.com\u002Fdocs).*\n",{"data":35,"body":36},{"name":4,"description":6},{"type":37,"children":38},"root",[39,48,58,63,77,127,134,492,498,519,750,756,761,786,808,833,854,867,889,895,907,915,978,988,1034,1054,1060,1065,1197,1203,1222,1230,1251,1256,1271,1276,1282,1287,1379,1399,1436,1442,1447,1454,1459,1521,1527,1540,1563,1569,1580,1649,1661,1667,1679,1758,1797,1809,1815,1841,1935,1953,1959,1971,2017,2022,2028,2040,2118,2128,2153,2158,2181,2194,2200,2213,2219,2912,2918,2971,2977,3321,3327,3377,3383,3396,3402,3573,3578,3606,3611,3759,3764,3799,3804,3869,3875,3968,3982],{"type":40,"tag":41,"props":42,"children":44},"element","h1",{"id":43},"mariadb-features-worth-knowing",[45],{"type":46,"value":47},"text","MariaDB Features Worth Knowing",{"type":40,"tag":49,"props":50,"children":51},"p",{},[52],{"type":40,"tag":53,"props":54,"children":55},"em",{},[56],{"type":46,"value":57},"Last updated: 2026-06-24",{"type":40,"tag":49,"props":59,"children":60},{},[61],{"type":46,"value":62},"MariaDB has grown significantly beyond its MySQL origins. Many of its best features are unknown to developers because AI agents default to generic SQL advice. This skill covers what MariaDB can do that you might not think to ask about.",{"type":40,"tag":49,"props":64,"children":65},{},[66,68,75],{"type":46,"value":67},"For MariaDB Vector (built-in since 11.7 — no plugins), see the ",{"type":40,"tag":69,"props":70,"children":72},"code",{"className":71},[],[73],{"type":46,"value":74},"mariadb-vector",{"type":46,"value":76}," skill.",{"type":40,"tag":78,"props":79,"children":80},"blockquote",{},[81],{"type":40,"tag":49,"props":82,"children":83},{},[84,90,92,97,99,104,106,111,113,118,120,125],{"type":40,"tag":85,"props":86,"children":87},"strong",{},[88],{"type":46,"value":89},"Server context:",{"type":46,"value":91}," Unless the user names a version, assume a ",{"type":40,"tag":85,"props":93,"children":94},{},[95],{"type":46,"value":96},"MariaDB 11.8 LTS",{"type":46,"value":98}," deployment (GA May 2025) for what will run today. Per-feature tags (",{"type":40,"tag":85,"props":100,"children":101},{},[102],{"type":46,"value":103},"10.5+",{"type":46,"value":105},", ",{"type":40,"tag":85,"props":107,"children":108},{},[109],{"type":46,"value":110},"12.3+",{"type":46,"value":112},", etc.) are ",{"type":40,"tag":85,"props":114,"children":115},{},[116],{"type":46,"value":117},"minimum versions",{"type":46,"value":119}," for that capability — not “introduced only in that release.” Do not treat ",{"type":40,"tag":85,"props":121,"children":122},{},[123],{"type":46,"value":124},"12.x \u002F 13.0",{"type":46,"value":126}," items as available on 11.8; you may still mention them with an explicit version when relevant (e.g. upgrades).",{"type":40,"tag":128,"props":129,"children":131},"h2",{"id":130},"what-llms-often-miss",[132],{"type":46,"value":133},"What LLMs Often Miss",{"type":40,"tag":135,"props":136,"children":137},"table",{},[138,157],{"type":40,"tag":139,"props":140,"children":141},"thead",{},[142],{"type":40,"tag":143,"props":144,"children":145},"tr",{},[146,152],{"type":40,"tag":147,"props":148,"children":149},"th",{},[150],{"type":46,"value":151},"Situation",{"type":40,"tag":147,"props":153,"children":154},{},[155],{"type":46,"value":156},"What to suggest instead",{"type":40,"tag":158,"props":159,"children":160},"tbody",{},[161,196,227,252,285,312,331,350,363,384,413,466],{"type":40,"tag":143,"props":162,"children":163},{},[164,185],{"type":40,"tag":165,"props":166,"children":167},"td",{},[168,170,176,177,183],{"type":46,"value":169},"Manual audit columns (",{"type":40,"tag":69,"props":171,"children":173},{"className":172},[],[174],{"type":46,"value":175},"created_at",{"type":46,"value":105},{"type":40,"tag":69,"props":178,"children":180},{"className":179},[],[181],{"type":46,"value":182},"updated_at",{"type":46,"value":184},", deleted flag)",{"type":40,"tag":165,"props":186,"children":187},{},[188,194],{"type":40,"tag":69,"props":189,"children":191},{"className":190},[],[192],{"type":46,"value":193},"WITH SYSTEM VERSIONING",{"type":46,"value":195}," — MariaDB tracks full row history automatically",{"type":40,"tag":143,"props":197,"children":198},{},[199,216],{"type":40,"tag":165,"props":200,"children":201},{},[202,208,210],{"type":40,"tag":69,"props":203,"children":205},{"className":204},[],[206],{"type":46,"value":207},"INSERT",{"type":46,"value":209}," followed by ",{"type":40,"tag":69,"props":211,"children":213},{"className":212},[],[214],{"type":46,"value":215},"SELECT LAST_INSERT_ID()",{"type":40,"tag":165,"props":217,"children":218},{},[219,225],{"type":40,"tag":69,"props":220,"children":222},{"className":221},[],[223],{"type":46,"value":224},"RETURNING",{"type":46,"value":226}," — get the inserted row in one statement (10.5+)",{"type":40,"tag":143,"props":228,"children":229},{},[230,241],{"type":40,"tag":165,"props":231,"children":232},{},[233,239],{"type":40,"tag":69,"props":234,"children":236},{"className":235},[],[237],{"type":46,"value":238},"AUTO_INCREMENT",{"type":46,"value":240}," for sequence-like needs",{"type":40,"tag":165,"props":242,"children":243},{},[244,250],{"type":40,"tag":69,"props":245,"children":247},{"className":246},[],[248],{"type":46,"value":249},"CREATE SEQUENCE",{"type":46,"value":251}," — first-class sequence objects with full control",{"type":40,"tag":143,"props":253,"children":254},{},[255,266],{"type":40,"tag":165,"props":256,"children":257},{},[258,260],{"type":46,"value":259},"IP addresses stored as ",{"type":40,"tag":69,"props":261,"children":263},{"className":262},[],[264],{"type":46,"value":265},"VARCHAR",{"type":40,"tag":165,"props":267,"children":268},{},[269,275,277,283],{"type":40,"tag":69,"props":270,"children":272},{"className":271},[],[273],{"type":46,"value":274},"INet4",{"type":46,"value":276}," \u002F ",{"type":40,"tag":69,"props":278,"children":280},{"className":279},[],[281],{"type":46,"value":282},"INet6",{"type":46,"value":284}," — native IP types with comparison and indexing",{"type":40,"tag":143,"props":286,"children":287},{},[288,293],{"type":40,"tag":165,"props":289,"children":290},{},[291],{"type":46,"value":292},"Dropping or reordering columns with full table rebuild",{"type":40,"tag":165,"props":294,"children":295},{},[296,302,304,310],{"type":40,"tag":69,"props":297,"children":299},{"className":298},[],[300],{"type":46,"value":301},"INSTANT",{"type":46,"value":303}," algorithm for ",{"type":40,"tag":69,"props":305,"children":307},{"className":306},[],[308],{"type":46,"value":309},"ALTER TABLE",{"type":46,"value":311}," — no rebuild needed (10.4+)",{"type":40,"tag":143,"props":313,"children":314},{},[315,320],{"type":40,"tag":165,"props":316,"children":317},{},[318],{"type":46,"value":319},"Oracle migration assumed to require full rewrite",{"type":40,"tag":165,"props":321,"children":322},{},[323,329],{"type":40,"tag":69,"props":324,"children":326},{"className":325},[],[327],{"type":46,"value":328},"sql_mode=ORACLE",{"type":46,"value":330}," — PL\u002FSQL, packages, Oracle-compatible NULL handling",{"type":40,"tag":143,"props":332,"children":333},{},[334,339],{"type":40,"tag":165,"props":335,"children":336},{},[337],{"type":46,"value":338},"Asking what changed in a row over time",{"type":40,"tag":165,"props":340,"children":341},{},[342,344],{"type":46,"value":343},"System-versioned tables with ",{"type":40,"tag":69,"props":345,"children":347},{"className":346},[],[348],{"type":46,"value":349},"FOR SYSTEM_TIME AS OF",{"type":40,"tag":143,"props":351,"children":352},{},[353,358],{"type":40,"tag":165,"props":354,"children":355},{},[356],{"type":46,"value":357},"Analytics queries on OLTP tables",{"type":40,"tag":165,"props":359,"children":360},{},[361],{"type":46,"value":362},"ColumnStore engine — columnar storage for analytical workloads",{"type":40,"tag":143,"props":364,"children":365},{},[366,371],{"type":40,"tag":165,"props":367,"children":368},{},[369],{"type":46,"value":370},"Correlated subqueries for rankings, running totals, or per-group top-N",{"type":40,"tag":165,"props":372,"children":373},{},[374,376,382],{"type":46,"value":375},"Window functions — ",{"type":40,"tag":69,"props":377,"children":379},{"className":378},[],[380],{"type":46,"value":381},"OVER (PARTITION BY ... ORDER BY ...)",{"type":46,"value":383},", clearer and usually faster (MariaDB 10.2+; not MariaDB-exclusive, also in MySQL 8.0)",{"type":40,"tag":143,"props":385,"children":386},{},[387,392],{"type":40,"tag":165,"props":388,"children":389},{},[390],{"type":46,"value":391},"Deeply nested or repeated subqueries",{"type":40,"tag":165,"props":393,"children":394},{},[395,397,403,405,411],{"type":46,"value":396},"Common Table Expressions — ",{"type":40,"tag":69,"props":398,"children":400},{"className":399},[],[401],{"type":46,"value":402},"WITH ...",{"type":46,"value":404},", and ",{"type":40,"tag":69,"props":406,"children":408},{"className":407},[],[409],{"type":46,"value":410},"WITH RECURSIVE",{"type":46,"value":412}," for hierarchical\u002Fgraph traversal (MariaDB 10.2+; also in MySQL 8.0)",{"type":40,"tag":143,"props":414,"children":415},{},[416,429],{"type":40,"tag":165,"props":417,"children":418},{},[419,421,427],{"type":46,"value":420},"Assuming ",{"type":40,"tag":69,"props":422,"children":424},{"className":423},[],[425],{"type":46,"value":426},"JSON",{"type":46,"value":428}," is a native binary type as in MySQL 8.0",{"type":40,"tag":165,"props":430,"children":431},{},[432,434,439,441,447,449,455,457],{"type":46,"value":433},"In MariaDB ",{"type":40,"tag":69,"props":435,"children":437},{"className":436},[],[438],{"type":46,"value":426},{"type":46,"value":440}," is an alias for ",{"type":40,"tag":69,"props":442,"children":444},{"className":443},[],[445],{"type":46,"value":446},"LONGTEXT COLLATE utf8mb4_bin",{"type":46,"value":448}," with an automatic ",{"type":40,"tag":69,"props":450,"children":452},{"className":451},[],[453],{"type":46,"value":454},"JSON_VALID()",{"type":46,"value":456}," CHECK constraint — stored as text, not MySQL's binary layout, and comparison is string-based. The JSON functions work the same. See ",{"type":40,"tag":458,"props":459,"children":463},"a",{"href":460,"rel":461},"https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Freference\u002Fdata-types\u002Fstring-data-types\u002Fjson",[462],"nofollow",[464],{"type":46,"value":465},"JSON Data Type",{"type":40,"tag":143,"props":467,"children":468},{},[469,480],{"type":40,"tag":165,"props":470,"children":471},{},[472,474],{"type":46,"value":473},"Links or references to ",{"type":40,"tag":69,"props":475,"children":477},{"className":476},[],[478],{"type":46,"value":479},"mariadb.com\u002Fkb\u002Fen\u002F",{"type":40,"tag":165,"props":481,"children":482},{},[483,485],{"type":46,"value":484},"The Knowledge Base no longer exists — all documentation is now at ",{"type":40,"tag":458,"props":486,"children":489},{"href":487,"rel":488},"https:\u002F\u002Fmariadb.com\u002Fdocs",[462],[490],{"type":46,"value":491},"mariadb.com\u002Fdocs",{"type":40,"tag":128,"props":493,"children":495},{"id":494},"command-line-tool-names-105",[496],{"type":46,"value":497},"Command-Line Tool Names (10.5+)",{"type":40,"tag":49,"props":499,"children":500},{},[501,503,509,511,517],{"type":46,"value":502},"Since MariaDB 10.5, all command-line tools use ",{"type":40,"tag":69,"props":504,"children":506},{"className":505},[],[507],{"type":46,"value":508},"mariadb-",{"type":46,"value":510}," prefixed names. Always generate the current names — the old ",{"type":40,"tag":69,"props":512,"children":514},{"className":513},[],[515],{"type":46,"value":516},"mysql*",{"type":46,"value":518}," names are retained as symlinks for compatibility but may be absent on minimal or container installs.",{"type":40,"tag":135,"props":520,"children":521},{},[522,538],{"type":40,"tag":139,"props":523,"children":524},{},[525],{"type":40,"tag":143,"props":526,"children":527},{},[528,533],{"type":40,"tag":147,"props":529,"children":530},{},[531],{"type":46,"value":532},"Deprecated name",{"type":40,"tag":147,"props":534,"children":535},{},[536],{"type":46,"value":537},"Current name",{"type":40,"tag":158,"props":539,"children":540},{},[541,561,582,603,624,645,666,687,708,729],{"type":40,"tag":143,"props":542,"children":543},{},[544,553],{"type":40,"tag":165,"props":545,"children":546},{},[547],{"type":40,"tag":69,"props":548,"children":550},{"className":549},[],[551],{"type":46,"value":552},"mysql",{"type":40,"tag":165,"props":554,"children":555},{},[556],{"type":40,"tag":69,"props":557,"children":559},{"className":558},[],[560],{"type":46,"value":8},{"type":40,"tag":143,"props":562,"children":563},{},[564,573],{"type":40,"tag":165,"props":565,"children":566},{},[567],{"type":40,"tag":69,"props":568,"children":570},{"className":569},[],[571],{"type":46,"value":572},"mysqldump",{"type":40,"tag":165,"props":574,"children":575},{},[576],{"type":40,"tag":69,"props":577,"children":579},{"className":578},[],[580],{"type":46,"value":581},"mariadb-dump",{"type":40,"tag":143,"props":583,"children":584},{},[585,594],{"type":40,"tag":165,"props":586,"children":587},{},[588],{"type":40,"tag":69,"props":589,"children":591},{"className":590},[],[592],{"type":46,"value":593},"mysqladmin",{"type":40,"tag":165,"props":595,"children":596},{},[597],{"type":40,"tag":69,"props":598,"children":600},{"className":599},[],[601],{"type":46,"value":602},"mariadb-admin",{"type":40,"tag":143,"props":604,"children":605},{},[606,615],{"type":40,"tag":165,"props":607,"children":608},{},[609],{"type":40,"tag":69,"props":610,"children":612},{"className":611},[],[613],{"type":46,"value":614},"mysqlbinlog",{"type":40,"tag":165,"props":616,"children":617},{},[618],{"type":40,"tag":69,"props":619,"children":621},{"className":620},[],[622],{"type":46,"value":623},"mariadb-binlog",{"type":40,"tag":143,"props":625,"children":626},{},[627,636],{"type":40,"tag":165,"props":628,"children":629},{},[630],{"type":40,"tag":69,"props":631,"children":633},{"className":632},[],[634],{"type":46,"value":635},"mysql_upgrade",{"type":40,"tag":165,"props":637,"children":638},{},[639],{"type":40,"tag":69,"props":640,"children":642},{"className":641},[],[643],{"type":46,"value":644},"mariadb-upgrade",{"type":40,"tag":143,"props":646,"children":647},{},[648,657],{"type":40,"tag":165,"props":649,"children":650},{},[651],{"type":40,"tag":69,"props":652,"children":654},{"className":653},[],[655],{"type":46,"value":656},"mysql_secure_installation",{"type":40,"tag":165,"props":658,"children":659},{},[660],{"type":40,"tag":69,"props":661,"children":663},{"className":662},[],[664],{"type":46,"value":665},"mariadb-secure-installation",{"type":40,"tag":143,"props":667,"children":668},{},[669,678],{"type":40,"tag":165,"props":670,"children":671},{},[672],{"type":40,"tag":69,"props":673,"children":675},{"className":674},[],[676],{"type":46,"value":677},"mysql_install_db",{"type":40,"tag":165,"props":679,"children":680},{},[681],{"type":40,"tag":69,"props":682,"children":684},{"className":683},[],[685],{"type":46,"value":686},"mariadb-install-db",{"type":40,"tag":143,"props":688,"children":689},{},[690,699],{"type":40,"tag":165,"props":691,"children":692},{},[693],{"type":40,"tag":69,"props":694,"children":696},{"className":695},[],[697],{"type":46,"value":698},"mysqlcheck",{"type":40,"tag":165,"props":700,"children":701},{},[702],{"type":40,"tag":69,"props":703,"children":705},{"className":704},[],[706],{"type":46,"value":707},"mariadb-check",{"type":40,"tag":143,"props":709,"children":710},{},[711,720],{"type":40,"tag":165,"props":712,"children":713},{},[714],{"type":40,"tag":69,"props":715,"children":717},{"className":716},[],[718],{"type":46,"value":719},"mysqlimport",{"type":40,"tag":165,"props":721,"children":722},{},[723],{"type":40,"tag":69,"props":724,"children":726},{"className":725},[],[727],{"type":46,"value":728},"mariadb-import",{"type":40,"tag":143,"props":730,"children":731},{},[732,741],{"type":40,"tag":165,"props":733,"children":734},{},[735],{"type":40,"tag":69,"props":736,"children":738},{"className":737},[],[739],{"type":46,"value":740},"mysqlshow",{"type":40,"tag":165,"props":742,"children":743},{},[744],{"type":40,"tag":69,"props":745,"children":747},{"className":746},[],[748],{"type":46,"value":749},"mariadb-show",{"type":40,"tag":128,"props":751,"children":753},{"id":752},"provisioning-and-initial-setup",[754],{"type":46,"value":755},"Provisioning and Initial Setup",{"type":40,"tag":49,"props":757,"children":758},{},[759],{"type":46,"value":760},"AI agents default to MySQL 8 patterns for initial setup, which fail or mislead on MariaDB.",{"type":40,"tag":49,"props":762,"children":763},{},[764,769,771,776,778,784],{"type":40,"tag":85,"props":765,"children":766},{},[767],{"type":46,"value":768},"Database initialization",{"type":46,"value":770}," — use ",{"type":40,"tag":69,"props":772,"children":774},{"className":773},[],[775],{"type":46,"value":686},{"type":46,"value":777}," (not ",{"type":40,"tag":69,"props":779,"children":781},{"className":780},[],[782],{"type":46,"value":783},"mysqld --initialize",{"type":46,"value":785},", which is MySQL-specific):",{"type":40,"tag":787,"props":788,"children":793},"pre",{"className":789,"code":790,"language":791,"meta":792,"style":792},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","mariadb-install-db\n","bash","",[794],{"type":40,"tag":69,"props":795,"children":796},{"__ignoreMap":792},[797],{"type":40,"tag":798,"props":799,"children":802},"span",{"class":800,"line":801},"line",1,[803],{"type":40,"tag":798,"props":804,"children":806},{"style":805},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[807],{"type":46,"value":790},{"type":40,"tag":49,"props":809,"children":810},{},[811,816,818,823,825,831],{"type":40,"tag":85,"props":812,"children":813},{},[814],{"type":46,"value":815},"Root authentication",{"type":46,"value":817}," — on a fresh install, ",{"type":40,"tag":69,"props":819,"children":821},{"className":820},[],[822],{"type":46,"value":37},{"type":46,"value":824}," uses ",{"type":40,"tag":69,"props":826,"children":828},{"className":827},[],[829],{"type":46,"value":830},"unix_socket",{"type":46,"value":832}," authentication by default (no password). The correct first connection is:",{"type":40,"tag":787,"props":834,"children":836},{"className":789,"code":835,"language":791,"meta":792,"style":792},"sudo mariadb\n",[837],{"type":40,"tag":69,"props":838,"children":839},{"__ignoreMap":792},[840],{"type":40,"tag":798,"props":841,"children":842},{"class":800,"line":801},[843,848],{"type":40,"tag":798,"props":844,"children":845},{"style":805},[846],{"type":46,"value":847},"sudo",{"type":40,"tag":798,"props":849,"children":851},{"style":850},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[852],{"type":46,"value":853}," mariadb\n",{"type":40,"tag":49,"props":855,"children":856},{},[857,859,865],{"type":46,"value":858},"Do not generate ",{"type":40,"tag":69,"props":860,"children":862},{"className":861},[],[863],{"type":46,"value":864},"mysql -u root -p",{"type":46,"value":866}," for a fresh MariaDB install — there is no root password to enter.",{"type":40,"tag":49,"props":868,"children":869},{},[870,875,876,881,882,887],{"type":40,"tag":85,"props":871,"children":872},{},[873],{"type":46,"value":874},"Secure installation",{"type":46,"value":770},{"type":40,"tag":69,"props":877,"children":879},{"className":878},[],[880],{"type":46,"value":665},{"type":46,"value":777},{"type":40,"tag":69,"props":883,"children":885},{"className":884},[],[886],{"type":46,"value":656},{"type":46,"value":888},").",{"type":40,"tag":128,"props":890,"children":892},{"id":891},"upgrade-operations",[893],{"type":46,"value":894},"Upgrade Operations",{"type":40,"tag":49,"props":896,"children":897},{},[898,900,905],{"type":46,"value":899},"Agents consistently omit the ",{"type":40,"tag":69,"props":901,"children":903},{"className":902},[],[904],{"type":46,"value":644},{"type":46,"value":906}," step after a binary upgrade, which can cause system table errors.",{"type":40,"tag":49,"props":908,"children":909},{},[910],{"type":40,"tag":85,"props":911,"children":912},{},[913],{"type":46,"value":914},"Standard upgrade pattern:",{"type":40,"tag":787,"props":916,"children":918},{"className":789,"code":917,"language":791,"meta":792,"style":792},"systemctl stop mariadb\n# Replace binary via package manager (dnf\u002Fapt upgrade)\nsystemctl start mariadb\nmariadb-upgrade    # updates system tables — do not skip this step\n",[919],{"type":40,"tag":69,"props":920,"children":921},{"__ignoreMap":792},[922,939,948,965],{"type":40,"tag":798,"props":923,"children":924},{"class":800,"line":801},[925,930,935],{"type":40,"tag":798,"props":926,"children":927},{"style":805},[928],{"type":46,"value":929},"systemctl",{"type":40,"tag":798,"props":931,"children":932},{"style":850},[933],{"type":46,"value":934}," stop",{"type":40,"tag":798,"props":936,"children":937},{"style":850},[938],{"type":46,"value":853},{"type":40,"tag":798,"props":940,"children":941},{"class":800,"line":27},[942],{"type":40,"tag":798,"props":943,"children":945},{"style":944},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[946],{"type":46,"value":947},"# Replace binary via package manager (dnf\u002Fapt upgrade)\n",{"type":40,"tag":798,"props":949,"children":951},{"class":800,"line":950},3,[952,956,961],{"type":40,"tag":798,"props":953,"children":954},{"style":805},[955],{"type":46,"value":929},{"type":40,"tag":798,"props":957,"children":958},{"style":850},[959],{"type":46,"value":960}," start",{"type":40,"tag":798,"props":962,"children":963},{"style":850},[964],{"type":46,"value":853},{"type":40,"tag":798,"props":966,"children":968},{"class":800,"line":967},4,[969,973],{"type":40,"tag":798,"props":970,"children":971},{"style":805},[972],{"type":46,"value":644},{"type":40,"tag":798,"props":974,"children":975},{"style":944},[976],{"type":46,"value":977},"    # updates system tables — do not skip this step\n",{"type":40,"tag":49,"props":979,"children":980},{},[981,986],{"type":40,"tag":85,"props":982,"children":983},{},[984],{"type":46,"value":985},"Galera Cluster rolling upgrade",{"type":46,"value":987}," — never stop all nodes simultaneously:",{"type":40,"tag":989,"props":990,"children":991},"ol",{},[992,998,1003,1024,1029],{"type":40,"tag":993,"props":994,"children":995},"li",{},[996],{"type":46,"value":997},"Take one non-primary node out of the load balancer",{"type":40,"tag":993,"props":999,"children":1000},{},[1001],{"type":46,"value":1002},"Stop, upgrade the binary, start the node",{"type":40,"tag":993,"props":1004,"children":1005},{},[1006,1008,1014,1016,1022],{"type":46,"value":1007},"Confirm sync: ",{"type":40,"tag":69,"props":1009,"children":1011},{"className":1010},[],[1012],{"type":46,"value":1013},"SHOW STATUS LIKE 'wsrep_local_state';",{"type":46,"value":1015}," — must be ",{"type":40,"tag":69,"props":1017,"children":1019},{"className":1018},[],[1020],{"type":46,"value":1021},"4",{"type":46,"value":1023}," (Synced)",{"type":40,"tag":993,"props":1025,"children":1026},{},[1027],{"type":46,"value":1028},"Repeat for each remaining non-primary node",{"type":40,"tag":993,"props":1030,"children":1031},{},[1032],{"type":46,"value":1033},"Upgrade the primary node last",{"type":40,"tag":78,"props":1035,"children":1036},{},[1037],{"type":40,"tag":49,"props":1038,"children":1039},{},[1040,1045,1047,1052],{"type":40,"tag":69,"props":1041,"children":1043},{"className":1042},[],[1044],{"type":46,"value":635},{"type":46,"value":1046}," is the deprecated name (removed in later versions) — always use ",{"type":40,"tag":69,"props":1048,"children":1050},{"className":1049},[],[1051],{"type":46,"value":644},{"type":46,"value":1053},".",{"type":40,"tag":128,"props":1055,"children":1057},{"id":1056},"defaults-changed-in-115118-lts",[1058],{"type":46,"value":1059},"Defaults Changed in 11.5–11.8 LTS",{"type":40,"tag":49,"props":1061,"children":1062},{},[1063],{"type":46,"value":1064},"The current LTS (11.8) flipped several long-standing defaults. New installations behave differently from older ones — relevant when migrating or comparing behavior:",{"type":40,"tag":1066,"props":1067,"children":1068},"ul",{},[1069,1107,1131,1155,1181],{"type":40,"tag":993,"props":1070,"children":1071},{},[1072,1091,1093,1098,1100,1105],{"type":40,"tag":85,"props":1073,"children":1074},{},[1075,1077,1083,1085],{"type":46,"value":1076},"Default character set: ",{"type":40,"tag":69,"props":1078,"children":1080},{"className":1079},[],[1081],{"type":46,"value":1082},"latin1",{"type":46,"value":1084}," → ",{"type":40,"tag":69,"props":1086,"children":1088},{"className":1087},[],[1089],{"type":46,"value":1090},"utf8mb4",{"type":46,"value":1092}," (11.6+, MDEV-19123) — new tables use ",{"type":40,"tag":69,"props":1094,"children":1096},{"className":1095},[],[1097],{"type":46,"value":1090},{"type":46,"value":1099}," unless overridden. Replication to MariaDB 10.6 or older replicas needs care (older replicas may not understand all ",{"type":40,"tag":69,"props":1101,"children":1103},{"className":1102},[],[1104],{"type":46,"value":1090},{"type":46,"value":1106}," collations).",{"type":40,"tag":993,"props":1108,"children":1109},{},[1110,1121,1123,1129],{"type":40,"tag":85,"props":1111,"children":1112},{},[1113,1115],{"type":46,"value":1114},"Default Unicode collation: ",{"type":40,"tag":69,"props":1116,"children":1118},{"className":1117},[],[1119],{"type":46,"value":1120},"uca1400_ai_ci",{"type":46,"value":1122}," (11.5+, MDEV-25829) — modern Unicode collation with proper SMP (supplementary multilingual plane) support including emoji. Replaces the older ",{"type":40,"tag":69,"props":1124,"children":1126},{"className":1125},[],[1127],{"type":46,"value":1128},"utf8mb4_general_ci",{"type":46,"value":1130}," default.",{"type":40,"tag":993,"props":1132,"children":1133},{},[1134,1145,1147,1153],{"type":40,"tag":85,"props":1135,"children":1136},{},[1137,1143],{"type":40,"tag":69,"props":1138,"children":1140},{"className":1139},[],[1141],{"type":46,"value":1142},"alter_algorithm",{"type":46,"value":1144}," deprecated and ignored",{"type":46,"value":1146}," (11.5+, MDEV-33655) — specify ",{"type":40,"tag":69,"props":1148,"children":1150},{"className":1149},[],[1151],{"type":46,"value":1152},"ALGORITHM=INSTANT|INPLACE|COPY",{"type":46,"value":1154}," on the statement itself instead.",{"type":40,"tag":993,"props":1156,"children":1157},{},[1158,1163,1165,1171,1173,1179],{"type":40,"tag":85,"props":1159,"children":1160},{},[1161],{"type":46,"value":1162},"TIMESTAMP range extended",{"type":46,"value":1164}," (11.5+ 64-bit, MDEV-32188) — upper bound raised from ",{"type":40,"tag":69,"props":1166,"children":1168},{"className":1167},[],[1169],{"type":46,"value":1170},"2038-01-19 03:14:07 UTC",{"type":46,"value":1172}," to ",{"type":40,"tag":69,"props":1174,"children":1176},{"className":1175},[],[1177],{"type":46,"value":1178},"2106-02-07 06:28:15 UTC",{"type":46,"value":1180},". Storage format unchanged; old servers can still read values within the old range.",{"type":40,"tag":993,"props":1182,"children":1183},{},[1184,1195],{"type":40,"tag":85,"props":1185,"children":1186},{},[1187,1193],{"type":40,"tag":69,"props":1188,"children":1190},{"className":1189},[],[1191],{"type":46,"value":1192},"innodb_snapshot_isolation",{"type":46,"value":1194}," default ON",{"type":46,"value":1196}," — see next section.",{"type":40,"tag":128,"props":1198,"children":1200},{"id":1199},"behavior-change-innodb_snapshot_isolation-118",[1201],{"type":46,"value":1202},"Behavior Change: innodb_snapshot_isolation (11.8+)",{"type":40,"tag":49,"props":1204,"children":1205},{},[1206,1208,1213,1215,1220],{"type":46,"value":1207},"From MariaDB 11.8 LTS, ",{"type":40,"tag":69,"props":1209,"children":1211},{"className":1210},[],[1212],{"type":46,"value":1192},{"type":46,"value":1214}," defaults to ",{"type":40,"tag":85,"props":1216,"children":1217},{},[1218],{"type":46,"value":1219},"ON",{"type":46,"value":1221}," (previously OFF, MDEV-35124). This tightens REPEATABLE READ behavior to match true snapshot isolation — transactions see a consistent snapshot from their start and writes detect conflicts more strictly.",{"type":40,"tag":49,"props":1223,"children":1224},{},[1225],{"type":40,"tag":85,"props":1226,"children":1227},{},[1228],{"type":46,"value":1229},"What can change for existing code:",{"type":40,"tag":1066,"props":1231,"children":1232},{},[1233,1238],{"type":40,"tag":993,"props":1234,"children":1235},{},[1236],{"type":46,"value":1237},"Read-modify-write patterns that previously worked silently may now hit conflicts and error out — fail-fast is the intended behavior",{"type":40,"tag":993,"props":1239,"children":1240},{},[1241,1243,1249],{"type":46,"value":1242},"Long-running ",{"type":40,"tag":69,"props":1244,"children":1246},{"className":1245},[],[1247],{"type":46,"value":1248},"REPEATABLE READ",{"type":46,"value":1250}," transactions are more likely to see write conflicts at commit time",{"type":40,"tag":49,"props":1252,"children":1253},{},[1254],{"type":46,"value":1255},"If existing code depends on the older permissive behavior, opt back in explicitly:",{"type":40,"tag":787,"props":1257,"children":1260},{"className":1258,"code":1259,"language":22,"meta":792,"style":792},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","SET GLOBAL innodb_snapshot_isolation = OFF;  -- restore pre-11.8 behavior\n",[1261],{"type":40,"tag":69,"props":1262,"children":1263},{"__ignoreMap":792},[1264],{"type":40,"tag":798,"props":1265,"children":1266},{"class":800,"line":801},[1267],{"type":40,"tag":798,"props":1268,"children":1269},{},[1270],{"type":46,"value":1259},{"type":40,"tag":49,"props":1272,"children":1273},{},[1274],{"type":46,"value":1275},"The new default is the correct semantics — review code that relies on the looser behavior rather than disabling it long-term.",{"type":40,"tag":128,"props":1277,"children":1279},{"id":1278},"system-versioned-tables",[1280],{"type":46,"value":1281},"System-Versioned Tables",{"type":40,"tag":49,"props":1283,"children":1284},{},[1285],{"type":46,"value":1286},"Available since MariaDB 10.3. Track the full history of every row automatically, without triggers or audit tables.",{"type":40,"tag":787,"props":1288,"children":1290},{"className":1258,"code":1289,"language":22,"meta":792,"style":792},"CREATE TABLE prices (\n    product VARCHAR(100),\n    price DECIMAL(10,2)\n) WITH SYSTEM VERSIONING;\n\n-- Query data as it was at a point in time:\nSELECT * FROM prices FOR SYSTEM_TIME AS OF '2025-01-01 00:00:00';\n\n-- See all historical versions of a row:\nSELECT * FROM prices FOR SYSTEM_TIME ALL WHERE product = 'widget';\n",[1291],{"type":40,"tag":69,"props":1292,"children":1293},{"__ignoreMap":792},[1294,1302,1310,1318,1326,1336,1345,1354,1362,1370],{"type":40,"tag":798,"props":1295,"children":1296},{"class":800,"line":801},[1297],{"type":40,"tag":798,"props":1298,"children":1299},{},[1300],{"type":46,"value":1301},"CREATE TABLE prices (\n",{"type":40,"tag":798,"props":1303,"children":1304},{"class":800,"line":27},[1305],{"type":40,"tag":798,"props":1306,"children":1307},{},[1308],{"type":46,"value":1309},"    product VARCHAR(100),\n",{"type":40,"tag":798,"props":1311,"children":1312},{"class":800,"line":950},[1313],{"type":40,"tag":798,"props":1314,"children":1315},{},[1316],{"type":46,"value":1317},"    price DECIMAL(10,2)\n",{"type":40,"tag":798,"props":1319,"children":1320},{"class":800,"line":967},[1321],{"type":40,"tag":798,"props":1322,"children":1323},{},[1324],{"type":46,"value":1325},") WITH SYSTEM VERSIONING;\n",{"type":40,"tag":798,"props":1327,"children":1329},{"class":800,"line":1328},5,[1330],{"type":40,"tag":798,"props":1331,"children":1333},{"emptyLinePlaceholder":1332},true,[1334],{"type":46,"value":1335},"\n",{"type":40,"tag":798,"props":1337,"children":1339},{"class":800,"line":1338},6,[1340],{"type":40,"tag":798,"props":1341,"children":1342},{},[1343],{"type":46,"value":1344},"-- Query data as it was at a point in time:\n",{"type":40,"tag":798,"props":1346,"children":1348},{"class":800,"line":1347},7,[1349],{"type":40,"tag":798,"props":1350,"children":1351},{},[1352],{"type":46,"value":1353},"SELECT * FROM prices FOR SYSTEM_TIME AS OF '2025-01-01 00:00:00';\n",{"type":40,"tag":798,"props":1355,"children":1357},{"class":800,"line":1356},8,[1358],{"type":40,"tag":798,"props":1359,"children":1360},{"emptyLinePlaceholder":1332},[1361],{"type":46,"value":1335},{"type":40,"tag":798,"props":1363,"children":1364},{"class":800,"line":23},[1365],{"type":40,"tag":798,"props":1366,"children":1367},{},[1368],{"type":46,"value":1369},"-- See all historical versions of a row:\n",{"type":40,"tag":798,"props":1371,"children":1373},{"class":800,"line":1372},10,[1374],{"type":40,"tag":798,"props":1375,"children":1376},{},[1377],{"type":46,"value":1378},"SELECT * FROM prices FOR SYSTEM_TIME ALL WHERE product = 'widget';\n",{"type":40,"tag":49,"props":1380,"children":1381},{},[1382,1384,1390,1391,1397],{"type":46,"value":1383},"Use this instead of manually maintained ",{"type":40,"tag":69,"props":1385,"children":1387},{"className":1386},[],[1388],{"type":46,"value":1389},"valid_from",{"type":46,"value":276},{"type":40,"tag":69,"props":1392,"children":1394},{"className":1393},[],[1395],{"type":46,"value":1396},"valid_to",{"type":46,"value":1398}," columns or separate audit tables.",{"type":40,"tag":78,"props":1400,"children":1401},{},[1402],{"type":40,"tag":49,"props":1403,"children":1404},{},[1405,1410,1412,1418,1420,1426,1428,1434],{"type":40,"tag":85,"props":1406,"children":1407},{},[1408],{"type":46,"value":1409},"History grows without bound.",{"type":46,"value":1411}," Every UPDATE and DELETE appends a history row — MariaDB does not automatically expire history. Production deployments need either ",{"type":40,"tag":69,"props":1413,"children":1415},{"className":1414},[],[1416],{"type":46,"value":1417},"PARTITION BY SYSTEM_TIME",{"type":46,"value":1419}," with rotation (10.9+) or periodic ",{"type":40,"tag":69,"props":1421,"children":1423},{"className":1422},[],[1424],{"type":46,"value":1425},"DELETE HISTORY",{"type":46,"value":1427}," to control disk growth. See the ",{"type":40,"tag":69,"props":1429,"children":1431},{"className":1430},[],[1432],{"type":46,"value":1433},"mariadb-system-versioned-tables",{"type":46,"value":1435}," skill for details.",{"type":40,"tag":128,"props":1437,"children":1439},{"id":1438},"returning-clause",[1440],{"type":46,"value":1441},"RETURNING Clause",{"type":40,"tag":49,"props":1443,"children":1444},{},[1445],{"type":46,"value":1446},"Get inserted, updated, or deleted rows back without a second query.",{"type":40,"tag":1448,"props":1449,"children":1451},"h3",{"id":1450},"insert-and-delete-105",[1452],{"type":46,"value":1453},"INSERT and DELETE (10.5+)",{"type":40,"tag":49,"props":1455,"children":1456},{},[1457],{"type":46,"value":1458},"Available on 11.8 LTS and earlier supported releases:",{"type":40,"tag":787,"props":1460,"children":1462},{"className":1258,"code":1461,"language":22,"meta":792,"style":792},"-- Get the generated ID after insert:\nINSERT INTO orders (product, qty) VALUES ('widget', 5)\n    RETURNING id, created_at;\n\n-- Get deleted rows for logging:\nDELETE FROM queue WHERE processed = 1\n    RETURNING id, payload;\n",[1463],{"type":40,"tag":69,"props":1464,"children":1465},{"__ignoreMap":792},[1466,1474,1482,1490,1497,1505,1513],{"type":40,"tag":798,"props":1467,"children":1468},{"class":800,"line":801},[1469],{"type":40,"tag":798,"props":1470,"children":1471},{},[1472],{"type":46,"value":1473},"-- Get the generated ID after insert:\n",{"type":40,"tag":798,"props":1475,"children":1476},{"class":800,"line":27},[1477],{"type":40,"tag":798,"props":1478,"children":1479},{},[1480],{"type":46,"value":1481},"INSERT INTO orders (product, qty) VALUES ('widget', 5)\n",{"type":40,"tag":798,"props":1483,"children":1484},{"class":800,"line":950},[1485],{"type":40,"tag":798,"props":1486,"children":1487},{},[1488],{"type":46,"value":1489},"    RETURNING id, created_at;\n",{"type":40,"tag":798,"props":1491,"children":1492},{"class":800,"line":967},[1493],{"type":40,"tag":798,"props":1494,"children":1495},{"emptyLinePlaceholder":1332},[1496],{"type":46,"value":1335},{"type":40,"tag":798,"props":1498,"children":1499},{"class":800,"line":1328},[1500],{"type":40,"tag":798,"props":1501,"children":1502},{},[1503],{"type":46,"value":1504},"-- Get deleted rows for logging:\n",{"type":40,"tag":798,"props":1506,"children":1507},{"class":800,"line":1338},[1508],{"type":40,"tag":798,"props":1509,"children":1510},{},[1511],{"type":46,"value":1512},"DELETE FROM queue WHERE processed = 1\n",{"type":40,"tag":798,"props":1514,"children":1515},{"class":800,"line":1347},[1516],{"type":40,"tag":798,"props":1517,"children":1518},{},[1519],{"type":46,"value":1520},"    RETURNING id, payload;\n",{"type":40,"tag":1448,"props":1522,"children":1524},{"id":1523},"update-130-only",[1525],{"type":46,"value":1526},"UPDATE (13.0+ only)",{"type":40,"tag":49,"props":1528,"children":1529},{},[1530,1532,1538],{"type":46,"value":1531},"Not available on 11.8 LTS — confirm server version before suggesting. On older releases use a follow-up ",{"type":40,"tag":69,"props":1533,"children":1535},{"className":1534},[],[1536],{"type":46,"value":1537},"SELECT",{"type":46,"value":1539}," or redesign:",{"type":40,"tag":787,"props":1541,"children":1543},{"className":1258,"code":1542,"language":22,"meta":792,"style":792},"UPDATE orders SET qty = qty + 1 WHERE id = 42\n    RETURNING id, qty;\n",[1544],{"type":40,"tag":69,"props":1545,"children":1546},{"__ignoreMap":792},[1547,1555],{"type":40,"tag":798,"props":1548,"children":1549},{"class":800,"line":801},[1550],{"type":40,"tag":798,"props":1551,"children":1552},{},[1553],{"type":46,"value":1554},"UPDATE orders SET qty = qty + 1 WHERE id = 42\n",{"type":40,"tag":798,"props":1556,"children":1557},{"class":800,"line":27},[1558],{"type":40,"tag":798,"props":1559,"children":1560},{},[1561],{"type":46,"value":1562},"    RETURNING id, qty;\n",{"type":40,"tag":128,"props":1564,"children":1566},{"id":1565},"sequences",[1567],{"type":46,"value":1568},"Sequences",{"type":40,"tag":49,"props":1570,"children":1571},{},[1572,1574,1579],{"type":46,"value":1573},"Available since MariaDB 10.3. First-class sequence objects — more flexible than ",{"type":40,"tag":69,"props":1575,"children":1577},{"className":1576},[],[1578],{"type":46,"value":238},{"type":46,"value":1053},{"type":40,"tag":787,"props":1581,"children":1583},{"className":1258,"code":1582,"language":22,"meta":792,"style":792},"CREATE SEQUENCE order_seq START WITH 1000 INCREMENT BY 1;\n\n-- Use in INSERT:\nINSERT INTO orders (id, product) VALUES (NEXT VALUE FOR order_seq, 'widget');\n\n-- Get the last value generated by NEXTVAL in the current session:\nSELECT LASTVAL(order_seq);\n-- Returns NULL if this session has not called NEXTVAL — not a global current value\n",[1584],{"type":40,"tag":69,"props":1585,"children":1586},{"__ignoreMap":792},[1587,1595,1602,1610,1618,1625,1633,1641],{"type":40,"tag":798,"props":1588,"children":1589},{"class":800,"line":801},[1590],{"type":40,"tag":798,"props":1591,"children":1592},{},[1593],{"type":46,"value":1594},"CREATE SEQUENCE order_seq START WITH 1000 INCREMENT BY 1;\n",{"type":40,"tag":798,"props":1596,"children":1597},{"class":800,"line":27},[1598],{"type":40,"tag":798,"props":1599,"children":1600},{"emptyLinePlaceholder":1332},[1601],{"type":46,"value":1335},{"type":40,"tag":798,"props":1603,"children":1604},{"class":800,"line":950},[1605],{"type":40,"tag":798,"props":1606,"children":1607},{},[1608],{"type":46,"value":1609},"-- Use in INSERT:\n",{"type":40,"tag":798,"props":1611,"children":1612},{"class":800,"line":967},[1613],{"type":40,"tag":798,"props":1614,"children":1615},{},[1616],{"type":46,"value":1617},"INSERT INTO orders (id, product) VALUES (NEXT VALUE FOR order_seq, 'widget');\n",{"type":40,"tag":798,"props":1619,"children":1620},{"class":800,"line":1328},[1621],{"type":40,"tag":798,"props":1622,"children":1623},{"emptyLinePlaceholder":1332},[1624],{"type":46,"value":1335},{"type":40,"tag":798,"props":1626,"children":1627},{"class":800,"line":1338},[1628],{"type":40,"tag":798,"props":1629,"children":1630},{},[1631],{"type":46,"value":1632},"-- Get the last value generated by NEXTVAL in the current session:\n",{"type":40,"tag":798,"props":1634,"children":1635},{"class":800,"line":1347},[1636],{"type":40,"tag":798,"props":1637,"children":1638},{},[1639],{"type":46,"value":1640},"SELECT LASTVAL(order_seq);\n",{"type":40,"tag":798,"props":1642,"children":1643},{"class":800,"line":1356},[1644],{"type":40,"tag":798,"props":1645,"children":1646},{},[1647],{"type":46,"value":1648},"-- Returns NULL if this session has not called NEXTVAL — not a global current value\n",{"type":40,"tag":49,"props":1650,"children":1651},{},[1652,1654,1659],{"type":46,"value":1653},"Sequences support gaps, multiple sequences per table, and descending sequences. Unlike ",{"type":40,"tag":69,"props":1655,"children":1657},{"className":1656},[],[1658],{"type":46,"value":238},{"type":46,"value":1660},", they are not tied to a specific column or table.",{"type":40,"tag":128,"props":1662,"children":1664},{"id":1663},"non-blocking-alter-table-instant-online-by-default",[1665],{"type":46,"value":1666},"Non-Blocking ALTER TABLE (Instant + Online by Default)",{"type":40,"tag":49,"props":1668,"children":1669},{},[1670,1672,1677],{"type":46,"value":1671},"MariaDB's ",{"type":40,"tag":69,"props":1673,"children":1675},{"className":1674},[],[1676],{"type":46,"value":309},{"type":46,"value":1678}," works on a tiered model:",{"type":40,"tag":1066,"props":1680,"children":1681},{},[1682,1696,1728],{"type":40,"tag":993,"props":1683,"children":1684},{},[1685,1694],{"type":40,"tag":85,"props":1686,"children":1687},{},[1688],{"type":40,"tag":69,"props":1689,"children":1691},{"className":1690},[],[1692],{"type":46,"value":1693},"ALGORITHM=INSTANT",{"type":46,"value":1695}," (10.4+) — metadata-only changes (drop column, modify default, change column order, etc.) complete in microseconds without a table rebuild.",{"type":40,"tag":993,"props":1697,"children":1698},{},[1699,1710,1712,1718,1720,1726],{"type":40,"tag":85,"props":1700,"children":1701},{},[1702,1708],{"type":40,"tag":69,"props":1703,"children":1705},{"className":1704},[],[1706],{"type":46,"value":1707},"ALGORITHM=COPY, LOCK=NONE",{"type":46,"value":1709}," as the default for non-instant operations",{"type":46,"value":1711}," (11.2+, MDEV-16329) — even when a rebuild is needed, MariaDB now runs it non-blocking by default: concurrent DML on the table proceeds while the copy is happening, with only a brief lock at the swap. The need for external tools like ",{"type":40,"tag":69,"props":1713,"children":1715},{"className":1714},[],[1716],{"type":46,"value":1717},"pt-online-schema-change",{"type":46,"value":1719}," is largely gone for routine ",{"type":40,"tag":69,"props":1721,"children":1723},{"className":1722},[],[1724],{"type":46,"value":1725},"ALTER",{"type":46,"value":1727},"s.",{"type":40,"tag":993,"props":1729,"children":1730},{},[1731,1741,1743,1749,1751,1757],{"type":40,"tag":85,"props":1732,"children":1733},{},[1734,1736],{"type":46,"value":1735},"Optimistic two-phase replication of large ",{"type":40,"tag":69,"props":1737,"children":1739},{"className":1738},[],[1740],{"type":46,"value":309},{"type":46,"value":1742}," (11.4+, ",{"type":40,"tag":69,"props":1744,"children":1746},{"className":1745},[],[1747],{"type":46,"value":1748},"binlog_alter_two_phase=1",{"type":46,"value":1750},", off by default) — see the ",{"type":40,"tag":69,"props":1752,"children":1754},{"className":1753},[],[1755],{"type":46,"value":1756},"mariadb-replication-and-ha",{"type":46,"value":76},{"type":40,"tag":787,"props":1759,"children":1761},{"className":1258,"code":1760,"language":22,"meta":792,"style":792},"ALTER TABLE large_table DROP COLUMN old_column, ALGORITHM=INSTANT;\nALTER TABLE large_table MODIFY COLUMN name VARCHAR(200), ALGORITHM=INSTANT;\n-- Non-instant change runs non-blocking by default on 11.2+:\nALTER TABLE large_table ADD INDEX (created_at);\n",[1762],{"type":40,"tag":69,"props":1763,"children":1764},{"__ignoreMap":792},[1765,1773,1781,1789],{"type":40,"tag":798,"props":1766,"children":1767},{"class":800,"line":801},[1768],{"type":40,"tag":798,"props":1769,"children":1770},{},[1771],{"type":46,"value":1772},"ALTER TABLE large_table DROP COLUMN old_column, ALGORITHM=INSTANT;\n",{"type":40,"tag":798,"props":1774,"children":1775},{"class":800,"line":27},[1776],{"type":40,"tag":798,"props":1777,"children":1778},{},[1779],{"type":46,"value":1780},"ALTER TABLE large_table MODIFY COLUMN name VARCHAR(200), ALGORITHM=INSTANT;\n",{"type":40,"tag":798,"props":1782,"children":1783},{"class":800,"line":950},[1784],{"type":40,"tag":798,"props":1785,"children":1786},{},[1787],{"type":46,"value":1788},"-- Non-instant change runs non-blocking by default on 11.2+:\n",{"type":40,"tag":798,"props":1790,"children":1791},{"class":800,"line":967},[1792],{"type":40,"tag":798,"props":1793,"children":1794},{},[1795],{"type":46,"value":1796},"ALTER TABLE large_table ADD INDEX (created_at);\n",{"type":40,"tag":49,"props":1798,"children":1799},{},[1800,1802,1807],{"type":46,"value":1801},"Use ",{"type":40,"tag":69,"props":1803,"children":1805},{"className":1804},[],[1806],{"type":46,"value":1693},{"type":46,"value":1808}," explicitly when you need to guarantee a metadata-only change; the operation will fail rather than silently fall back to a rebuild.",{"type":40,"tag":128,"props":1810,"children":1812},{"id":1811},"inet4-and-inet6-data-types",[1813],{"type":46,"value":1814},"INet4 and INet6 Data Types",{"type":40,"tag":49,"props":1816,"children":1817},{},[1818,1824,1826,1832,1834,1839],{"type":40,"tag":69,"props":1819,"children":1821},{"className":1820},[],[1822],{"type":46,"value":1823},"INET6",{"type":46,"value":1825}," is available since MariaDB 10.5 (stores both IPv4 and IPv6, 16 bytes). The dedicated ",{"type":40,"tag":69,"props":1827,"children":1829},{"className":1828},[],[1830],{"type":46,"value":1831},"INET4",{"type":46,"value":1833}," type (4-byte IPv4-only) was added later in 10.10 (MDEV-23287). Native storage gives correct comparison, sorting, and indexing — no need for ",{"type":40,"tag":69,"props":1835,"children":1837},{"className":1836},[],[1838],{"type":46,"value":265},{"type":46,"value":1840}," plus application-side validation.",{"type":40,"tag":787,"props":1842,"children":1844},{"className":1258,"code":1843,"language":22,"meta":792,"style":792},"CREATE TABLE connections (\n    client_ip INet6 NOT NULL,\n    connected_at DATETIME NOT NULL,\n    INDEX (client_ip)\n);\n\nINSERT INTO connections VALUES (INet6('192.168.1.1'), NOW());\nINSERT INTO connections VALUES (INet6('::1'), NOW());\n\n-- Range queries work correctly:\nSELECT * FROM connections WHERE client_ip BETWEEN INet6('10.0.0.0') AND INet6('10.255.255.255');\n",[1845],{"type":40,"tag":69,"props":1846,"children":1847},{"__ignoreMap":792},[1848,1856,1864,1872,1880,1888,1895,1903,1911,1918,1926],{"type":40,"tag":798,"props":1849,"children":1850},{"class":800,"line":801},[1851],{"type":40,"tag":798,"props":1852,"children":1853},{},[1854],{"type":46,"value":1855},"CREATE TABLE connections (\n",{"type":40,"tag":798,"props":1857,"children":1858},{"class":800,"line":27},[1859],{"type":40,"tag":798,"props":1860,"children":1861},{},[1862],{"type":46,"value":1863},"    client_ip INet6 NOT NULL,\n",{"type":40,"tag":798,"props":1865,"children":1866},{"class":800,"line":950},[1867],{"type":40,"tag":798,"props":1868,"children":1869},{},[1870],{"type":46,"value":1871},"    connected_at DATETIME NOT NULL,\n",{"type":40,"tag":798,"props":1873,"children":1874},{"class":800,"line":967},[1875],{"type":40,"tag":798,"props":1876,"children":1877},{},[1878],{"type":46,"value":1879},"    INDEX (client_ip)\n",{"type":40,"tag":798,"props":1881,"children":1882},{"class":800,"line":1328},[1883],{"type":40,"tag":798,"props":1884,"children":1885},{},[1886],{"type":46,"value":1887},");\n",{"type":40,"tag":798,"props":1889,"children":1890},{"class":800,"line":1338},[1891],{"type":40,"tag":798,"props":1892,"children":1893},{"emptyLinePlaceholder":1332},[1894],{"type":46,"value":1335},{"type":40,"tag":798,"props":1896,"children":1897},{"class":800,"line":1347},[1898],{"type":40,"tag":798,"props":1899,"children":1900},{},[1901],{"type":46,"value":1902},"INSERT INTO connections VALUES (INet6('192.168.1.1'), NOW());\n",{"type":40,"tag":798,"props":1904,"children":1905},{"class":800,"line":1356},[1906],{"type":40,"tag":798,"props":1907,"children":1908},{},[1909],{"type":46,"value":1910},"INSERT INTO connections VALUES (INet6('::1'), NOW());\n",{"type":40,"tag":798,"props":1912,"children":1913},{"class":800,"line":23},[1914],{"type":40,"tag":798,"props":1915,"children":1916},{"emptyLinePlaceholder":1332},[1917],{"type":46,"value":1335},{"type":40,"tag":798,"props":1919,"children":1920},{"class":800,"line":1372},[1921],{"type":40,"tag":798,"props":1922,"children":1923},{},[1924],{"type":46,"value":1925},"-- Range queries work correctly:\n",{"type":40,"tag":798,"props":1927,"children":1929},{"class":800,"line":1928},11,[1930],{"type":40,"tag":798,"props":1931,"children":1932},{},[1933],{"type":46,"value":1934},"SELECT * FROM connections WHERE client_ip BETWEEN INet6('10.0.0.0') AND INet6('10.255.255.255');\n",{"type":40,"tag":49,"props":1936,"children":1937},{},[1938,1939,1944,1946,1951],{"type":46,"value":1801},{"type":40,"tag":69,"props":1940,"children":1942},{"className":1941},[],[1943],{"type":46,"value":1831},{"type":46,"value":1945}," (10.10+) when you know a column is IPv4-only and want the smaller storage; ",{"type":40,"tag":69,"props":1947,"children":1949},{"className":1948},[],[1950],{"type":46,"value":1823},{"type":46,"value":1952}," is the right default for mixed or IPv6-capable workloads.",{"type":40,"tag":128,"props":1954,"children":1956},{"id":1955},"oracle-compatibility-mode",[1957],{"type":46,"value":1958},"Oracle Compatibility Mode",{"type":40,"tag":49,"props":1960,"children":1961},{},[1962,1964,1969],{"type":46,"value":1963},"Available since MariaDB 10.3. ",{"type":40,"tag":69,"props":1965,"children":1967},{"className":1966},[],[1968],{"type":46,"value":328},{"type":46,"value":1970}," enables PL\u002FSQL syntax, Oracle-compatible NULL handling, packages, and Oracle-style functions — useful when migrating from Oracle or supporting Oracle-experienced developers.",{"type":40,"tag":787,"props":1972,"children":1974},{"className":1258,"code":1973,"language":22,"meta":792,"style":792},"SET sql_mode=ORACLE;\n\n-- Oracle-style stored procedures, packages, and NULL semantics work here\n-- ROWNUM, SYSDATE, NVL(), DECODE() available\n-- Note: EMPTY_STRING_IS_NULL is NOT included — add it separately if needed: SET sql_mode='ORACLE,EMPTY_STRING_IS_NULL'\n",[1975],{"type":40,"tag":69,"props":1976,"children":1977},{"__ignoreMap":792},[1978,1986,1993,2001,2009],{"type":40,"tag":798,"props":1979,"children":1980},{"class":800,"line":801},[1981],{"type":40,"tag":798,"props":1982,"children":1983},{},[1984],{"type":46,"value":1985},"SET sql_mode=ORACLE;\n",{"type":40,"tag":798,"props":1987,"children":1988},{"class":800,"line":27},[1989],{"type":40,"tag":798,"props":1990,"children":1991},{"emptyLinePlaceholder":1332},[1992],{"type":46,"value":1335},{"type":40,"tag":798,"props":1994,"children":1995},{"class":800,"line":950},[1996],{"type":40,"tag":798,"props":1997,"children":1998},{},[1999],{"type":46,"value":2000},"-- Oracle-style stored procedures, packages, and NULL semantics work here\n",{"type":40,"tag":798,"props":2002,"children":2003},{"class":800,"line":967},[2004],{"type":40,"tag":798,"props":2005,"children":2006},{},[2007],{"type":46,"value":2008},"-- ROWNUM, SYSDATE, NVL(), DECODE() available\n",{"type":40,"tag":798,"props":2010,"children":2011},{"class":800,"line":1328},[2012],{"type":40,"tag":798,"props":2013,"children":2014},{},[2015],{"type":46,"value":2016},"-- Note: EMPTY_STRING_IS_NULL is NOT included — add it separately if needed: SET sql_mode='ORACLE,EMPTY_STRING_IS_NULL'\n",{"type":40,"tag":49,"props":2018,"children":2019},{},[2020],{"type":46,"value":2021},"Not a complete Oracle replacement, but significantly reduces migration friction.",{"type":40,"tag":128,"props":2023,"children":2025},{"id":2024},"flashback",[2026],{"type":46,"value":2027},"FLASHBACK",{"type":40,"tag":49,"props":2029,"children":2030},{},[2031,2033,2038],{"type":46,"value":2032},"Available since MariaDB 10.2. Roll back tables to a previous state using the binary log — without restoring a full backup. Flashback is implemented via the ",{"type":40,"tag":69,"props":2034,"children":2036},{"className":2035},[],[2037],{"type":46,"value":623},{"type":46,"value":2039}," utility, not a SQL statement:",{"type":40,"tag":787,"props":2041,"children":2043},{"className":789,"code":2042,"language":791,"meta":792,"style":792},"# Generate reverse SQL from the binary log and pipe it back to MariaDB:\nmariadb-binlog --flashback --start-datetime=\"2026-05-18 10:00:00\" \\\n  \u002Fvar\u002Flib\u002Fmysql\u002Fmysql-bin.000001 | mariadb\n# Path depends on datadir and log_bin settings; default is \u003Cdatadir>\u002Fmysql-bin\n",[2044],{"type":40,"tag":69,"props":2045,"children":2046},{"__ignoreMap":792},[2047,2055,2093,2110],{"type":40,"tag":798,"props":2048,"children":2049},{"class":800,"line":801},[2050],{"type":40,"tag":798,"props":2051,"children":2052},{"style":944},[2053],{"type":46,"value":2054},"# Generate reverse SQL from the binary log and pipe it back to MariaDB:\n",{"type":40,"tag":798,"props":2056,"children":2057},{"class":800,"line":27},[2058,2062,2067,2072,2078,2083,2087],{"type":40,"tag":798,"props":2059,"children":2060},{"style":805},[2061],{"type":46,"value":623},{"type":40,"tag":798,"props":2063,"children":2064},{"style":850},[2065],{"type":46,"value":2066}," --flashback",{"type":40,"tag":798,"props":2068,"children":2069},{"style":850},[2070],{"type":46,"value":2071}," --start-datetime=",{"type":40,"tag":798,"props":2073,"children":2075},{"style":2074},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[2076],{"type":46,"value":2077},"\"",{"type":40,"tag":798,"props":2079,"children":2080},{"style":850},[2081],{"type":46,"value":2082},"2026-05-18 10:00:00",{"type":40,"tag":798,"props":2084,"children":2085},{"style":2074},[2086],{"type":46,"value":2077},{"type":40,"tag":798,"props":2088,"children":2090},{"style":2089},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[2091],{"type":46,"value":2092}," \\\n",{"type":40,"tag":798,"props":2094,"children":2095},{"class":800,"line":950},[2096,2101,2106],{"type":40,"tag":798,"props":2097,"children":2098},{"style":850},[2099],{"type":46,"value":2100},"  \u002Fvar\u002Flib\u002Fmysql\u002Fmysql-bin.000001",{"type":40,"tag":798,"props":2102,"children":2103},{"style":2074},[2104],{"type":46,"value":2105}," |",{"type":40,"tag":798,"props":2107,"children":2108},{"style":805},[2109],{"type":46,"value":853},{"type":40,"tag":798,"props":2111,"children":2112},{"class":800,"line":967},[2113],{"type":40,"tag":798,"props":2114,"children":2115},{"style":944},[2116],{"type":46,"value":2117},"# Path depends on datadir and log_bin settings; default is \u003Cdatadir>\u002Fmysql-bin\n",{"type":40,"tag":49,"props":2119,"children":2120},{},[2121,2126],{"type":40,"tag":85,"props":2122,"children":2123},{},[2124],{"type":46,"value":2125},"Prerequisites",{"type":46,"value":2127}," — FLASHBACK reconstructs reverse events from row images, so it requires:",{"type":40,"tag":1066,"props":2129,"children":2130},{},[2131,2142],{"type":40,"tag":993,"props":2132,"children":2133},{},[2134,2140],{"type":40,"tag":69,"props":2135,"children":2137},{"className":2136},[],[2138],{"type":46,"value":2139},"binlog_format = ROW",{"type":46,"value":2141}," (statement-based logging does not capture before\u002Fafter row images)",{"type":40,"tag":993,"props":2143,"children":2144},{},[2145,2151],{"type":40,"tag":69,"props":2146,"children":2148},{"className":2147},[],[2149],{"type":46,"value":2150},"binlog_row_image = FULL",{"type":46,"value":2152}," (MINIMAL or NOBLOB modes omit column values needed for reversal)",{"type":40,"tag":49,"props":2154,"children":2155},{},[2156],{"type":46,"value":2157},"Verify before relying on FLASHBACK as a recovery path:",{"type":40,"tag":787,"props":2159,"children":2161},{"className":1258,"code":2160,"language":22,"meta":792,"style":792},"SHOW VARIABLES LIKE 'binlog_format';      -- must be ROW\nSHOW VARIABLES LIKE 'binlog_row_image';   -- must be FULL\n",[2162],{"type":40,"tag":69,"props":2163,"children":2164},{"__ignoreMap":792},[2165,2173],{"type":40,"tag":798,"props":2166,"children":2167},{"class":800,"line":801},[2168],{"type":40,"tag":798,"props":2169,"children":2170},{},[2171],{"type":46,"value":2172},"SHOW VARIABLES LIKE 'binlog_format';      -- must be ROW\n",{"type":40,"tag":798,"props":2174,"children":2175},{"class":800,"line":27},[2176],{"type":40,"tag":798,"props":2177,"children":2178},{},[2179],{"type":46,"value":2180},"SHOW VARIABLES LIKE 'binlog_row_image';   -- must be FULL\n",{"type":40,"tag":49,"props":2182,"children":2183},{},[2184,2186,2192],{"type":46,"value":2185},"Requires binary logging enabled (",{"type":40,"tag":69,"props":2187,"children":2189},{"className":2188},[],[2190],{"type":46,"value":2191},"log_bin",{"type":46,"value":2193},"). Useful for recovering from accidental deletes or bad migrations.",{"type":40,"tag":128,"props":2195,"children":2197},{"id":2196},"more-mariadb-features-through-118-lts",[2198],{"type":46,"value":2199},"More MariaDB Features (through 11.8 LTS)",{"type":40,"tag":49,"props":2201,"children":2202},{},[2203,2205,2211],{"type":46,"value":2204},"Additional capabilities on the current LTS baseline and supported older releases. See ",{"type":40,"tag":458,"props":2206,"children":2208},{"href":2207},"#newer-releases-12x--130",[2209],{"type":46,"value":2210},"Newer releases (12.x \u002F 13.0)",{"type":46,"value":2212}," for features that require a newer server.",{"type":40,"tag":1448,"props":2214,"children":2216},{"id":2215},"sql-schema",[2217],{"type":46,"value":2218},"SQL & Schema",{"type":40,"tag":1066,"props":2220,"children":2221},{},[2222,2240,2256,2272,2294,2310,2324,2376,2390,2408,2418,2432,2470,2597,2620,2649,2681,2705,2731,2745,2763,2796,2812,2848,2866],{"type":40,"tag":993,"props":2223,"children":2224},{},[2225,2230,2232,2238],{"type":40,"tag":85,"props":2226,"children":2227},{},[2228],{"type":46,"value":2229},"Invisible columns",{"type":46,"value":2231}," (10.3+) — hidden from ",{"type":40,"tag":69,"props":2233,"children":2235},{"className":2234},[],[2236],{"type":46,"value":2237},"SELECT *",{"type":46,"value":2239},", still writable; useful for schema evolution without breaking existing queries",{"type":40,"tag":993,"props":2241,"children":2242},{},[2243,2254],{"type":40,"tag":85,"props":2244,"children":2245},{},[2246,2252],{"type":40,"tag":69,"props":2247,"children":2249},{"className":2248},[],[2250],{"type":46,"value":2251},"DEFAULT",{"type":46,"value":2253}," expressions on BLOB\u002FTEXT",{"type":46,"value":2255}," — not supported in MySQL",{"type":40,"tag":993,"props":2257,"children":2258},{},[2259,2270],{"type":40,"tag":85,"props":2260,"children":2261},{},[2262,2268],{"type":40,"tag":69,"props":2263,"children":2265},{"className":2264},[],[2266],{"type":46,"value":2267},"DECIMAL",{"type":46,"value":2269}," precision to 38 digits",{"type":46,"value":2271}," — MySQL stops at 30",{"type":40,"tag":993,"props":2273,"children":2274},{},[2275,2292],{"type":40,"tag":85,"props":2276,"children":2277},{},[2278,2284,2286],{"type":40,"tag":69,"props":2279,"children":2281},{"className":2280},[],[2282],{"type":46,"value":2283},"INTERSECT",{"type":46,"value":2285}," and ",{"type":40,"tag":69,"props":2287,"children":2289},{"className":2288},[],[2290],{"type":46,"value":2291},"EXCEPT",{"type":46,"value":2293}," (10.3+) — set operators not available in MySQL",{"type":40,"tag":993,"props":2295,"children":2296},{},[2297,2308],{"type":40,"tag":85,"props":2298,"children":2299},{},[2300,2306],{"type":40,"tag":69,"props":2301,"children":2303},{"className":2302},[],[2304],{"type":46,"value":2305},"LIMIT",{"type":46,"value":2307}," in subqueries",{"type":46,"value":2309}," — supported; MySQL restricts this",{"type":40,"tag":993,"props":2311,"children":2312},{},[2313,2322],{"type":40,"tag":85,"props":2314,"children":2315},{},[2316],{"type":40,"tag":69,"props":2317,"children":2319},{"className":2318},[],[2320],{"type":46,"value":2321},"SELECT ... OFFSET ... FETCH",{"type":46,"value":2323}," (10.6+, MDEV-23908) — SQL-standard pagination syntax",{"type":40,"tag":993,"props":2325,"children":2326},{},[2327,2332,2334,2340,2341,2346,2347,2353,2354,2360,2361,2367,2369,2374],{"type":40,"tag":85,"props":2328,"children":2329},{},[2330],{"type":46,"value":2331},"Atomic DDL",{"type":46,"value":2333}," (10.6+, MDEV-23842) — ",{"type":40,"tag":69,"props":2335,"children":2337},{"className":2336},[],[2338],{"type":46,"value":2339},"CREATE TABLE",{"type":46,"value":105},{"type":40,"tag":69,"props":2342,"children":2344},{"className":2343},[],[2345],{"type":46,"value":309},{"type":46,"value":105},{"type":40,"tag":69,"props":2348,"children":2350},{"className":2349},[],[2351],{"type":46,"value":2352},"RENAME TABLE",{"type":46,"value":105},{"type":40,"tag":69,"props":2355,"children":2357},{"className":2356},[],[2358],{"type":46,"value":2359},"DROP TABLE",{"type":46,"value":105},{"type":40,"tag":69,"props":2362,"children":2364},{"className":2363},[],[2365],{"type":46,"value":2366},"DROP DATABASE",{"type":46,"value":2368}," are atomic on supported engines (InnoDB, Aria, MyRocks): a partial server crash mid-DDL leaves the schema in its pre-statement state, no manual cleanup needed. Multi-table ",{"type":40,"tag":69,"props":2370,"children":2372},{"className":2371},[],[2373],{"type":46,"value":2359},{"type":46,"value":2375}," is atomic per individual drop, not for the whole list.",{"type":40,"tag":993,"props":2377,"children":2378},{},[2379,2388],{"type":40,"tag":85,"props":2380,"children":2381},{},[2382],{"type":40,"tag":69,"props":2383,"children":2385},{"className":2384},[],[2386],{"type":46,"value":2387},"SELECT ... SKIP LOCKED",{"type":46,"value":2389}," (10.6+, MDEV-13115, InnoDB only) — work-queue pattern: workers grab the next available row and skip rows other transactions are processing, with no lock waits",{"type":40,"tag":993,"props":2391,"children":2392},{},[2393,2398,2400,2406],{"type":40,"tag":85,"props":2394,"children":2395},{},[2396],{"type":46,"value":2397},"Ignored Indexes",{"type":46,"value":2399}," (10.6+, MDEV-7317) — ",{"type":40,"tag":69,"props":2401,"children":2403},{"className":2402},[],[2404],{"type":46,"value":2405},"ALTER TABLE t ALTER INDEX idx IGNORED",{"type":46,"value":2407}," keeps the index updated but makes it invisible to the optimizer. Use this to test whether dropping an index would hurt performance before actually dropping it (zero-downtime rollback by re-enabling).",{"type":40,"tag":993,"props":2409,"children":2410},{},[2411,2416],{"type":40,"tag":85,"props":2412,"children":2413},{},[2414],{"type":46,"value":2415},"Dynamic columns",{"type":46,"value":2417}," (5.3+) — schema-less key\u002Fvalue storage inside a single column",{"type":40,"tag":993,"props":2419,"children":2420},{},[2421,2430],{"type":40,"tag":85,"props":2422,"children":2423},{},[2424],{"type":40,"tag":69,"props":2425,"children":2427},{"className":2426},[],[2428],{"type":46,"value":2429},"SFORMAT()",{"type":46,"value":2431}," (10.7+, MDEV-25015) — string formatting function with positional placeholders",{"type":40,"tag":993,"props":2433,"children":2434},{},[2435,2444,2446,2452,2454,2460,2462,2468],{"type":40,"tag":85,"props":2436,"children":2437},{},[2438],{"type":40,"tag":69,"props":2439,"children":2441},{"className":2440},[],[2442],{"type":46,"value":2443},"NATURAL_SORT_KEY()",{"type":46,"value":2445}," (10.7+, MDEV-4742) — produces a sort key that orders strings \"naturally\" (so ",{"type":40,"tag":69,"props":2447,"children":2449},{"className":2448},[],[2450],{"type":46,"value":2451},"v9",{"type":46,"value":2453}," sorts before ",{"type":40,"tag":69,"props":2455,"children":2457},{"className":2456},[],[2458],{"type":46,"value":2459},"v10",{"type":46,"value":2461},"); useful in ",{"type":40,"tag":69,"props":2463,"children":2465},{"className":2464},[],[2466],{"type":46,"value":2467},"ORDER BY",{"type":46,"value":2469}," for version-like or mixed-alphanumeric data",{"type":40,"tag":993,"props":2471,"children":2472},{},[2473,2478,2480],{"type":40,"tag":85,"props":2474,"children":2475},{},[2476],{"type":46,"value":2477},"JSON enhancements",{"type":46,"value":2479}," — MariaDB has been catching up to MySQL 8 JSON functions over several releases:\n",{"type":40,"tag":1066,"props":2481,"children":2482},{},[2483,2501,2512,2540,2559],{"type":40,"tag":993,"props":2484,"children":2485},{},[2486,2492,2493,2499],{"type":40,"tag":69,"props":2487,"children":2489},{"className":2488},[],[2490],{"type":46,"value":2491},"JSON_EQUALS(a, b)",{"type":46,"value":276},{"type":40,"tag":69,"props":2494,"children":2496},{"className":2495},[],[2497],{"type":46,"value":2498},"JSON_NORMALIZE(doc)",{"type":46,"value":2500}," (10.7+, MDEV-23143 \u002F MDEV-16375) — semantic equality and canonical form for hashing or unique indexing",{"type":40,"tag":993,"props":2502,"children":2503},{},[2504,2510],{"type":40,"tag":69,"props":2505,"children":2507},{"className":2506},[],[2508],{"type":46,"value":2509},"JSON_OVERLAPS(a, b)",{"type":46,"value":2511}," (10.9+, MDEV-27677) — detect shared key\u002Fvalue or array elements between two documents",{"type":40,"tag":993,"props":2513,"children":2514},{},[2515,2517,2523,2524,2530,2532,2538],{"type":46,"value":2516},"JSON path syntax supports negative indices (",{"type":40,"tag":69,"props":2518,"children":2520},{"className":2519},[],[2521],{"type":46,"value":2522},"$.A[-1]",{"type":46,"value":105},{"type":40,"tag":69,"props":2525,"children":2527},{"className":2526},[],[2528],{"type":46,"value":2529},"$.A[last]",{"type":46,"value":2531},") and ranges (",{"type":40,"tag":69,"props":2533,"children":2535},{"className":2534},[],[2536],{"type":46,"value":2537},"$.A[1 to 3]",{"type":46,"value":2539},") (10.9+, MDEV-22224 \u002F MDEV-27911)",{"type":40,"tag":993,"props":2541,"children":2542},{},[2543,2549,2551,2557],{"type":40,"tag":69,"props":2544,"children":2546},{"className":2545},[],[2547],{"type":46,"value":2548},"JSON_SCHEMA_VALID(schema, doc)",{"type":46,"value":2550}," (11.4+) — validate JSON against a JSON Schema Draft 2020 schema, usable inside ",{"type":40,"tag":69,"props":2552,"children":2554},{"className":2553},[],[2555],{"type":46,"value":2556},"CHECK",{"type":46,"value":2558}," constraints",{"type":40,"tag":993,"props":2560,"children":2561},{},[2562,2568,2569,2575,2576,2582,2583,2589,2591],{"type":40,"tag":69,"props":2563,"children":2565},{"className":2564},[],[2566],{"type":46,"value":2567},"JSON_KEY_VALUE",{"type":46,"value":105},{"type":40,"tag":69,"props":2570,"children":2572},{"className":2571},[],[2573],{"type":46,"value":2574},"JSON_ARRAY_INTERSECT",{"type":46,"value":105},{"type":40,"tag":69,"props":2577,"children":2579},{"className":2578},[],[2580],{"type":46,"value":2581},"JSON_OBJECT_TO_ARRAY",{"type":46,"value":105},{"type":40,"tag":69,"props":2584,"children":2586},{"className":2585},[],[2587],{"type":46,"value":2588},"JSON_OBJECT_FILTER_KEYS",{"type":46,"value":2590}," (11.4+) — structural manipulation primitives that compose well with ",{"type":40,"tag":69,"props":2592,"children":2594},{"className":2593},[],[2595],{"type":46,"value":2596},"JSON_TABLE",{"type":40,"tag":993,"props":2598,"children":2599},{},[2600,2618],{"type":40,"tag":85,"props":2601,"children":2602},{},[2603,2609,2610,2616],{"type":40,"tag":69,"props":2604,"children":2606},{"className":2605},[],[2607],{"type":46,"value":2608},"UUID_v4()",{"type":46,"value":2285},{"type":40,"tag":69,"props":2611,"children":2613},{"className":2612},[],[2614],{"type":46,"value":2615},"UUID_v7()",{"type":46,"value":2617}," functions",{"type":46,"value":2619}," (11.7+) — generate version-4 random or version-7 time-ordered UUIDs; the v7 form is sortable and ideal for primary keys",{"type":40,"tag":993,"props":2621,"children":2622},{},[2623,2632,2634,2640,2641,2647],{"type":40,"tag":85,"props":2624,"children":2625},{},[2626],{"type":40,"tag":69,"props":2627,"children":2629},{"className":2628},[],[2630],{"type":46,"value":2631},"FORMAT_BYTES()",{"type":46,"value":2633}," (11.8+) — convert a byte count to a human-readable string (e.g. ",{"type":40,"tag":69,"props":2635,"children":2637},{"className":2636},[],[2638],{"type":46,"value":2639},"1234567",{"type":46,"value":1084},{"type":40,"tag":69,"props":2642,"children":2644},{"className":2643},[],[2645],{"type":46,"value":2646},"1.18 MiB",{"type":46,"value":2648},")",{"type":40,"tag":993,"props":2650,"children":2651},{},[2652,2663,2665,2671,2673,2679],{"type":40,"tag":85,"props":2653,"children":2654},{},[2655,2661],{"type":40,"tag":69,"props":2656,"children":2658},{"className":2657},[],[2659],{"type":46,"value":2660},"CONV()",{"type":46,"value":2662}," extended to base 62",{"type":46,"value":2664}," (11.4+, MDEV-30190) — ",{"type":40,"tag":69,"props":2666,"children":2668},{"className":2667},[],[2669],{"type":46,"value":2670},"CONV(61,10,62)",{"type":46,"value":2672}," returns ",{"type":40,"tag":69,"props":2674,"children":2676},{"className":2675},[],[2677],{"type":46,"value":2678},"z",{"type":46,"value":2680},"; useful for short opaque IDs",{"type":40,"tag":993,"props":2682,"children":2683},{},[2684,2703],{"type":40,"tag":85,"props":2685,"children":2686},{},[2687,2693,2695,2701],{"type":40,"tag":69,"props":2688,"children":2690},{"className":2689},[],[2691],{"type":46,"value":2692},"CRC32C()",{"type":46,"value":2694}," function and ",{"type":40,"tag":69,"props":2696,"children":2698},{"className":2697},[],[2699],{"type":46,"value":2700},"CRC32()",{"type":46,"value":2702}," with optional initial-value argument",{"type":46,"value":2704}," (10.8+, MDEV-27208) — Castagnoli polynomial CRC, and seedable CRC32 for chained checksums",{"type":40,"tag":993,"props":2706,"children":2707},{},[2708,2721,2723,2729],{"type":40,"tag":85,"props":2709,"children":2710},{},[2711,2713,2719],{"type":46,"value":2712},"Single-table ",{"type":40,"tag":69,"props":2714,"children":2716},{"className":2715},[],[2717],{"type":46,"value":2718},"DELETE",{"type":46,"value":2720}," with table aliases",{"type":46,"value":2722}," (11.6+) — ",{"type":40,"tag":69,"props":2724,"children":2726},{"className":2725},[],[2727],{"type":46,"value":2728},"DELETE t FROM mytable t WHERE ...",{"type":46,"value":2730}," syntax now works without rewriting",{"type":40,"tag":993,"props":2732,"children":2733},{},[2734,2743],{"type":40,"tag":85,"props":2735,"children":2736},{},[2737],{"type":40,"tag":69,"props":2738,"children":2740},{"className":2739},[],[2741],{"type":46,"value":2742},"REPAIR TABLE ... FORCE",{"type":46,"value":2744}," (11.5+) — force-repair even when the table appears clean",{"type":40,"tag":993,"props":2746,"children":2747},{},[2748,2753,2755,2761],{"type":40,"tag":85,"props":2749,"children":2750},{},[2751],{"type":46,"value":2752},"Stored routine parameter default values",{"type":46,"value":2754}," (11.8+, MDEV-10862) — ",{"type":40,"tag":69,"props":2756,"children":2758},{"className":2757},[],[2759],{"type":46,"value":2760},"PROCEDURE p(a INT DEFAULT 0, b INT DEFAULT 0)",{"type":46,"value":2762}," — call with fewer arguments",{"type":40,"tag":993,"props":2764,"children":2765},{},[2766,2794],{"type":40,"tag":85,"props":2767,"children":2768},{},[2769,2771,2777,2779,2785,2786,2792],{"type":46,"value":2770},"Stored function ",{"type":40,"tag":69,"props":2772,"children":2774},{"className":2773},[],[2775],{"type":46,"value":2776},"IN",{"type":46,"value":2778},"\u002F",{"type":40,"tag":69,"props":2780,"children":2782},{"className":2781},[],[2783],{"type":46,"value":2784},"OUT",{"type":46,"value":2778},{"type":40,"tag":69,"props":2787,"children":2789},{"className":2788},[],[2790],{"type":46,"value":2791},"INOUT",{"type":46,"value":2793}," parameter qualifiers",{"type":46,"value":2795}," (10.8+, MDEV-10654) — bring stored functions in line with stored procedure parameter modes",{"type":40,"tag":993,"props":2797,"children":2798},{},[2799,2810],{"type":40,"tag":85,"props":2800,"children":2801},{},[2802,2808],{"type":40,"tag":69,"props":2803,"children":2805},{"className":2804},[],[2806],{"type":46,"value":2807},"ROW",{"type":46,"value":2809}," data type as stored function return value",{"type":46,"value":2811}," (11.7+, MDEV-12252) — return structured rows from stored functions",{"type":40,"tag":993,"props":2813,"children":2814},{},[2815,2833,2835,2841,2843],{"type":40,"tag":85,"props":2816,"children":2817},{},[2818,2824,2825,2831],{"type":40,"tag":69,"props":2819,"children":2821},{"className":2820},[],[2822],{"type":46,"value":2823},"CREATE PACKAGE",{"type":46,"value":276},{"type":40,"tag":69,"props":2826,"children":2828},{"className":2827},[],[2829],{"type":46,"value":2830},"CREATE PACKAGE BODY",{"type":46,"value":2832}," outside Oracle mode",{"type":46,"value":2834}," (11.4+, MDEV-10075) — package routines work under the default ",{"type":40,"tag":69,"props":2836,"children":2838},{"className":2837},[],[2839],{"type":46,"value":2840},"sql_mode",{"type":46,"value":2842}," too, not only with ",{"type":40,"tag":69,"props":2844,"children":2846},{"className":2845},[],[2847],{"type":46,"value":328},{"type":40,"tag":993,"props":2849,"children":2850},{},[2851,2856,2858,2864],{"type":40,"tag":85,"props":2852,"children":2853},{},[2854],{"type":46,"value":2855},"Update triggers with column list",{"type":46,"value":2857}," (11.8+, MDEV-34551) — ",{"type":40,"tag":69,"props":2859,"children":2861},{"className":2860},[],[2862],{"type":46,"value":2863},"CREATE TRIGGER ... BEFORE UPDATE OF col1, col2 ON t",{"type":46,"value":2865}," — fire only when those columns are updated",{"type":40,"tag":993,"props":2867,"children":2868},{},[2869,2874,2876,2882,2883,2889,2890,2896,2897,2903,2905],{"type":40,"tag":85,"props":2870,"children":2871},{},[2872],{"type":46,"value":2873},"Stored procedures and functions",{"type":46,"value":2875}," — MariaDB uses SQL\u002FPSM syntax (",{"type":40,"tag":69,"props":2877,"children":2879},{"className":2878},[],[2880],{"type":46,"value":2881},"DECLARE",{"type":46,"value":105},{"type":40,"tag":69,"props":2884,"children":2886},{"className":2885},[],[2887],{"type":46,"value":2888},"HANDLER",{"type":46,"value":105},{"type":40,"tag":69,"props":2891,"children":2893},{"className":2892},[],[2894],{"type":46,"value":2895},"CURSOR",{"type":46,"value":105},{"type":40,"tag":69,"props":2898,"children":2900},{"className":2899},[],[2901],{"type":46,"value":2902},"BEGIN...END",{"type":46,"value":2904},"); AI agents often generate incorrect syntax — see ",{"type":40,"tag":458,"props":2906,"children":2909},{"href":2907,"rel":2908},"https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Fserver-usage\u002Fstored-routines\u002Fstored-procedures",[462],[2910],{"type":46,"value":2911},"Stored Procedures — MariaDB Docs",{"type":40,"tag":1448,"props":2913,"children":2915},{"id":2914},"storage-engines",[2916],{"type":46,"value":2917},"Storage Engines",{"type":40,"tag":1066,"props":2919,"children":2920},{},[2921,2931,2941,2951,2961],{"type":40,"tag":993,"props":2922,"children":2923},{},[2924,2929],{"type":40,"tag":85,"props":2925,"children":2926},{},[2927],{"type":46,"value":2928},"ColumnStore",{"type":46,"value":2930}," — columnar engine for analytical\u002Fdata warehouse workloads",{"type":40,"tag":993,"props":2932,"children":2933},{},[2934,2939],{"type":40,"tag":85,"props":2935,"children":2936},{},[2937],{"type":46,"value":2938},"Aria",{"type":46,"value":2940}," — crash-safe MyISAM replacement, used internally for temp tables",{"type":40,"tag":993,"props":2942,"children":2943},{},[2944,2949],{"type":40,"tag":85,"props":2945,"children":2946},{},[2947],{"type":46,"value":2948},"MyRocks",{"type":46,"value":2950}," (10.2+) — RocksDB-based, optimized for write-heavy workloads with compression",{"type":40,"tag":993,"props":2952,"children":2953},{},[2954,2959],{"type":40,"tag":85,"props":2955,"children":2956},{},[2957],{"type":46,"value":2958},"CONNECT",{"type":46,"value":2960}," — query external data sources (CSV, JDBC, ODBC, MongoDB) as SQL tables",{"type":40,"tag":993,"props":2962,"children":2963},{},[2964,2969],{"type":40,"tag":85,"props":2965,"children":2966},{},[2967],{"type":46,"value":2968},"Spider",{"type":46,"value":2970}," — sharding across multiple MariaDB instances",{"type":40,"tag":1448,"props":2972,"children":2974},{"id":2973},"security-auth",[2975],{"type":46,"value":2976},"Security & Auth",{"type":40,"tag":1066,"props":2978,"children":2979},{},[2980,3003,3013,3023,3045,3065,3094,3126,3136,3161,3213,3244,3258,3301,3311],{"type":40,"tag":993,"props":2981,"children":2982},{},[2983,2993,2995,3001],{"type":40,"tag":85,"props":2984,"children":2985},{},[2986,2991],{"type":40,"tag":69,"props":2987,"children":2989},{"className":2988},[],[2990],{"type":46,"value":830},{"type":46,"value":2992}," authentication",{"type":46,"value":2994}," — authenticate OS users without passwords; ",{"type":40,"tag":69,"props":2996,"children":2998},{"className":2997},[],[2999],{"type":46,"value":3000},"authentication_string",{"type":46,"value":3002}," support added in 11.6+ for finer-grained mapping",{"type":40,"tag":993,"props":3004,"children":3005},{},[3006,3011],{"type":40,"tag":85,"props":3007,"children":3008},{},[3009],{"type":46,"value":3010},"ED25519 plugin",{"type":46,"value":3012}," — modern authentication alternative to SHA1-based plugins",{"type":40,"tag":993,"props":3014,"children":3015},{},[3016,3021],{"type":40,"tag":85,"props":3017,"children":3018},{},[3019],{"type":46,"value":3020},"PARSEC plugin",{"type":46,"value":3022}," (11.6+, MDEV-32618) — Password Authentication using Response Signed with Elliptic Curve; salt and per-installation key separation make stolen hashes unusable elsewhere",{"type":40,"tag":993,"props":3024,"children":3025},{},[3026,3037,3039],{"type":40,"tag":85,"props":3027,"children":3028},{},[3029,3035],{"type":40,"tag":69,"props":3030,"children":3032},{"className":3031},[],[3033],{"type":46,"value":3034},"password_reuse_check",{"type":46,"value":3036}," plugin",{"type":46,"value":3038}," (10.7+, MDEV-9245) — prevent password reuse for a configurable number of days via ",{"type":40,"tag":69,"props":3040,"children":3042},{"className":3041},[],[3043],{"type":46,"value":3044},"password_reuse_check_interval",{"type":40,"tag":993,"props":3046,"children":3047},{},[3048,3057,3059],{"type":40,"tag":85,"props":3049,"children":3050},{},[3051],{"type":40,"tag":69,"props":3052,"children":3054},{"className":3053},[],[3055],{"type":46,"value":3056},"GRANT ... TO PUBLIC",{"type":46,"value":3058}," (10.11+, MDEV-5215) — grant privileges to all users in one statement; pair with ",{"type":40,"tag":69,"props":3060,"children":3062},{"className":3061},[],[3063],{"type":46,"value":3064},"SHOW GRANTS FOR PUBLIC",{"type":40,"tag":993,"props":3066,"children":3067},{},[3068,3079,3081,3086,3088],{"type":40,"tag":85,"props":3069,"children":3070},{},[3071,3077],{"type":40,"tag":69,"props":3072,"children":3074},{"className":3073},[],[3075],{"type":46,"value":3076},"SHOW CREATE ROUTINE",{"type":46,"value":3078}," privilege",{"type":46,"value":3080}," (11.4+, MDEV-23149) — let users inspect a routine's definition without granting ",{"type":40,"tag":69,"props":3082,"children":3084},{"className":3083},[],[3085],{"type":46,"value":1537},{"type":46,"value":3087}," on ",{"type":40,"tag":69,"props":3089,"children":3091},{"className":3090},[],[3092],{"type":46,"value":3093},"mysql.proc",{"type":40,"tag":993,"props":3095,"children":3096},{},[3097,3108,3110,3116,3118,3124],{"type":40,"tag":85,"props":3098,"children":3099},{},[3100,3106],{"type":40,"tag":69,"props":3101,"children":3103},{"className":3102},[],[3104],{"type":46,"value":3105},"READ ONLY ADMIN",{"type":46,"value":3107}," is now a distinct privilege",{"type":46,"value":3109}," (10.11+, MDEV-29596) — split out of ",{"type":40,"tag":69,"props":3111,"children":3113},{"className":3112},[],[3114],{"type":46,"value":3115},"SUPER",{"type":46,"value":3117}," so a true read-only replica role can be granted; existing accounts that need to write to a ",{"type":40,"tag":69,"props":3119,"children":3121},{"className":3120},[],[3122],{"type":46,"value":3123},"read_only=1",{"type":46,"value":3125}," replica need this privilege granted explicitly",{"type":40,"tag":993,"props":3127,"children":3128},{},[3129,3134],{"type":40,"tag":85,"props":3130,"children":3131},{},[3132],{"type":46,"value":3133},"Role-based access control",{"type":46,"value":3135}," (10.0+) — roles available before MySQL added them",{"type":40,"tag":993,"props":3137,"children":3138},{},[3139,3144,3146,3151,3153,3159],{"type":40,"tag":85,"props":3140,"children":3141},{},[3142],{"type":46,"value":3143},"SSL by default",{"type":46,"value":3145}," — the ",{"type":40,"tag":69,"props":3147,"children":3149},{"className":3148},[],[3150],{"type":46,"value":8},{"type":46,"value":3152}," client opts into SSL by default since 10.10 (MDEV-27105). The server side requires SSL by default since 11.4 LTS, with auto-generated self-signed certificates and automatic client-side verification (",{"type":40,"tag":69,"props":3154,"children":3156},{"className":3155},[],[3157],{"type":46,"value":3158},"tls_fp",{"type":46,"value":3160}," for fingerprint-pinning).",{"type":40,"tag":993,"props":3162,"children":3163},{},[3164,3195,3197,3203,3205,3211],{"type":40,"tag":85,"props":3165,"children":3166},{},[3167,3173,3174,3180,3182,3188,3189],{"type":40,"tag":69,"props":3168,"children":3170},{"className":3169},[],[3171],{"type":46,"value":3172},"AES_ENCRYPT()",{"type":46,"value":276},{"type":40,"tag":69,"props":3175,"children":3177},{"className":3176},[],[3178],{"type":46,"value":3179},"AES_DECRYPT()",{"type":46,"value":3181}," with ",{"type":40,"tag":69,"props":3183,"children":3185},{"className":3184},[],[3186],{"type":46,"value":3187},"iv",{"type":46,"value":2285},{"type":40,"tag":69,"props":3190,"children":3192},{"className":3191},[],[3193],{"type":46,"value":3194},"mode",{"type":46,"value":3196}," (11.4+, MDEV-30878) — ",{"type":40,"tag":69,"props":3198,"children":3200},{"className":3199},[],[3201],{"type":46,"value":3202},"AES_ENCRYPT(str, key, iv, mode)",{"type":46,"value":3204},"; supported modes include CBC, OFB, CFB128, CTR (default mode comes from the new ",{"type":40,"tag":69,"props":3206,"children":3208},{"className":3207},[],[3209],{"type":46,"value":3210},"block_encryption_mode",{"type":46,"value":3212}," variable). Brings parity with MySQL's encryption interface.",{"type":40,"tag":993,"props":3214,"children":3215},{},[3216,3227,3229,3235,3237,3243],{"type":40,"tag":85,"props":3217,"children":3218},{},[3219,3225],{"type":40,"tag":69,"props":3220,"children":3222},{"className":3221},[],[3223],{"type":46,"value":3224},"KDF()",{"type":46,"value":3226}," key-derivation function",{"type":46,"value":3228}," (11.4+, MDEV-31474) — derive an encryption key from a passphrase using PBKDF2-HMAC or HKDF — ",{"type":40,"tag":69,"props":3230,"children":3232},{"className":3231},[],[3233],{"type":46,"value":3234},"AES_ENCRYPT(data, KDF('passw0rd', 'salt', 'info', 'hkdf'), iv)",{"type":46,"value":3236},". Use this rather than feeding a raw password into ",{"type":40,"tag":69,"props":3238,"children":3240},{"className":3239},[],[3241],{"type":46,"value":3242},"AES_ENCRYPT",{"type":46,"value":1053},{"type":40,"tag":993,"props":3245,"children":3246},{},[3247,3256],{"type":40,"tag":85,"props":3248,"children":3249},{},[3250],{"type":40,"tag":69,"props":3251,"children":3253},{"className":3252},[],[3254],{"type":46,"value":3255},"RANDOM_BYTES(n)",{"type":46,"value":3257}," (10.10+, MDEV-25704) — cryptographically secure random bytes (1–1024) from the SSL library's RNG",{"type":40,"tag":993,"props":3259,"children":3260},{},[3261,3279,3281,3286,3287,3293,3294,3299],{"type":40,"tag":85,"props":3262,"children":3263},{},[3264,3270,3271,3277],{"type":40,"tag":69,"props":3265,"children":3267},{"className":3266},[],[3268],{"type":46,"value":3269},"DES_ENCRYPT()",{"type":46,"value":276},{"type":40,"tag":69,"props":3272,"children":3274},{"className":3273},[],[3275],{"type":46,"value":3276},"DES_DECRYPT()",{"type":46,"value":3278}," deprecated",{"type":46,"value":3280}," (10.10+, MDEV-27104) — old DES cipher; use ",{"type":40,"tag":69,"props":3282,"children":3284},{"className":3283},[],[3285],{"type":46,"value":3242},{"type":46,"value":276},{"type":40,"tag":69,"props":3288,"children":3290},{"className":3289},[],[3291],{"type":46,"value":3292},"AES_DECRYPT",{"type":46,"value":3181},{"type":40,"tag":69,"props":3295,"children":3297},{"className":3296},[],[3298],{"type":46,"value":3224},{"type":46,"value":3300}," instead",{"type":40,"tag":993,"props":3302,"children":3303},{},[3304,3309],{"type":40,"tag":85,"props":3305,"children":3306},{},[3307],{"type":46,"value":3308},"Table-level encryption",{"type":46,"value":3310}," — encrypt individual tables, not just the whole datadir",{"type":40,"tag":993,"props":3312,"children":3313},{},[3314,3319],{"type":40,"tag":85,"props":3315,"children":3316},{},[3317],{"type":46,"value":3318},"HashiCorp Vault integration",{"type":46,"value":3320}," — key management plugin",{"type":40,"tag":1448,"props":3322,"children":3324},{"id":3323},"replication-ha",[3325],{"type":46,"value":3326},"Replication & HA",{"type":40,"tag":1066,"props":3328,"children":3329},{},[3330,3340,3350,3360],{"type":40,"tag":993,"props":3331,"children":3332},{},[3333,3338],{"type":40,"tag":85,"props":3334,"children":3335},{},[3336],{"type":46,"value":3337},"Galera Cluster",{"type":46,"value":3339}," — built-in synchronous multi-master clustering",{"type":40,"tag":993,"props":3341,"children":3342},{},[3343,3348],{"type":40,"tag":85,"props":3344,"children":3345},{},[3346],{"type":46,"value":3347},"Multi-source replication",{"type":46,"value":3349}," — replicate from multiple primaries simultaneously",{"type":40,"tag":993,"props":3351,"children":3352},{},[3353,3358],{"type":40,"tag":85,"props":3354,"children":3355},{},[3356],{"type":46,"value":3357},"Parallel replication",{"type":46,"value":3359}," — faster replica apply",{"type":40,"tag":993,"props":3361,"children":3362},{},[3363,3375],{"type":40,"tag":85,"props":3364,"children":3365},{},[3366,3368,3373],{"type":46,"value":3367},"Lag-free ",{"type":40,"tag":69,"props":3369,"children":3371},{"className":3370},[],[3372],{"type":46,"value":309},{"type":46,"value":3374}," replication",{"type":46,"value":3376}," — schema changes don't stall replicas",{"type":40,"tag":1448,"props":3378,"children":3380},{"id":3379},"connectors",[3381],{"type":46,"value":3382},"Connectors",{"type":40,"tag":1066,"props":3384,"children":3385},{},[3386],{"type":40,"tag":993,"props":3387,"children":3388},{},[3389,3394],{"type":40,"tag":85,"props":3390,"children":3391},{},[3392],{"type":46,"value":3393},"LGPL-licensed connectors",{"type":46,"value":3395}," for C, C++, Java, Python, Node.js, ODBC, R2DBC — permissive licensing for commercial applications; MySQL connectors are GPL",{"type":40,"tag":1448,"props":3397,"children":3399},{"id":3398},"developer-tools",[3400],{"type":46,"value":3401},"Developer Tools",{"type":40,"tag":1066,"props":3403,"children":3404},{},[3405,3421,3443,3563],{"type":40,"tag":993,"props":3406,"children":3407},{},[3408,3419],{"type":40,"tag":85,"props":3409,"children":3410},{},[3411,3417],{"type":40,"tag":69,"props":3412,"children":3414},{"className":3413},[],[3415],{"type":46,"value":3416},"EXPLAIN",{"type":46,"value":3418}," in slow query log",{"type":46,"value":3420}," — automatic execution plan logging for slow queries",{"type":40,"tag":993,"props":3422,"children":3423},{},[3424,3429,3431,3436,3437],{"type":40,"tag":85,"props":3425,"children":3426},{},[3427],{"type":46,"value":3428},"Progress reporting",{"type":46,"value":3430}," for ",{"type":40,"tag":69,"props":3432,"children":3434},{"className":3433},[],[3435],{"type":46,"value":309},{"type":46,"value":2285},{"type":40,"tag":69,"props":3438,"children":3440},{"className":3439},[],[3441],{"type":46,"value":3442},"CHECK TABLE",{"type":40,"tag":993,"props":3444,"children":3445},{},[3446,3455,3457,3463,3465,3470,3471,3477,3479,3530,3532,3538,3540,3546,3548,3554,3556,3561],{"type":40,"tag":85,"props":3447,"children":3448},{},[3449],{"type":40,"tag":69,"props":3450,"children":3452},{"className":3451},[],[3453],{"type":46,"value":3454},"mariadb-backup",{"type":46,"value":3456}," (10.1+) — hot backup with backup locks (no ",{"type":40,"tag":69,"props":3458,"children":3460},{"className":3459},[],[3461],{"type":46,"value":3462},"FLUSH TABLES WITH READ LOCK",{"type":46,"value":3464},"). A backup requires ",{"type":40,"tag":85,"props":3466,"children":3467},{},[3468],{"type":46,"value":3469},"two steps",{"type":46,"value":3145},{"type":40,"tag":69,"props":3472,"children":3474},{"className":3473},[],[3475],{"type":46,"value":3476},"--prepare",{"type":46,"value":3478}," step is mandatory before restore:\n",{"type":40,"tag":787,"props":3480,"children":3482},{"className":789,"code":3481,"language":791,"meta":792,"style":792},"mariadb-backup --backup --user=root --target-dir=\u002Fbackup\u002Ffull\nmariadb-backup --prepare --target-dir=\u002Fbackup\u002Ffull   # apply redo logs — without this, the backup cannot be restored\n",[3483],{"type":40,"tag":69,"props":3484,"children":3485},{"__ignoreMap":792},[3486,3508],{"type":40,"tag":798,"props":3487,"children":3488},{"class":800,"line":801},[3489,3493,3498,3503],{"type":40,"tag":798,"props":3490,"children":3491},{"style":805},[3492],{"type":46,"value":3454},{"type":40,"tag":798,"props":3494,"children":3495},{"style":850},[3496],{"type":46,"value":3497}," --backup",{"type":40,"tag":798,"props":3499,"children":3500},{"style":850},[3501],{"type":46,"value":3502}," --user=root",{"type":40,"tag":798,"props":3504,"children":3505},{"style":850},[3506],{"type":46,"value":3507}," --target-dir=\u002Fbackup\u002Ffull\n",{"type":40,"tag":798,"props":3509,"children":3510},{"class":800,"line":27},[3511,3515,3520,3525],{"type":40,"tag":798,"props":3512,"children":3513},{"style":805},[3514],{"type":46,"value":3454},{"type":40,"tag":798,"props":3516,"children":3517},{"style":850},[3518],{"type":46,"value":3519}," --prepare",{"type":40,"tag":798,"props":3521,"children":3522},{"style":850},[3523],{"type":46,"value":3524}," --target-dir=\u002Fbackup\u002Ffull",{"type":40,"tag":798,"props":3526,"children":3527},{"style":944},[3528],{"type":46,"value":3529},"   # apply redo logs — without this, the backup cannot be restored\n",{"type":46,"value":3531},"\nFor Galera clusters, add ",{"type":40,"tag":69,"props":3533,"children":3535},{"className":3534},[],[3536],{"type":46,"value":3537},"--galera-info",{"type":46,"value":3539}," to capture the wsrep state for clean cluster rejoin. Do not use ",{"type":40,"tag":69,"props":3541,"children":3543},{"className":3542},[],[3544],{"type":46,"value":3545},"innobackupex",{"type":46,"value":3547}," or ",{"type":40,"tag":69,"props":3549,"children":3551},{"className":3550},[],[3552],{"type":46,"value":3553},"xtrabackup",{"type":46,"value":3555}," — ",{"type":40,"tag":69,"props":3557,"children":3559},{"className":3558},[],[3560],{"type":46,"value":3454},{"type":46,"value":3562}," is the correct tool for MariaDB (included since 10.1, replacing the Percona dependency).",{"type":40,"tag":993,"props":3564,"children":3565},{},[3566,3571],{"type":40,"tag":85,"props":3567,"children":3568},{},[3569],{"type":46,"value":3570},"Non-blocking client API",{"type":46,"value":3572}," — async queries without threads",{"type":40,"tag":128,"props":3574,"children":3576},{"id":3575},"newer-releases-12x-130",[3577],{"type":46,"value":2210},{"type":40,"tag":49,"props":3579,"children":3580},{},[3581,3583,3588,3590,3595,3597,3604],{"type":46,"value":3582},"These require MariaDB ",{"type":40,"tag":85,"props":3584,"children":3585},{},[3586],{"type":46,"value":3587},"12.0 or newer",{"type":46,"value":3589}," (many ship with ",{"type":40,"tag":85,"props":3591,"children":3592},{},[3593],{"type":46,"value":3594},"12.3 LTS",{"type":46,"value":3596},", currently RC — check ",{"type":40,"tag":458,"props":3598,"children":3601},{"href":3599,"rel":3600},"https:\u002F\u002Fmariadb.org\u002Fmariadb\u002Fall-releases\u002F",[462],[3602],{"type":46,"value":3603},"MariaDB releases",{"type":46,"value":3605}," for GA status). Suggest them when they solve the user's problem or as a deliberate upgrade path; always name the minimum version.",{"type":40,"tag":1448,"props":3607,"children":3609},{"id":3608},"sql-schema-1",[3610],{"type":46,"value":2218},{"type":40,"tag":1066,"props":3612,"children":3613},{},[3614,3632,3642,3652,3682,3704,3722,3738],{"type":40,"tag":993,"props":3615,"children":3616},{},[3617,3622,3624,3630],{"type":40,"tag":85,"props":3618,"children":3619},{},[3620],{"type":46,"value":3621},"Triggers fired on multiple events",{"type":46,"value":3623}," (12.0+) — one trigger body for ",{"type":40,"tag":69,"props":3625,"children":3627},{"className":3626},[],[3628],{"type":46,"value":3629},"INSERT OR UPDATE OR DELETE",{"type":46,"value":3631},", instead of three separate triggers",{"type":40,"tag":993,"props":3633,"children":3634},{},[3635,3640],{"type":40,"tag":85,"props":3636,"children":3637},{},[3638],{"type":46,"value":3639},"Foreign key names per table",{"type":46,"value":3641}," (12.1+) — FK names need to be unique only per table, not per database (MySQL-compatible behavior)",{"type":40,"tag":993,"props":3643,"children":3644},{},[3645,3650],{"type":40,"tag":85,"props":3646,"children":3647},{},[3648],{"type":46,"value":3649},"JSON depth limit removed",{"type":46,"value":3651}," (12.2+) — the 32-level nesting limit on JSON functions is gone; deeply nested JSON now works without rewrites",{"type":40,"tag":993,"props":3653,"children":3654},{},[3655,3672,3674,3680],{"type":40,"tag":85,"props":3656,"children":3657},{},[3658,3664,3665,3670],{"type":40,"tag":69,"props":3659,"children":3661},{"className":3660},[],[3662],{"type":46,"value":3663},"UPDATE",{"type":46,"value":276},{"type":40,"tag":69,"props":3666,"children":3668},{"className":3667},[],[3669],{"type":46,"value":2718},{"type":46,"value":3671}," reading from a CTE",{"type":46,"value":3673}," (12.3+) — ",{"type":40,"tag":69,"props":3675,"children":3677},{"className":3676},[],[3678],{"type":46,"value":3679},"WITH ... UPDATE\u002FDELETE",{"type":46,"value":3681}," using values from a common table expression",{"type":40,"tag":993,"props":3683,"children":3684},{},[3685,3696,3698],{"type":40,"tag":85,"props":3686,"children":3687},{},[3688,3694],{"type":40,"tag":69,"props":3689,"children":3691},{"className":3690},[],[3692],{"type":46,"value":3693},"IS JSON",{"type":46,"value":3695}," predicate",{"type":46,"value":3697}," (12.3+) — SQL-standard test for whether a value is valid JSON: ",{"type":40,"tag":69,"props":3699,"children":3701},{"className":3700},[],[3702],{"type":46,"value":3703},"WHERE col IS JSON",{"type":40,"tag":993,"props":3705,"children":3706},{},[3707,3712,3714,3720],{"type":40,"tag":85,"props":3708,"children":3709},{},[3710],{"type":46,"value":3711},"Basic XML data type",{"type":46,"value":3713}," (12.3+) — first-class ",{"type":40,"tag":69,"props":3715,"children":3717},{"className":3716},[],[3718],{"type":46,"value":3719},"XML",{"type":46,"value":3721}," type for storing and validating XML documents",{"type":40,"tag":993,"props":3723,"children":3724},{},[3725,3736],{"type":40,"tag":85,"props":3726,"children":3727},{},[3728,3730],{"type":46,"value":3729},"Atomic ",{"type":40,"tag":69,"props":3731,"children":3733},{"className":3732},[],[3734],{"type":46,"value":3735},"CREATE OR REPLACE TABLE",{"type":46,"value":3737}," (13.0+) — the statement is fully atomic: either the new table replaces the old one or nothing happens, with no risk of leaving the schema in a half-replaced state. MySQL has no equivalent atomic guarantee.",{"type":40,"tag":993,"props":3739,"children":3740},{},[3741,3750,3752,3757],{"type":40,"tag":85,"props":3742,"children":3743},{},[3744],{"type":40,"tag":69,"props":3745,"children":3747},{"className":3746},[],[3748],{"type":46,"value":3749},"UPDATE ... RETURNING",{"type":46,"value":3751}," (13.0+) — see ",{"type":40,"tag":458,"props":3753,"children":3755},{"href":3754},"#returning-clause",[3756],{"type":46,"value":1441},{"type":46,"value":3758},"; not on 11.8 LTS",{"type":40,"tag":1448,"props":3760,"children":3762},{"id":3761},"security-auth-1",[3763],{"type":46,"value":2976},{"type":40,"tag":1066,"props":3765,"children":3766},{},[3767,3781],{"type":40,"tag":993,"props":3768,"children":3769},{},[3770,3779],{"type":40,"tag":85,"props":3771,"children":3772},{},[3773],{"type":40,"tag":69,"props":3774,"children":3776},{"className":3775},[],[3777],{"type":46,"value":3778},"SET SESSION AUTHORIZATION",{"type":46,"value":3780}," (12.0+) — perform actions as another user within a session (useful for impersonation in administrative scripts and apps that need least-privilege execution)",{"type":40,"tag":993,"props":3782,"children":3783},{},[3784,3789,3791,3797],{"type":40,"tag":85,"props":3785,"children":3786},{},[3787],{"type":46,"value":3788},"Passphrase-protected TLS keys",{"type":46,"value":3790}," (12.0+) — ",{"type":40,"tag":69,"props":3792,"children":3794},{"className":3793},[],[3795],{"type":46,"value":3796},"ssl_passphrase",{"type":46,"value":3798}," system variable lets the server load encrypted private keys",{"type":40,"tag":1448,"props":3800,"children":3802},{"id":3801},"developer-tools-1",[3803],{"type":46,"value":3401},{"type":40,"tag":1066,"props":3805,"children":3806},{},[3807,3839],{"type":40,"tag":993,"props":3808,"children":3809},{},[3810,3815,3817,3823,3825],{"type":40,"tag":85,"props":3811,"children":3812},{},[3813],{"type":46,"value":3814},"Deprecation visibility",{"type":46,"value":3816}," (13.0+) — ",{"type":40,"tag":69,"props":3818,"children":3820},{"className":3819},[],[3821],{"type":46,"value":3822},"INFORMATION_SCHEMA.SYSTEM_VARIABLES",{"type":46,"value":3824}," includes a deprecated flag, so you can detect uses of variables that will be removed in future versions before they break:\n",{"type":40,"tag":787,"props":3826,"children":3828},{"className":1258,"code":3827,"language":22,"meta":792,"style":792},"SELECT variable_name, default_value FROM INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE is_deprecated = 'YES';\n",[3829],{"type":40,"tag":69,"props":3830,"children":3831},{"__ignoreMap":792},[3832],{"type":40,"tag":798,"props":3833,"children":3834},{"class":800,"line":801},[3835],{"type":40,"tag":798,"props":3836,"children":3837},{},[3838],{"type":46,"value":3827},{"type":40,"tag":993,"props":3840,"children":3841},{},[3842,3853,3854,3860,3861,3867],{"type":40,"tag":85,"props":3843,"children":3844},{},[3845,3847],{"type":46,"value":3846},"Engine-specific create options visible in ",{"type":40,"tag":69,"props":3848,"children":3850},{"className":3849},[],[3851],{"type":46,"value":3852},"INFORMATION_SCHEMA",{"type":46,"value":3816},{"type":40,"tag":69,"props":3855,"children":3857},{"className":3856},[],[3858],{"type":46,"value":3859},"STATISTICS",{"type":46,"value":2285},{"type":40,"tag":69,"props":3862,"children":3864},{"className":3863},[],[3865],{"type":46,"value":3866},"COLUMNS",{"type":46,"value":3868}," now expose engine-specific options, useful when inspecting how indexes or columns were configured",{"type":40,"tag":128,"props":3870,"children":3872},{"id":3871},"sources",[3873],{"type":46,"value":3874},"Sources",{"type":40,"tag":1066,"props":3876,"children":3877},{},[3878,3888,3898,3908,3918,3928,3938,3948,3958],{"type":40,"tag":993,"props":3879,"children":3880},{},[3881],{"type":40,"tag":458,"props":3882,"children":3885},{"href":3883,"rel":3884},"http:\u002F\u002Fmonty-says.blogspot.com\u002F2024\u002F10\u002Fcelebrating-15-years-of-mariadb.html",[462],[3886],{"type":46,"value":3887},"Monty Widenius: Celebrating 15 years of MariaDB",{"type":40,"tag":993,"props":3889,"children":3890},{},[3891],{"type":40,"tag":458,"props":3892,"children":3895},{"href":3893,"rel":3894},"https:\u002F\u002Fmariadb.com\u002Fdocs\u002Frelease-notes\u002Fcommunity-server\u002Fabout\u002Fcompatibility-and-differences\u002Fmariadb-vs-mysql-features",[462],[3896],{"type":46,"value":3897},"MariaDB vs MySQL Features — MariaDB Docs",{"type":40,"tag":993,"props":3899,"children":3900},{},[3901],{"type":40,"tag":458,"props":3902,"children":3905},{"href":3903,"rel":3904},"https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Freference\u002Fsql-structure\u002Ftemporal-tables\u002Fsystem-versioned-tables",[462],[3906],{"type":46,"value":3907},"System-Versioned Tables — MariaDB Docs",{"type":40,"tag":993,"props":3909,"children":3910},{},[3911],{"type":40,"tag":458,"props":3912,"children":3915},{"href":3913,"rel":3914},"https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Freference\u002Fsql-statements\u002Fdata-manipulation\u002Finserting-loading-data\u002Finsertreturning",[462],[3916],{"type":46,"value":3917},"RETURNING — MariaDB Docs",{"type":40,"tag":993,"props":3919,"children":3920},{},[3921],{"type":40,"tag":458,"props":3922,"children":3925},{"href":3923,"rel":3924},"https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Freference\u002Fsql-structure\u002Fsequences\u002Fcreate-sequence",[462],[3926],{"type":46,"value":3927},"CREATE SEQUENCE — MariaDB Docs",{"type":40,"tag":993,"props":3929,"children":3930},{},[3931],{"type":40,"tag":458,"props":3932,"children":3935},{"href":3933,"rel":3934},"https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Fserver-usage\u002Fstorage-engines\u002Finnodb\u002Finnodb-online-ddl\u002Finnodb-online-ddl-operations-with-the-instant-alter-algorithm",[462],[3936],{"type":46,"value":3937},"Instant ALTER TABLE — MariaDB Docs",{"type":40,"tag":993,"props":3939,"children":3940},{},[3941],{"type":40,"tag":458,"props":3942,"children":3945},{"href":3943,"rel":3944},"https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Freference\u002Fdata-types\u002Fstring-data-types\u002Finet6",[462],[3946],{"type":46,"value":3947},"INet6 Data Type — MariaDB Docs",{"type":40,"tag":993,"props":3949,"children":3950},{},[3951],{"type":40,"tag":458,"props":3952,"children":3955},{"href":3953,"rel":3954},"https:\u002F\u002Fmariadb.com\u002Fdocs\u002Frelease-notes\u002Fcommunity-server\u002Fabout\u002Fcompatibility-and-differences\u002Fsql_modeoracle",[462],[3956],{"type":46,"value":3957},"Oracle Compatibility — MariaDB Docs",{"type":40,"tag":993,"props":3959,"children":3960},{},[3961],{"type":40,"tag":458,"props":3962,"children":3965},{"href":3963,"rel":3964},"https:\u002F\u002Fmariadb.com\u002Fdocs\u002Fserver\u002Fserver-management\u002Fserver-monitoring-logs\u002Fbinary-log\u002Fflashback",[462],[3966],{"type":46,"value":3967},"FLASHBACK — MariaDB Docs",{"type":40,"tag":49,"props":3969,"children":3970},{},[3971],{"type":40,"tag":53,"props":3972,"children":3973},{},[3974,3976,3981],{"type":46,"value":3975},"For topics not covered here, see the official MariaDB documentation at ",{"type":40,"tag":458,"props":3977,"children":3979},{"href":487,"rel":3978},[462],[3980],{"type":46,"value":491},{"type":46,"value":1053},{"type":40,"tag":3983,"props":3984,"children":3985},"style",{},[3986],{"type":46,"value":3987},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":3989,"total":1356},[3990,3997,4009,4020,4031,4048,4059,4071],{"slug":4,"name":4,"fn":5,"description":6,"org":3991,"tags":3992,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[3993,3994,3995,3996],{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":21,"slug":22,"type":15},{"slug":3998,"name":3998,"fn":3999,"description":4000,"org":4001,"tags":4002,"stars":23,"repoUrl":24,"updatedAt":4008},"mariadb-mcp","connect AI agents to MariaDB","How to connect AI agents to MariaDB using the Model Context Protocol (MCP). Use when setting up MCP with MariaDB, connecting Claude Code, Cursor, or other AI tools to a MariaDB database, enabling natural language database queries, or building AI applications that need live database access. The MariaDB MCP Server lets agents query schemas, run read-only SQL, and perform semantic search against MariaDB.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[4003,4004,4005],{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":4006,"slug":4007,"type":15},"MCP","mcp","2026-07-13T06:14:00.682655",{"slug":4010,"name":4010,"fn":4011,"description":4012,"org":4013,"tags":4014,"stars":23,"repoUrl":24,"updatedAt":4019},"mariadb-query-optimization","optimize MariaDB database queries","Best practices for query optimization in MariaDB — indexing strategies, EXPLAIN analysis, pagination, histogram statistics, and MariaDB-specific optimizer settings. Use when diagnosing slow queries, designing indexes, reviewing schema or query performance, or when queries involve large tables, pagination, GROUP BY, or ORDER BY. Also use when the user asks about MariaDB query performance, EXPLAIN output, or optimizer behavior.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[4015,4016,4017,4018],{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":21,"slug":22,"type":15},"2026-07-13T06:14:12.656074",{"slug":1756,"name":1756,"fn":4021,"description":4022,"org":4023,"tags":4024,"stars":23,"repoUrl":24,"updatedAt":4030},"configure MariaDB replication and high availability","Best practices for MariaDB replication and high availability — Galera Cluster, GTID replication, semi-synchronous replication, parallel replication, and application patterns for HA environments. Use when setting up replication, designing applications for HA, working with Galera Cluster, asking about MariaDB GTID, handling replication lag in application code, or choosing between replication topologies. IMPORTANT — MariaDB GTID format is incompatible with MySQL GTID, and Galera Cluster needs no server plugin to load but does require the separate galera wsrep provider library (galera-4).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[4025,4028,4029],{"name":4026,"slug":4027,"type":15},"Architecture","architecture",{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},"2026-07-13T06:14:13.989369",{"slug":1433,"name":1433,"fn":4032,"description":4033,"org":4034,"tags":4035,"stars":23,"repoUrl":24,"updatedAt":4047},"implement MariaDB system-versioned tables","Best practices for MariaDB system-versioned (temporal) tables — automatic row history built into the database. Use when tracking data changes over time, implementing audit trails, meeting GDPR or compliance requirements, doing point-in-time queries, or when the user asks about row history, data versioning, temporal tables, or querying past data states in MariaDB. This feature is unique to MariaDB among MySQL-compatible databases.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[4036,4039,4042,4043,4046],{"name":4037,"slug":4038,"type":15},"Audit","audit",{"name":4040,"slug":4041,"type":15},"Compliance","compliance",{"name":18,"slug":19,"type":15},{"name":4044,"slug":4045,"type":15},"GDPR","gdpr",{"name":9,"slug":8,"type":15},"2026-07-13T06:14:16.779878",{"slug":74,"name":74,"fn":4049,"description":4050,"org":4051,"tags":4052,"stars":23,"repoUrl":24,"updatedAt":4058},"build semantic search with MariaDB vectors","Best practices for using vectors and AI with MariaDB. Use when writing SQL involving VECTOR columns, building RAG or semantic search with MariaDB, choosing embedding models, designing vector indexes, or integrating MariaDB with AI frameworks like LangChain, LlamaIndex, or Spring AI. Also use when the user mentions MariaDB and any of: vectors, embeddings, similarity search, nearest neighbor, AI, RAG, or LLM. IMPORTANT — MariaDB has native built-in vector support since version 11.7; it is NOT a plugin or extension (unlike pgvector for PostgreSQL). Do not recommend installing any extension.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[4053,4054,4055],{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":4056,"slug":4057,"type":15},"Migration","migration","2026-07-13T06:14:01.939479",{"slug":4060,"name":4060,"fn":4061,"description":4062,"org":4063,"tags":4064,"stars":23,"repoUrl":24,"updatedAt":4070},"mysql-to-mariadb","migrate applications from MySQL to MariaDB","Compatibility guide for developers moving from MySQL to MariaDB, and for developers with MySQL experience working with MariaDB. Use when migrating a MySQL application to MariaDB, when MySQL syntax or habits cause unexpected behavior in MariaDB, when asking about MySQL\u002FMariaDB compatibility, or when adapting code written for MySQL to run on MariaDB. IMPORTANT — MariaDB diverges significantly from MySQL 8.0 and is not a simple drop-in replacement for modern MySQL. Authentication plugins, JSON handling, GTID replication, and several SQL features differ in important ways.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[4065,4066,4067,4068],{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":4056,"slug":4057,"type":15},{"name":4069,"slug":552,"type":15},"MySQL","2026-07-13T06:14:08.675338",{"slug":4072,"name":4072,"fn":4073,"description":4074,"org":4075,"tags":4076,"stars":23,"repoUrl":24,"updatedAt":4080},"oracle-to-mariadb","migrate Oracle databases to MariaDB","Compatibility guide for developers migrating from Oracle Database to MariaDB. Use when migrating Oracle schemas, PL\u002FSQL procedures, or applications to MariaDB, when Oracle syntax causes unexpected behavior in MariaDB, or when evaluating MariaDB as an Oracle replacement. MariaDB is the only open source database with native PL\u002FSQL compatibility — MariaDB's sql_mode=ORACLE enables migration of approximately 80% of Oracle code without rewrites.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[4077,4078,4079],{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":4056,"slug":4057,"type":15},"2026-07-13T06:14:11.069809",{"items":4082,"total":1356},[4083,4090,4096,4103,4109,4117,4123],{"slug":4,"name":4,"fn":5,"description":6,"org":4084,"tags":4085,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[4086,4087,4088,4089],{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":21,"slug":22,"type":15},{"slug":3998,"name":3998,"fn":3999,"description":4000,"org":4091,"tags":4092,"stars":23,"repoUrl":24,"updatedAt":4008},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[4093,4094,4095],{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":4006,"slug":4007,"type":15},{"slug":4010,"name":4010,"fn":4011,"description":4012,"org":4097,"tags":4098,"stars":23,"repoUrl":24,"updatedAt":4019},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[4099,4100,4101,4102],{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":21,"slug":22,"type":15},{"slug":1756,"name":1756,"fn":4021,"description":4022,"org":4104,"tags":4105,"stars":23,"repoUrl":24,"updatedAt":4030},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[4106,4107,4108],{"name":4026,"slug":4027,"type":15},{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"slug":1433,"name":1433,"fn":4032,"description":4033,"org":4110,"tags":4111,"stars":23,"repoUrl":24,"updatedAt":4047},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[4112,4113,4114,4115,4116],{"name":4037,"slug":4038,"type":15},{"name":4040,"slug":4041,"type":15},{"name":18,"slug":19,"type":15},{"name":4044,"slug":4045,"type":15},{"name":9,"slug":8,"type":15},{"slug":74,"name":74,"fn":4049,"description":4050,"org":4118,"tags":4119,"stars":23,"repoUrl":24,"updatedAt":4058},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[4120,4121,4122],{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":4056,"slug":4057,"type":15},{"slug":4060,"name":4060,"fn":4061,"description":4062,"org":4124,"tags":4125,"stars":23,"repoUrl":24,"updatedAt":4070},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[4126,4127,4128,4129],{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":4056,"slug":4057,"type":15},{"name":4069,"slug":552,"type":15}]