All notable changes to PlanetScale Discovery Tools will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- MySQL schema object counts were multiplied on servers with an empty schema. A scoped (PlanetScale/Vitess-style)
information_schemais now proven withSHOW TABLESbefore falling back to per-database iteration, and that iteration drops identical rows when merging. Previously a schema holding no base tables triggered the fallback, which re-ran every cross-database query once per schema. - Column metadata was lost on MySQL 5.6 and MariaDB before 10.2. The column query is retried without
generation_expression(MySQL 5.7.6+), rather than the whole statement failing and leavingcolumn_analysisempty. - Binlog retention was always blank before MySQL 8.0.
@@binlog_expire_logs_seconds(8.0+) and@@expire_logs_days(removed in 8.4) are read independently, so a missing variable no longer skips the other. - Failed sub-queries are now reported.
add_errorkeeps the underlying exception, and analyzer errors and warnings appear as analysis gaps, so an empty section is distinguishable from a section that genuinely found nothing. - The
information_schema.check_constraintsversion guard (MySQL 8.0.16+) now runs, instead of the missing table being filed as a generic query failure. - MySQL feature detection reported features that no client used.
LOCK TABLESnow comes fromCom_lock_tablesinstead ofTable_locks_immediate, Galera requireswsrep_on=ONwith a real provider instead of anywsrep_*variable, and XA reads theCom_xa_*counters instead ofinnodb_support_xa. Each of the three old signals is true on a server that never uses the feature.
- Refreshed the runtime dependencies (
boto3,botocore,s3transfer) and the development dependencies (cryptography,mypy,responses, and others) to current versions.
- Config-driven runs. The configuration file is now the source of truth. Running
ps-discoverywith no subcommand loads./config.yaml(auto-discovered) or the file passed to--configand runs whatever database and/or cloud modules it declares. Subcommands (database,cloud,both) remain available to run a single scope directly. - Global run options (
--config,--engine,--providers,--output-dir,--log-level) may now be given before or without a subcommand, e.g.ps-discovery --config config.yaml. - Optional
modules:list in the config file to explicitly select which modules run; when omitted, modules are inferred from the config contents. setup.shnow uses arrow-key selectors for engine and cloud provider (or thePSDISCOVERY_ENGINE/PSDISCOVERY_PROVIDERenvironment variables for non-interactive/CI use) and writes a starterconfig.yaml, never clobbering an existing one (writesnew-config.yamlinstead).
- Minimum supported Python raised to 3.10 (3.9 is end-of-life); CI test matrix is now Python 3.10–3.14.
- Refreshed runtime and development dependencies to current versions, and regrouped Dependabot updates into
production,development, andgithub-actionsgroups on a 14-day cooldown to reduce PR volume.
- Configuration is now YAML-only; JSON config input is no longer supported.
config-templateno longer accepts--format; the output path must end in.yamlor.yml.
- MySQL and Vitess database discovery alongside PostgreSQL, with engine selection via
--engine. MySQL engine recognition in AWS and GCP cloud discovery (RDS MySQL, Aurora MySQL, Cloud SQL MySQL) (guide) - Neon cloud discovery provider for projects, branches, and compute endpoints (guide)
- AWS Aurora: exclude
rdsadminfrom the database catalog to avoid permission errors - Skip per-backend temporary schemas during schema analysis on clusters with very large
pg_namespace
Initial public release of PlanetScale Discovery Tools — a comprehensive suite for analyzing PostgreSQL databases and cloud infrastructure environments to support migration planning.
- Configuration Analysis: PostgreSQL server version, runtime settings, and tuning parameters
- Schema Analysis: Tables, columns, indexes, constraints, views, functions, triggers, sequences, and partitions
- Performance Analysis: Connection stats, query performance (via pg_stat_statements), cache hit ratios, index usage, lock analysis, replication lag, and wait events
- Security Analysis: Users, roles, permissions, row-level security policies, SSL configuration, and privilege escalation risks
- Advanced Features Analysis: Extensions, custom data types, foreign data wrappers, PostGIS, and other PostgreSQL-specific features
- Data Size Analysis (opt-in): Large column detection and LOB identification for migration sizing
- AWS: RDS instances, Aurora clusters, VPC topology (subnets, security groups, NACLs, route tables, NAT gateways), and focused single-database analysis mode
- GCP: Cloud SQL instances, AlloyDB clusters with storage usage via Cloud Monitoring API, VPC networks, and firewall rules
- Supabase: Managed PostgreSQL project inventory, connection pooling configuration, and database details
- Heroku: Postgres add-ons, PgBouncer pooling detection, follower/replica databases, cross-app attachments, and plan-based resource specifications
- Unified
ps-discoveryCLI withdatabase,cloud, andbothsubcommands - YAML configuration-driven execution for repeatable discovery runs
- JSON output containing complete structured analysis results
- Optional local markdown summary for quick review (
--local-summary) - Focused analysis mode (
--target-database) for single-database cloud infrastructure scoping - Configurable analyzer selection (
--analyzers) to run only the modules you need
- Metadata-only collection — no actual table data is ever accessed
- Graceful degradation on permission errors — one module failure does not stop the entire discovery
- 5-minute query timeout to prevent runaway queries
- Read-only operation with minimal database performance impact
- Output files restricted to owner-only permissions (0600)
- 372 unit tests covering all analyzers