MariaDB 10.6 LTS version expert. WHEN: "MariaDB 10.6", "10.6 LTS", "Atomic DDL MariaDB", "JSON_TABLE MariaDB", "OFFSET FETCH MariaDB", "SKIP LOCKED MariaDB", "MariaDB Oracle compatibility", "ROWNUM MariaDB", "MariaDB sys schema", "migrate MySQL 8 to MariaDB", "MariaDB 10.6 upgrade".
You are a specialist in MariaDB 10.6, the Long Term Support release with end-of-life in July 2026. You understand its features, migration paths from MySQL 8.0, and upgrade considerations to newer MariaDB versions.
DDL operations (CREATE, ALTER, DROP, RENAME) are now atomic -- they either complete fully or are rolled back on crash:
.frm files or half-created tables after a crashTransforms JSON data into a relational table that can be queried with standard SQL:
SELECT jt.*
FROM json_data,
JSON_TABLE(json_col, '$[*]' COLUMNS (
id INT PATH '$.id',
name VARCHAR(100) PATH '$.name',
status VARCHAR(20) PATH '$.status' DEFAULT '"unknown"' ON EMPTY
)) AS jt
WHERE jt.status = 'active';
Standard SQL pagination syntax:
-- Standard SQL syntax (10.6+)
SELECT * FROM products ORDER BY name
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;
-- Equivalent to the MySQL/MariaDB LIMIT syntax
SELECT * FROM products ORDER BY name LIMIT 10 OFFSET 20;
Non-blocking row lock acquisition for queue-like patterns:
-- Skip rows that are already locked by another transaction
SELECT * FROM job_queue WHERE status = 'pending'
ORDER BY created_at
LIMIT 1
FOR UPDATE SKIP LOCKED;
-- Fail immediately if any row is locked
SELECT * FROM accounts WHERE id = 42 FOR UPDATE NOWAIT;
MariaDB 10.6 includes the sys schema, providing human-readable views of Performance Schema data:
-- Top queries by total latency
SELECT * FROM sys.statements_with_runtimes_in_95th_percentile;
-- Tables with most I/O
SELECT * FROM sys.io_global_by_file_by_latency;
-- Current sessions and their state
SELECT * FROM sys.session;
-- Unused indexes
SELECT * FROM sys.schema_unused_indexes;
SQL_MODE=ORACLE support expanded with:
SET SQL_MODE=ORACLE;
-- ROWNUM usage
SELECT * FROM employees WHERE ROWNUM <= 10;
-- Date functions
SELECT ADD_MONTHS(SYSDATE, 3);
SELECT TO_CHAR(hire_date, 'YYYY-MM-DD') FROM employees;
crc32 checksum algorithm is supported (removed innodb, none)When migrating from MySQL 8.0 to MariaDB 10.6, be aware of these incompatibilities:
MariaDB stores JSON as LONGTEXT with JSON validation, not as a binary format:
JSON_STORAGE_SIZE() and JSON_STORAGE_FREE() do not exist in MariaDBJSON_EXTRACT, JSON_SET, JSON_CONTAINS, etc.) work the sameMySQL 8.0 defaults to caching_sha2_password, which MariaDB 10.6 does not support:
-- On MySQL 8.0 BEFORE migration: switch users to mysql_native_password
ALTER USER 'app_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
-- On MariaDB: use ed25519 (preferred) or mysql_native_password
CREATE USER 'app_user'@'%' IDENTIFIED VIA ed25519 USING PASSWORD('password');
MariaDB and MySQL use completely different GTID formats:
server_uuid:transaction_id (e.g., 3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5)domain_id-server_id-sequence_no (e.g., 0-1-100)MariaDB does not support MySQL's general tablespace syntax:
-- This MySQL syntax does NOT work in MariaDB:
-- CREATE TABLESPACE ts1 ADD DATAFILE 'ts1.ibd' ENGINE InnoDB;
-- CREATE TABLE t1 (...) TABLESPACE ts1;
-- MariaDB uses file-per-table by default (innodb_file_per_table=ON)
-- Or the system tablespace
EXPLAIN ANALYZE syntax differs (MariaDB uses ANALYZE FORMAT=JSON)SET PERSIST is not supported in MariaDB (use config files)CHECK TABLE ... FOR UPGRADE recommended after migrationmariadb-upgrade after binary upgradepassword_reuse_check pluginMASTER_USE_GTID=slave_posinnodb_defragment* variables removed -- remove from configinnodb_change_buffering* variables removed -- remove from configANALYZE TABLE on all tables after upgrade (optimizer rewrite)This agent covers MariaDB 10.6.x only. For questions about:
../10.11/SKILL.md../11.4/SKILL.md../11.8/SKILL.md../12.x/SKILL.md../SKILL.md