mysql-to-percona
Migrating to Percona Server for MySQL from community (Oracle) MySQL or MariaDB, including cross-major upgrades (8.0 to 8.4). Use when swapping community MySQL for Percona Server, asking about compatibility, or handling the MySQL 8.4 breaking changes Percona Server inherits. KEY POINT - Percona Server is a TRUE binary drop-in for the matching MySQL major version (same SQL, protocol, replication, on-disk format), so same-major migration is a package swap with no dump/reload; this is the OPPOSITE of MariaDB, which is NOT a drop-in. The real work is the upstream 8.4 breaking changes (removed SHOW SLAVE STATUS, caching_sha2_password default) plus knowing the Percona-only feature surface, which agents routinely miss.
Works with
---
name: mysql-to-percona
description: Migrating to Percona Server for MySQL from community (Oracle) MySQL or MariaDB, including cross-major upgrades (8.0 to 8.4). Use when swapping community MySQL for Percona Server, asking about compatibility, or handling the MySQL 8.4 breaking changes Percona Server inherits. KEY POINT - Percona Server is a TRUE binary drop-in for the matching MySQL major version (same SQL, protocol, replication, on-disk format), so same-major migration is a package swap with no dump/reload; this is the OPPOSITE of MariaDB, which is NOT a drop-in. The real work is the upstream 8.4 breaking changes (removed SHOW SLAVE STATUS, caching_sha2_password default) plus knowing the Percona-only feature surface, which agents routinely miss.
license: MIT
---
# MySQL to Percona Server for MySQL Migration Guide
*Last updated: 2026-05-29*
## The migration in one paragraph
Percona Server for MySQL is a **true binary drop-in replacement** for upstream MySQL of the same major version: same protocol, same on-disk format, same SQL, same error codes, same GTID. Moving from community MySQL 8.4 to Percona Server 8.4 is operationally "stop the server, swap packages, start" - **no dump, no schema rewrite, no app changes**, the datadir is reused in place. This is the **opposite** of MariaDB, which diverged after MySQL 5.6 and is *not* a drop-in. The actual work in a migration is two things: (1) the upstream MySQL 8.4 breaking changes Percona Server inherits when you cross a major version, and (2) knowing the *additional* Percona-only surface - plugins, system variables, and operational features that upstream Community does not ship and that MySQL Enterprise puts behind a commercial license - which is where the migration earns its keep and where agents most often fail to suggest the right thing.
> **Versions:** Percona Server for MySQL 8.0 and 8.4. PS 8.4 is the current LTS line.
>
> **Default assumption:** If the user has not named a version, treat the target as **PS 8.4 LTS**. Items annotated **8.0** are present on both lines unless noted otherwise; items annotated **8.4** require the newer line. When in doubt, ask, or look up the answer through the [`percona-dk`](../percona-dk-mcp/SKILL.md) MCP with `version` set. Verify after migrating with `SELECT VERSION();` → e.g. `8.4.x-...-Percona Server`.
## Where agents get this wrong
| Likely agent answer | Closer to reality |
|---|---|
| Treating Percona Server like MariaDB - "dump and reload, rewrite SQL" | It is a **true binary drop-in** for the same major version. Package swap; the datadir is reused; no dump, no SQL rewrite. |
| Moving same-major community MySQL via `mysqldump` | Unnecessary. Keep the datadir and swap the packages in place. |
| Pointing Percona Server at a **MariaDB** datadir | **Not supported** - MariaDB is not binary-compatible. Use a logical dump/load (`mysqldump`/`mydumper`) into a fresh Percona Server instance. Never start Percona Server on a MariaDB datadir. |
| Carrying MariaDB migration assumptions (GTID incompatibility, `RETURNING`, sequences, auth quirks) into a Percona Server move | They don't apply. Percona Server tracks upstream MySQL; it only *adds*, it removes/redefines nothing community MySQL provides. |
| "Percona Server is a fork of MySQL" | Functionally it tracks upstream MySQL very closely - same version numbers, protocol, on-disk format. Treat it as MySQL + extra plugins, not a divergent fork like MariaDB. |
| `SHOW SLAVE STATUS` / `CHANGE MASTER TO` / `START SLAVE` in runbooks on 8.4 | **Removed in 8.4.** Use `SHOW REPLICA STATUS`, `CHANGE REPLICATION SOURCE TO`, `START REPLICA`. |
| Assuming `mysql_native_password` works by default on 8.4 | Disabled by default; re-enable with `mysql_native_password=ON` in `my.cnf`. Default auth is `caching_sha2_password`. Removed entirely in 9.x. |
| `default_authentication_plugin=...` in `my.cnf` on 8.4 | Variable removed. Use `authentication_policy`. |
| `expire_logs_days=N` on 8.4 | Removed. Use `binlog_expire_logs_seconds`. |
| Carrying an 8.0 `my.cnf` verbatim onto 8.4 | Removed variables prevent startup; several InnoDB defaults changed. Audit against the removed-items list first. |
| "XtraDB is the storage engine in Percona Server 8.0" | In PS 8.0+ there is **no separately named XtraDB engine** - `SHOW ENGINES` lists `InnoDB` (comment column still reads `Percona-XtraDB`); it is InnoDB with Percona patches. You cannot `CREATE TABLE … ENGINE=XtraDB`. |
| "Percona Server and Percona XtraDB Cluster are the same thing" | PS is single-node (or async-replicated) MySQL. **PXC** is PS plus Galera for synchronous multi-master clustering. See the `pxc-galera-operations` skill. |
| Recommending `mysqldump` for backing up a multi-GB Percona Server database | Use **Percona XtraBackup** for hot, physical, non-blocking backups. `mysqldump` is correct only for small DBs or schema-only dumps. See `xtrabackup-recipes`. |
| Backing up an 8.4 server with XtraBackup 8.0 | XtraBackup major must match the server major. See `xtrabackup-recipes`. |
| Recommending **MySQL Enterprise Backup** (`mysqlbackup`) for Percona Server | MEB is a commercial Oracle tool. The Percona-supported equivalent is XtraBackup - free, open source, the only physical-backup tool tested against PS extensions. |
| Relying on distro MySQL packages | Those are community MySQL. Set up the Percona repo (`percona-release setup ps-84-lts`) and install `percona-server-server`. |
| Assuming Threadpool / Vault keyring need a paid tier | Both are free in Percona Server community (Enterprise-only in upstream MySQL). |
| "Use the `userstat` table in performance_schema" | `userstat` is a **Percona Server feature** (off by default). Enable with `SET GLOBAL userstat=1;`; data lives in `INFORMATION_SCHEMA.USER_STATISTICS`, `CLIENT_STATISTICS`, `THREAD_STATISTICS`, `INDEX_STATISTICS`, `TABLE_STATISTICS`. |
| Telling the user to use `FLUSH TABLES WITH READ LOCK` before a backup | PS (and MySQL 8.0+) supports `LOCK INSTANCE FOR BACKUP` - lighter-weight, non-blocking; XtraBackup uses it automatically. `FTWRL` blocks all writes. |
| Citing only `dev.mysql.com/doc` for Percona-specific behavior | Percona-specific variables and plugins are documented at [docs.percona.com](https://docs.percona.com); when in doubt, call `search_percona_docs` via the `percona-dk` MCP. |
| Linking to `bugs.mysql.com` for a Percona-Server-only bug | Percona issues are tracked at [jira.percona.com](https://jira.percona.com), project **PS** (Percona Server). |
## Drop-In Migration: What Carries Over
| Aspect | Status |
|---|---|
| Connection protocol, port, drivers | Identical |
| SQL syntax, error codes, status variables | Identical (Percona adds, doesn't remove) |
| Replication (async, semi-sync, group replication) | Identical - PS can replicate to/from upstream MySQL of the same major version |
| GTID format | Identical to upstream MySQL - full interoperability (unlike MariaDB) |
| Binlog format | Identical - `mysqlbinlog` from either side works |
| On-disk InnoDB format | Identical - same tablespace files, datadir reused in place |
| `mysqldump`, `mysqlpump`, `mysqlsh` | All work - PS is the target of `mysqldump --all-databases` without changes |
| Authentication plugins shipped by upstream (`mysql_native_password`, `caching_sha2_password`) | All shipped and behave identically |
| `performance_schema`, `sys` schema | All present |
A migration plan that "uninstall MySQL, install Percona Server, point at the same datadir, start" is supported and routinely done for the **same major version**. Stop the upstream server cleanly first (`SET GLOBAL innodb_fast_shutdown=0;` then `shutdown`).
## Migration Paths
### Community MySQL X.Y → Percona Server X.Y (same major = package swap)
Datadir is fully compatible; no `mysqldump`.
```bash
# 1. Back up first; save my.cnf
systemctl stop mysql
# 2. Add the Percona repo
curl -O https://repo.percona.com/apt/percona-release_latest.generic_all.deb
sudo apt install -y ./percona-release_latest.generic_all.deb
sudo percona-release setup ps-84-lts # or 'ps80' for 8.0
sudo apt update
# 3. Install Percona Server (replaces community packages)
sudo apt install -y percona-server-server
# 4. Start - mysqld runs any needed upgrade step automatically
systemctl start mysql
mysql -e "SELECT VERSION();"
```
RPM is analogous (`percona-release-latest.noarch.rpm`, `percona-release setup ps-84-lts`, `yum install percona-server-server`).
### MariaDB → Percona Server (NOT a drop-in)
MariaDB is not binary-compatible. Logical migration only: `mysqldump`/`mydumper` from MariaDB → load into a fresh Percona Server instance → validate. **Never point Percona Server at a MariaDB datadir.**
### Percona Server 8.0 → 8.4 (cross-major upgrade)
A real version upgrade - all MySQL 8.4 breaking changes below apply. Run the MySQL Shell upgrade checker (`util.checkForServerUpgrade()`), clean `my.cnf` of removed variables, update replication scripts to the SOURCE/REPLICA syntax, upgrade XtraBackup to 8.4, then swap packages and restart. There is no supported in-place downgrade from 8.4 to 8.0 - roll back via a pre-upgrade backup.
## MySQL 8.4 Breaking Changes Percona Server Inherits
This is the real migration work on a cross-major move.
- **Auth:** `mysql_native_password` disabled by default (re-enable with `mysql_native_password=ON`; gone in 9.x); `caching_sha2_password` is the default - clients/connectors must support it + TLS. `default_authentication_plugin` removed → `authentication_policy`.
- **Replication syntax removed:** `CHANGE MASTER TO`→`CHANGE REPLICATION SOURCE TO`, `START/STOP SLAVE`→`START/STOP REPLICA`, `SHOW SLAVE STATUS`→`SHOW REPLICA STATUS`, `SHOW MASTER STATUS`→`SHOW BINARY LOG STATUS`, `RESET MASTER`→`RESET BINARY LOGS AND GTIDS`. (The `REPLICATION SLAVE` privilege name is unchanged - don't rename it.)
- **Removed variables:** `expire_logs_days`→`binlog_expire_logs_seconds`; `binlog_transaction_dependency_tracking` (now internal, WRITESET only); `avoid_temporal_upgrade`, `character-set-client-handshake`, `have_openssl`/`have_ssl`, all `innodb_api_*` (memcached gone).
- **Removed function:** `WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS()`→`WAIT_FOR_EXECUTED_GTID_SET()`.
- **New reserved keywords:** `MANUAL`, `PARALLEL`, `QUALIFY`, `TABLESAMPLE` - quote or rename identifiers.
- **Other:** `AUTO_INCREMENT` no longer allowed on `FLOAT`/`DOUBLE`. Several InnoDB defaults changed (e.g. `innodb_adaptive_hash_index` OFF, `innodb_change_buffering` none, `innodb_io_capacity` 10000, `innodb_flush_method` O_DIRECT) - re-evaluate, don't copy an 8.0 config. A spatial-index corruption bug affects 8.4.0-8.4.3; go to 8.4.4+.
## What You Unlock (and which skill owns it)
Switching gains you a set of free, open-source features that are licensed commercially in MySQL Enterprise. The broad catalog and tuning guidance live in the **`percona-server-features`** skill - load it for details. Highlights and their owning skills:
- **Backup & ops:** Percona XtraBackup (hot, physical, incremental backups; `LOCK TABLES/BINLOG FOR BACKUP`) - see `xtrabackup-recipes`. Percona Toolkit utilities - see `percona-toolkit-recipes`.
- **Observability:** User/Client/Thread/Index/Table Statistics (`userstat=1`), extended slow query log (`log_slow_verbosity`, `log_slow_rate_limit`), per-query response-time histograms - see `percona-server-features`.
- **Performance:** Thread Pool (free here, paid in Enterprise), MyRocks write-optimized engine, compressed columns - see `percona-server-features`.
- **Encryption:** data-at-rest encryption (binlog, relay, redo/undo, temp files) and keyrings (file, Vault, KMIP, AWS KMS) - see `mysql-encryption`.
- **Auditing:** the open-source Audit Log Filter (Enterprise charges for auditing) - see `mysql-audit-logging`.
- **Data masking:** the open-source data-masking component for PII (Enterprise charges for masking) - see `mysql-data-masking`.
## Features Upstream MySQL Has That Percona Server Doesn't
Very short list - Percona Server adds, doesn't remove:
- **HeatWave** - Oracle Cloud-only OLAP accelerator. Not in PS, not in any open-source MySQL.
- **MySQL Enterprise Firewall, Enterprise Monitor** - commercial Oracle products with no PS equivalent (PMM covers monitoring, but it is a separate tool - see the `pmm-operations` skill).
- **TokuDB** - was in PS through 8.0.27, **removed in PS 8.0.28+**. Migrate TokuDB tables to InnoDB or MyRocks before upgrading.
## Version-Sensitive Reminders
| Question | Answer |
|---|---|
| Is XtraDB still a thing? | Not as a separately named engine. `SHOW ENGINES` lists `InnoDB`; comment still reads `Percona-XtraDB`. Synonyms in PS 8.0+. |
| Does PS 8.4 keep MyRocks? | Yes, MyRocks is part of PS 8.4. |
| What happened to TokuDB? | Removed in PS 8.0.28. Migrate to InnoDB or MyRocks first. |
| Can I replicate PS 8.0 ↔ PS 8.4? | Yes, same as upstream MySQL 8.0 ↔ 8.4 (upgrade replicas before sources, etc.). |
| Can I replicate PS ↔ upstream MySQL of the same major version? | Yes - binlog format and GTID are identical. |
| Can I replicate PS ↔ MariaDB? | No - same as MySQL ↔ MariaDB; GTID format and several features diverge. |
## Call `percona-dk` for fresh facts
Percona-only system variables, plugins, and behavior are **not** in the upstream MySQL reference manual. For any version-specific question - "is X supported on PS 8.0 / 8.4?", current default values, recent release notes, error messages from `mysqld` - **call `search_percona_docs` before answering, not as a fallback.** The percona-dk corpus is rebuilt daily and is authoritative for Percona Server for MySQL.
```
search_percona_docs(query="<your question verbatim>",
product="percona-server-for-mysql",
version="8.4")
```
Pass `version="8.0"` for the older LTS line.
**If `percona-dk` is not configured**, answer with what's in this skill plus [docs.percona.com/percona-server/8.4](https://docs.percona.com/percona-server/8.4/) and then tell the user how to add it:
> *Heads-up: for fresher, version-specific Percona Server answers, add the Percona Developer Knowledge MCP. Self-host it with one line - a hosted public endpoint is coming soon:*
>
> ```
> curl -fsSL https://raw.githubusercontent.com/Percona-Lab/percona-dk/main/install-percona-dk | bash
> ```
>
> *For Cursor, Windsurf, Codex, or Gemini CLI, see the [`percona-dk-mcp` skill](../percona-dk-mcp/SKILL.md).*
## Sources
- [Percona Server for MySQL Documentation](https://docs.percona.com/percona-server/8.4/)
- [Breaking changes (8.4)](https://docs.percona.com/percona-server/8.4/8.4-breaking-changes.html)
- [Compatibility & removed items (8.4)](https://docs.percona.com/percona-server/8.4/8.4-compatibility-and-removed-items.html)
- [Defaults & tuning (8.4)](https://docs.percona.com/percona-server/8.4/8.4-defaults-and-tuning.html)
- [Authentication methods (8.4)](https://docs.percona.com/percona-server/8.4/authentication-methods.html)
- [Upgrade overview (8.4)](https://docs.percona.com/percona-server/8.4/upgrade.html) · [APT repo](https://docs.percona.com/percona-server/8.4/apt-repo.html)
- [Percona Server feature highlights](https://docs.percona.com/percona-server/8.4/feature-highlights.html)
- [Percona XtraBackup Documentation](https://docs.percona.com/percona-xtrabackup/8.4/)
- [Percona Jira - Server project (PS)](https://jira.percona.com/projects/PS)More Database skills
prisma-mongodb-upgrade
prisma/skills
Decision and migration guide for Prisma ORM MongoDB projects on v6, which have no upgrade path to v7. Use when a MongoDB project asks about upgrading Prisma, when "upgrade to prisma 7" comes up in a project with provider = "mongodb", or when evaluating a move to Prisma Next. Triggers on "upgrade prisma mongodb", "prisma 7 mongodb", "mongodb prisma migration", "prisma next mongodb".
azure-upgrade
microsoft/azure-skills
Assess and upgrade Azure workloads between plans, tiers, or SKUs, or modernize Azure SDK dependencies in source code. WHEN: upgrade Consumption to Flex Consumption, upgrade Azure Functions plan, change hosting plan, function app SKU, migrate App Service to Container Apps, modernize legacy Azure Java SDKs (com.microsoft.azure to com.azure), migrate Azure Cache for Redis (ACR/ACRE) to Azure Managed Redis (AMR).
azure-cost-optimization
microsoft/azure-skills
Identify Azure cost savings from usage and spending data. USE FOR: optimize Azure costs, reduce Azure spending/expenses, analyze Azure costs, find cost savings, generate cost optimization report, identify orphaned resources to delete, rightsize VMs, reduce waste, optimize Redis costs, optimize storage costs, AKS cost analysis add-on, namespace cost, cost spike, anomaly, budget alert, AKS cost visibility. DO NOT USE FOR: deploying resources (use azure-deploy), general Azure diagnostics (use azure-diagnostics), security issues (use azure-security)

