Show HN: Safe Data Changes in PostgreSQL (github.com)
We've consistently heard teams describe challenges with the way manual data updates are handled. Seemingly every engineer we spoke with had examples of errant queries that ended up causing significant harm in production environments (data loss/service interruptions).
We’ve seen a few different approaches to how changes to production databases occur today:
Option 1: all engineers have production write access (highest speed, highest risk)
Option 2: one or a few engineers have write access (medium speed, high risk)
Option 3: engineers request temporary access to make changes (low speed, medium risk)
Option 4: all updates are checked into version control and run manually or through CI/CD (low speed, low risk)
Option 5: no manual updates are made - all changes must go through an internal endpoint (lowest speed, lowest risk)
Our goal is to enable high speed changes with the lowest risk possible. We’re planning to do this by providing an open-source toolkit for safeguarding databases, including the following features:
- Alerts (available now): Receive notifications any time a manual change occurs
- Audit History (beta): View all historical manual changes with context
- Query Preview (coming soon): Preview affected rows and query plan prior to running changes
- Approval Flow (coming soon): Require query review before a change can be run
We’re starting with alerts. Teams can receive Slack notifications anytime an INSERT, UPDATE, or DELETE is executed from a non-application database user. While this doesn’t prevent issues from occurring, it does enable an initial level of traceability and understanding who made an update, what data was changed, and when it occurred.
We’d love to hear feedback from the HN community on how you’ve seen database changes handled, pain points you’ve experienced with data change processes, or generally any feedback on our thinking and approach.
17 comments
[ 5.3 ms ] story [ 49.8 ms ] threadWhat's the simplest way to snapshot a database, perform an operation in app, snapshot it again and get an overview of how many rows were affected in each table? Like an overview of diff. Optionally list changed pkey ids. I tried googling but couldn't find anything like this, so I was thinking of making a DYI solution but wasn't that desperate yet.
If you have multiple DB snapshots and WAL enabled, theoretically you could inspect the log to see what happened inbetween. There's pg_xlogdump for that but I think it will output very raw data...
So you could effectively:
1) Create a snapshot of your production DB -> DB_2A
2) Then create a snapshot of that snapshot -> DB_2B
3) Now you have two copies of the exact same database. Run your query/workload/migration on DB_2B.
4) Run some metadata queries against DB_2A and DB_2B and compare the results.
5) If your metadata queries are inline with expectations, delete the snapshots. If not, leave them around for a bit for manual inspection.
New firm you get your personal account temporary RW permissions via a centralized service.
Got a question: presumably this adds a trigger, that adds some amount of extra work to every query, achieving a benefit for the relatively negligible number of manual queries. Makes me wonder about the performance impact of that trigger?
An article about some performance characteristics in the docs would help a lot to assuage that concern.