Instant database clones with PostgreSQL 18

(boringsql.com)

117 points | by radimm 5 hours ago

10 comments

  • elitan 9 minutes ago
    For those who can't wait for PG18 or need full instance isolation: I built Velo, which does instant branching using ZFS snapshots instead of reflinks.

    Works with any PG version today. Each branch is a fully isolated PostgreSQL container with its own port. ~2-5 seconds for a 100GB database.

    https://github.com/elitan/velo

    Main difference from PG18's approach: you get complete server isolation (useful for testing migrations, different PG configs, etc.) rather than databases sharing one instance.

  • radarroark 42 minutes ago
    In theory, a database that uses immutable data structures (the hash array mapped trie popularized by Clojure) could allow instant clones on any filesystem, not just ZFS/XFS, and allow instant clones of any subset of the data, not just the entire db. I say "in theory" but I actually built this already so it's not just a theory. I never understood why there aren't more HAMT based databases.
  • majodev 31 minutes ago
    Uff, I had no idea that Postgres v15 introduced WAL_LOG and changed the defaults from FILE_COPY. For (parallel CI) test envs, it make so much sense to switch back to the FILE_COPY strategy ... and I previously actually relied on that behavior.

    Raised an issue in my previous pet project for doing concurrent integration tests with real PostgreSQL DBs (https://github.com/allaboutapps/integresql) as well.

  • BenjaminFaal 1 hour ago
    For anyone looking for a simple GUI for local testing/development of Postgres based applications. I built a tool a few years ago that simplifies the process: https://github.com/BenjaminFaal/pgtt
    • okigan 1 hour ago
      Would love to see a snapshot of the GUI as part of the README.md.

      Also docker link seems to be broken.

      • BenjaminFaal 27 minutes ago
        Fixed the package link. Github somehow made it private. I will add a snapshot right now.
  • christophilus 24 minutes ago
    As an aside, I just jumped around and read a few articles. This entire blog looks excellent. I’m going to have to spend some time reading it. I didn’t know about Postgres’s range types.
  • 1f97 1 hour ago
    • horse666 11 minutes ago
      Aurora clones are copy-on-write at the storage layer, which solves part of the problem, but RDS still provisions you a new cluster with its own endpoints, etc, which is slow ~10 mins, so not really practical for the integration testing use case.
  • TimH 1 hour ago
    Looks like it would probably be quite useful when setting up git worktrees, to get multiple claude code instances spun up a bit more easily.
  • horse666 6 minutes ago
    This is really cool, looking forward to trying it out.

    Obligatory mention of Neon (https://neon.com/) and Xata (https://xata.io/) which both support “instant” Postgres DB branching on Postgres versions prior to 18.

  • 1a527dd5 1 hour ago
    Many thanks, this solves integration tests for us!
  • mvcosta91 2 hours ago
    It looks very interesting for integration tests
    • radimm 2 hours ago
      OP here - yes, this is my use case too: integration and regression testing, as well as providing learning environments. It makes working with larger datasets a breeze.
    • presentation 1 hour ago
      We do this, preview deploys, and migration dry runs using Neon Postgres’s branching functionality - seems one benefit of that vs this is that it works even with active connections which is good for doing these things on live databases.
    • drakyoko 1 hour ago
      would this work inside test containers?
      • radimm 49 minutes ago
        OP here - still have to try (generally operate on VM/bare metal level); but my understanding is that ioctl call would get passed to the underlying volume; i.e. you would have to mount volume