Versioning Mysql Data (Not Just Schema) Versioning Mysql Data (Not Just Schema) git git

Versioning Mysql Data (Not Just Schema)


Database (especially their data) are rarely stored in a version control system because it doesn't scale well for large databases.

In your case, if you have not too much data, that could work, especially since a mysqldump can produce a delimited text format (which has a chance to diff against the previous version)

I would still recommend a separate git repo and a dedicated tool to manage both schema and data changes. For instance, LiquidBase can provide "source control for your database".
You also have, as a dedicated specialized database: off-scale.

If you were to do this manually, then you have good practices summarized in "Recipes for Continuous Database Integration".

As mentioned here, even for schema:

I learned the hard way that applying database schema changes cannot be reliably done without a comprehensive step-by-step plan and, similarly, the order of relationship dependencies are important.
Just storing the "current" or "end" schema is not sufficient. There are many changes that cannot be retroactively applied A->C without knowing A->B->C and some changes B might involve migration logic or corrections.


Is your requirements as simply as following:

  • Same back-end code;
  • Use master data in live;
  • End-users (or group) to work on isolated data;
  • No migration, end-users can only modify the data (DML), and are not allowed to modify the schema (DDL);

If these are the requirements, then you can use multiple databases. Consider the following databases in a MySQL server:

  • masterdb
  • branch_demo
  • branch_brian
  • branch_sandbox
  • ...

These databases share the exact same schema, and only the data is different. In each branch, we have a special table (i.e. dbinfo), to keep track of the parent branch (probably masterdb), create datetime, and other details, like access-level, etc.

  • id
  • branchname
  • parent_branch
  • created_on
  • lastmod_on

You can allow end-users to work on separate branches, by simply allowing them to select a particular database in the UI, where masterdb is selected as default, and is used in LIVE.

  • Creating a new branch, would be as simple as cloning a database;
  • Merging a newer branch to master, could be handled using the REPLACE statement in MySQL;

If you want to keep track of changes in the data, you can create a special table to log the activities.