By the Numbers
- 114 commits in 4 days
- 266 PHPUnit tests, 738 assertions
- 35 GitHub tickets addressed (20 closed, 15 open with proposed solution)
- 12 new features
- 0 regressions (all tests pass)
What's New
1. Full MySQL 8.4 Compatibility
MySQL 8.4 removed the SLAVE commands in favor of REPLICA. PmaControl now automatically detects the fork (MariaDB vs MySQL) and uses the correct syntax:
| Action | MariaDB | MySQL 8.4+ |
|---|---|---|
| Stop replication | STOP SLAVE 'conn' |
STOP REPLICA FOR CHANNEL 'conn' |
| Change source | CHANGE MASTER TO ... |
CHANGE REPLICATION SOURCE TO ... |
| Parallel threads | slave_parallel_threads |
replica_parallel_workers |
| Master status | SHOW MASTER STATUS |
SHOW BINARY LOG STATUS |
| GTID | MASTER_USE_GTID = slave_pos |
SET PERSIST gtid_mode = ON (4 steps) |
Enabling GTID on MySQL requires a progressive migration (OFF → OFF_PERMISSIVE → ON_PERMISSIVE → ON) on the master then the slave. PmaControl handles everything automatically, including SET PERSIST for persistence without touching my.cnf.
2. Binlog Analysis
New binlog analysis tool accessible from the replication page of each slave. Select a time range, and PmaControl:
- Downloads binlog files via the MySQL protocol (like an IO thread)
- Parses GTID events (parallelism, transaction sizes)
- Counts DML per table (INSERT/UPDATE/DELETE)
- Calculates volume per second
- Detects DDL (ALTER TABLE, DROP, etc.)
- Generates recommendations based on the actual config of both the master and the slave
Interactive charts:
- Volume KB/s + replication lag (dual Y-axis, synchronized zoom)
- Transactions/second + threads_running on master and slave
- DML treemaps by database and table (recalculated on zoom)
- DDL table color-coded by type (ALTER=orange, DROP=red, CREATE=green)
Smart caching: downloaded binlogs are stored in data/binlog_analysis/{server_id}/ with a 30-day TTL. An analysis on the same time range is near-instantaneous.
Security: MySQL credentials are no longer visible in ps aux — a temporary .my.cnf file with chmod 0600 is used instead.
3. Multi-Source Replication
MariaDB multi-source servers (like production_all which replicates from production_fr, production_uk, production_ro) now display:
- Tabs: one per replication channel + a "+" tab to add a new source
- Setup form: complete CHANGE MASTER (host, port, user, password, GTID, SSL, replicate_do_db)
- Filtered charts: each tab only shows lag data for its channel
4. GeoIP IPv4 + IPv6
Country flags on the servers page now work with IPv6 addresses. The full GeoLite2 ranges (650K IPv4 + 1.95M IPv6 = 2.6M ranges) are imported into MariaDB for SQL lookups < 1ms.
5. Group Replication / InnoDB Cluster
New page under the Architecture > Group Replication menu:
- Reliable role detection of PRIMARY/SECONDARY via
performance_schema.replication_group_members - Display in the Dot3 graph (subgroups: Primary in green / Replica in blue)
- ONLINE/RECOVERING/ERROR/OFFLINE state with colors
6. Redesigned Home Dashboard
The home page now displays:
- KPIs: number of servers, availability (%), replication (%), daemons
- Alerts: list of down servers (monitored only)
- Distribution: environments, clients, versions (horizontal bars)
- Daemons: compact grid with running/stopped/error badges
7. ReadOnly Role
New ReadOnly role (group_id=10) with 134 explicitly allowed actions, no wildcards. Forbidden: all writes, replication control, passwords, debug, heavy queries on information_schema, daemon control.
8. Redesigned Pages
- Client/index: card grid with health bar, inline editing, monitoring toggle
- Architecture/index: dark blue gradient header, clean SVG grid
- Slave/show: multi-source tabs, Chart.js 4.5.1 charts with synchronized zoom
Bug Fixes
Security
connection_namesanitization against SQL injection in 5 methods- Whitelist of editable fields in
Client::update() - Password hidden from process lists (
--defaults-extra-fileinstead of--password=)
Stability
- ts_value partitions desynchronized between tables (fix: per-table creation + today included)
Extraction2:sql_query_silentfor missing partitions- Binlog analysis: stall detection instead of fixed timeout (120s without growth = kill)
testAccessReplication(): addedBINLOG MONITORfor MariaDB 10.5+slave_connections_needed_for_purge=0before binlog purge
UI
- Chart.js sparklines migrated from v2 to v4
- Canvas ID collision on multi-channel charts
- "Load previous day" always decrements even without data
- Erratic tooltips fixed (
nearestmode instead ofindex) - Sys schema column tooltips (100+ columns documented)
Roadmap — What's Left
Open Tickets (35)
Debian 13 Installer (7 tickets):
- Predictable passwords (#123)
- Cleartext credentials in
/tmp/config.json(#117) - Private SSH key in the repo (#114)
- MariaDB version ignored (#120)
/var/wwwownership (#119)
Binlog Analysis:
- Gantt timeline aligned with charts (#106)
- Analysis launched twice (#122)
- Non-atomic write cache for MySQL logs (#121)
Data Quality:
- Lag normalization NULL → 0 (#113)
- SSL state lost in MySQL 8 normalization (#116)
- Home dashboard: SingleStore classified as MySQL (#130), PID reuse (#129), seconds_behind_source (#126)
Legacy:
- Rename database with collation (#26)
- LDAP encoding (#40)
- Table names with hyphens in Graphviz (#65)
- SqlFormatter deprecated strlen (#72)
Planned Improvements
- Time-series aggregation: raw → 1min → 1hr → 1day with stddev for anomaly detection
- Alerting: Telegram/email notifications for lag, server down, disk space
- Plugin system: install/uninstall from GitHub
- REST API: metrics exposure for external integration
Links
- GitHub: github.com/PmaControl/PmaControl
- Telegram: t.me/pmacontrol
- Open tickets: Issues
PmaControl is an open-source MariaDB/MySQL monitoring tool. Contributions welcome.
Comments (0)
No comments yet.
Leave a comment