On 6/5/25 12:06, Agis Anastasopoulos wrote:

Hello! I'd like to "preflight" a given schema migration (i.e. one or more DDL statements) before applying it to the production database (e.g. for use in a CI pipeline). I'm thinking of a strategy and would like to know about its soundness.

The general idea is:

- you have a test database that's a clone of your production one (with or without data but with the schema being identical) - given the DDL statements, you open a transaction, grab its pid, and for each statement:   1. from a different "observer" connection, you read pg_locks, filtering locks for that pid. This is the "before" locks
  2. from the first tx, you execute the statement
  3. from the observer, you grab again pg_locks and compute the diff between this and the "before" view
  4. from the first tx, you rollback the transaction

By diffing the after/before pg_locks view, my assumption is that you know what locks will be acquired by the DDL statements (but not for how long). The query I'm thinking is:

    SELECT locktype, database, relation, objid, mode FROM pg_catalog.pg_locks WHERE pid = $1 AND locktype IN ('relation', 'object') AND granted";

The type of statements that would be fed as input would be `ALTER|CREATE TABLE`, `CREATE|DROP INDEX` and perhaps DML statements (`UPDATE`, `INSERT`, `DELETE`).

Do you think this is a robust way to detect the locks that were acquired? Are there any caveats/drawbacks/flaws in this strategy?

Why consume your time in a guessing game, instead of reading the actual docs? In addition to the doc that Adrian suggested, there are the individual docs for each DDL, that list exactly the locks acquired. You may categorize those and think of he estimated traffic of conflicting DML statements from the app. Another more brute force method is to attempt the schema changes while replaying the actual production traffic or something that looks like this. Example : you prepare a logical replicated subscriber that gets all the changes from the production, and attempt the schema migration there : beware to religiously monitor your space and any replication breakage, although all those issues are not show stoppers in pgsql 16+ IIRC.

PS

I am happy to see more Greeks in the lists! How about creating some user group sometime !

Thanks in advance





Reply via email to