Based on my experience, I would suggest some combination of database backups and database upgrade scripts. You should keep backups of the production or production-like data (you might be contractually obligated to purge or alter data with names, addresses, bank account numbers of your customers, etc.) for major releases. Starting from that you should be able to get to any intermediate version of your database because you are writing database upgrade scripts and keep them in your source control system (you are currently doing it, right?)
For the practical reasons, you should have at least two separate QA environments: one with the database schema and the application matching your production environment, and another one - matching the version under development.
While database backups are large, you would need to keep only a few latest ones, unless you anticipate a need to do some post-mortem bug analysis on a version that was defunct for several years.