views:

34

answers:

1

I'm nearing the stage of saying "lets go live" of a client's system I've been working on for the past few months, basically a few autonomous services including a public facing website, an intranet website, an hourly exporter from a legacy OLTP DB based on modified flags/triggers etc.. and few others services that compose the system, with each their own specialized database etc.. , communicating with each other via messages (NServiceBus).

When I started I tried to keep a local replication of everything but its proving more and more difficult and on reflection probably a major friction point of the past few weeks, I like to keep regularly up to date as the legacy database is growing and causing hundreds events daily. Having high latency & mediocre bandwidth (between myself and the client's site, I'm in SE Asia where bandwidth is generally crap anyway) is also an issue for RDP, SQL tools, remote connection strings etc.. Tracking down integration bugs and understanding scenarios they present during feedback/integration/QA is also difficult as my data doesn't reflect the current state of the client's DB (the clients' staff have been working and evolving the data their end) and means another break, coffee and lengthy sync again. It would be ideal to do it all locally and then deploy at the end but I have to deliver parts incrementally (to get the check), and some parts are even in use (although not critical) so bug fixing on in use pats needs turn around quick, and with it being a small company, incremental feedback, it helps flush out some of the more vague requirements along the way (curse me).

I was thinking it would be good to have twice daily sync between the environments (their DBs to mine), I somewhat have design control over everything apart from the legacy SQL server database.

What are the best options SO users?

I was thinking of setting up a Windows 2003 light VM on my dev box. And in this install the same setup of the client sites (but not spread across multiple servers obviously). And then for syncing the databases I was thinking about SQL Server replication? or batch scripts? Or is there any better tools - ones that are fast and good compressions? I don't want my changes to go back to production (I have a separate CI & deployment procedure), I just want (I think I want.. tell me if better idea) my databases to be refreshed every night or twice a day (maybe whilst I'm at lunch bandwidth permitting).

How does everyone approach this?

+1  A: 

I would recommend two ways to do this:

  • Snapshot Replication
  • Backing up the transaction log and manually (or batch) applying it

Snapshot replication can be difficult to get working, but it is possible even in offline situations such as physcially carrying snapshots to another location.

The transaction log method can be used as part of your standard backup procedures. ie: A full backup twice a week with transaction log backups more regularly.

Remember that best practice is to cleanse the data before using it in a test environment. At the very least this should be changing all personal data, especially email addresses, passwords and any other method which could result in some automated process making contact with the user in your database.

John
Will snapshot replication automatically overwrite any local changes I make? Say Im testing editing a customer one day, it does snapshot over night, in the morning its all fresh, ideally i.e. my changes are lost (and certainly not sent back to production). snapshot replication handles schema changes automagically?
mattcodes
Schema changes can be a real problem with replication.Your best bet might be to have a copy of the primary database, then create a snapshot of this copy for testing.You then can apply the 'live' transaction logs to the copy, re-snapshot the copy and make changes to the snapshot.Other options you can look at are to make a copy of the database on the live environment, mount it on the live db server, delete rows and anonymise data to make the db smaller, and then work with this.
John