Percona 8 upgrade readiness — codebasecheck
A BOA host runs one shared Percona server for every Octopus instance, the Ægir Hostmaster front end, and every hosted site. Because the whole box shares that one server, a box-wide upgrade from Percona 5.7 to 8.0/8.4 — required to host Drupal 11 — is gated by the box's oldest, least-compatible codebase: a single account that cannot run on MySQL 8 blocks the upgrade for every other account on the host.
codebasecheck answers, before you start the upgrade, which accounts (if any) block
it — so you can move just those to a legacy Percona 5.7 host and let the rest upgrade,
rather than discovering the problem mid-upgrade.
This is not a hard break for legacy Drupal in general: BOA already serves Drupal 6, 7, and
Backdrop on a single Percona 8.4 instance (relaxed sql_mode plus mysql_native_password),
and its own managed cores are new enough to qualify. The check exists for the tail — a
customer's frozen custom platform on an old core, or a site whose contrib code trips over
MySQL 8.
What counts as compatible
Core version is the primary gate. The thresholds match the releases where each Drupal line gained MySQL-8 support, so in practice they only flag a codebase pinned to an old core:
| Core | Compatible from | Notes |
|---|---|---|
| Drupal 6 | d6lts / Pressflow 6.51+ | Reserved-word escaping, ONLY_FULL_GROUP_BY handling, mysql_native_password. |
| Drupal 7 | 7.76+ | The release that added MySQL-8 support. |
| Drupal 8 | 8.6.0+ | |
| Drupal 9 / 10 / 11 | all | Drupal 11 requires MySQL 8 — the reason the host must move. |
| Backdrop | all supported | Detected via BACKDROP_VERSION. |
| Unrecognised | — | Flagged for manual review (fail-safe). |
A flagged codebase means that account must move to a legacy Percona 5.7 host before this box can upgrade — see Cross-host migration.
Running the check
codebasecheck <platform-path> # check one codebase
codebasecheck --box # box-wide readiness report (all accounts)
codebasecheck --box --deep # box report + deep contrib/schema analysis
Single-codebase mode is also what the nightly maintenance
runs per platform when /etc/boa/.allow-codebasecheck.cnf exists, recording per-platform
findings under each account's log/ctrl/.
--box walks every /data/disk/<user> Octopus account, resolves each account's platforms
from its Drush aliases, classifies them, and rolls the result up per account — the unit
you actually migrate:
Account o3: READY (22 codebase(s))
Account o7: BLOCKED
BLOCK /data/disk/o7/static/legacy/oldsite [7.44] Drupal 7 (7.44) predates 7.76 MySQL-8 support
...
RESULT: BLOCKED — these account(s) must move to a legacy Percona 5.7 VM before this box upgrades:
- o7
Each run also writes a full report to /var/log/boa/core/box-readiness-<timestamp>.log.
Verdicts and exit codes
| Verdict | Exit | Meaning |
|---|---|---|
| READY | 0 |
Every codebase on the box is compatible with Percona 8.x. |
| REVIEW | 2 |
Cores are compatible, but --deep found signals to verify before you trust the upgrade. |
| BLOCKED | 1 |
At least one account's core cannot run on MySQL 8; move that account off first. |
Deep contrib/schema analysis
A codebase can pass the core-version check yet still break on 8.x through contrib or
custom code and schema. --deep adds the REVIEW tier, driven by a small set of
high-precision, low-noise signals (deliberately narrow — a check that flags every host is
useless). It uses the local MySQL root access (/root/.my.cnf) and skips cleanly if that
is unavailable.
- utf8mb3 tables — reported as INFO only; it does not change the verdict.
utf8mb3 runs fine on Percona 8.4, so this is a heads-up that a
utf8mb4conversion is pending if you need 4-byte or emoji data, not a blocker. - Reserved-word contrib table names — a table named with a MySQL-8 reserved word (for
example
groupsorrank), excluding the coresystemtable, which the database layer always quotes. Flagged REVIEW. Reserved-word columns are intentionally not scanned: they are pervasive (key,order,group, …) and always quoted by the schema layer, so flagging them would be pure noise. - Static code red-flags in contrib/custom modules —
NO_AUTO_CREATE_USER(a removedsql_modethat raises an error on 8.x and cannot be restored) and the removedTYPE=<engine>CREATE TABLE syntax.
A REVIEW result means look before you trust the upgrade, not broken. The reserved-word
failure only fires when a module runs raw, unquoted SQL against the identifier — which
cannot be proven from the schema alone — so --deep surfaces the risk for a human to
verify on a test clone; it is not a guarantee of safety.
Plain --box needs no database access and is fast. --deep scans every platform's module
tree and every database, so it takes noticeably longer on a busy host.
Before a Percona 8 upgrade
- Run
codebasecheck --box --deep. - If BLOCKED, move the named account(s) to a legacy Percona 5.7 host (Cross-host migration), then re-run.
- If REVIEW, check each finding on a test clone (raw SQL against a reserved-word table, a flagged module).
- When READY, run the staged upgrade —
barracuda up-lts system percona-8.0thenbarracuda up-lts system percona-8.4— as covered in Percona install + tuning and the major OS upgrade (Percona 8.4 is a precondition for the Devuan Excalibur upgrade).