Sorry, I should've been more clear above. What I meant to say is that the lack of explicit rollback support was not a mark against Flyway since we'd have to do similar work to accomplish whether we did it w/ Flyway or whether we rolled our own.
I'm currently experimenting w/ Mybatis migrations which has native support for downgrades as well as upgrades. The main caveat there is that we'd have to use a snapshot version of the jar since the one published to Maven Central relies on an incompatible version of the core mybatis jar. On Thu, Mar 24, 2016 at 10:53 AM, Maxim Khutornenko <ma...@apache.org> wrote: > > > > I think in the event that we have to rollback after applying a change > like > > you describe we'd either have to resort to a manual fix or restore from > > backup. > > I am afraid restoring from backup will not be an acceptable solution > if/when a new version has to be rolled back after running for awhile. > > The other thing to keep in mind is that this problem is not solved > > by rolling our own migration solution either. > > I don't see why we can't move data back the same way we moved it forward. > It takes another script to drop new objects, re-create old and migrate > data. What this may not help with is restoring data that has been dropped > completely from the DB but I'd argue that should be a non-issue as nothing > in the scheduler should rely on that data by the time it's dropped. > > How about having two flyway instances to support forward and reverse > migrations? The flyway seems to support it: > https://flywaydb.org/documentation/faq#multiple-schemas. We could have a > SQL or a Java 'afterMigrate' callback (both supported by flyway) to > establish a new baseline upon forward migration that may be used by a > reverse flyway instance to apply rollback scripts in an event of a version > downgrade. > > I feel this is an important problem that we need to have full clarity > around before moving forward with any schema mods. Happy to partake in any > related changes. > > On Thu, Mar 24, 2016 at 7:25 AM, Joshua Cohen <jco...@apache.org> wrote: > > > Flyway has a fairly well reasoned response to the downgrades question: > > https://flywaydb.org/documentation/faq#downgrade > > > > I think in the event that we have to rollback after applying a change > like > > you describe we'd either have to resort to a manual fix or restore from > > backup. The other thing to keep in mind is that this problem is not > solved > > by rolling our own migration solution either. > > > > Another option that may be worth considering is mybatis migrations: > > http://www.mybatis.org/migrations/runtime-migration.html. > > > > On Wed, Mar 23, 2016 at 11:34 PM, Maxim Khutornenko <ma...@apache.org> > > wrote: > > > > > +1 to giving flyway a try. I have used it before and it *mostly* > > > worked. There were a few hiccups occasionally when it couldn’t > > > properly recognize the DB drift and failed to apply the update but > > > that was entirely incremental build-related problem (flyway was > > > integrated into the build process). > > > > > > What flyway does not support is version rollbacks. It's not applicable > > > to this particular change but I am sure there will be changes where > > > we'd need to move data as part of DB upgrade. If we then decide to > > > rollback due to an unforeseen problem we would have to have reverse > > > migration script(s). Not impossible but something to keep in mind. > > > > > > > > > > > > On Wed, Mar 23, 2016 at 4:41 PM, Florian Pfeiffer > > > <florian.pfeif...@gutefrage.net> wrote: > > > > We're using flyway for our services, and from an ops perspective I'm > > > quite > > > > happy with it. On test it's allowed to apply the migrations > > > > automatically... on prod we're doing it manually after reviewing. No > > > > problems so far. > > > > I can't really tell anything from the dev side, beside that I > haven't > > > > heard them complaining about it (and normally they are complaining > > quite > > > > fast ;) )... > > > > > > > > Another thing that's similar to flyway is http://www.liquibase.org/ > > but > > > for > > > > that I have zero experience. > > > > > > > > Flo > > > > > > > > > > > > On 23 March 2016 at 22:41, Joshua Cohen <jco...@apache.org> wrote: > > > > > > > >> If we go with option 2 (which I'm leaning towards as well), does > > anyone > > > >> have thoughts on using (or experience with) something like Flyway: > > > >> https://flywaydb.org/ rather than implementing from scratch? > > > >> > > > >> On Wed, Mar 23, 2016 at 3:29 PM, John Sirois <jsir...@apache.org> > > > wrote: > > > >> > > > >> > On Wed, Mar 23, 2016 at 2:21 PM, Joshua Cohen <jco...@apache.org> > > > wrote: > > > >> > > > > >> > > Hi Aurorans, > > > >> > > > > > >> > > As you may have seen ( > > > >> https://issues.apache.org/jira/browse/AURORA-1648 > > > >> > ), > > > >> > > we ran into an issue when upgrading a cluster that uses > dbScripts > > in > > > >> > > snapshots. To restate the problem from the ticket, when the > > > scheduler > > > >> > > starts up it creates the H2 database from schema.sql which > > contains > > > >> newly > > > >> > > added (or changed) tables. If the dbScript exists in the > snapshot, > > > it > > > >> > then > > > >> > > drops all tables and runs the script which re-creates the > database > > > in > > > >> the > > > >> > > form it was previously in and repopulates all the data. At this > > > point, > > > >> > if a > > > >> > > table was added that was not in the snapshot, that table is > lost. > > > >> > > > > > >> > > The solution here is to be run a migration after restoring the > > > >> database, > > > >> > my > > > >> > > question is what level of complexity do we want for migrations. > I > > > see > > > >> two > > > >> > > possible options: > > > >> > > > > > >> > > > > > >> > > 1. The relatively simple approach where we have a single > > > >> migration.sql > > > >> > > alongside schema.sql which contains any changes to run > against > > > the > > > >> > > database. After restoring the db from a dbScript in the > > > snapshot, we > > > >> > > would > > > >> > > run this script. On release boundaries(?), we clear the > script > > > out. > > > >> > The > > > >> > > main caveat here is that the ddl statements in this script > must > > > be > > > >> > > idempotent since they would potentially be run multiple > times. > > > >> Another > > > >> > > issue is this would make it more complicated to jump over > > > versions > > > >> > > (upgrading from v0.12.0 to v0.14.0 means you might miss a > > > migration > > > >> > that > > > >> > > only existed in the 0.13.0 release). > > > >> > > 2. A slightly more involved approach would be to track the > > schema > > > >> > > version in the database itself. Instead of having a single > > > >> > migration.sql > > > >> > > script that contains all migrations, we could instead have > > > >> > > migrations/001.sql, migrations/002.sql, etc. We'd add a new > > > table to > > > >> > the > > > >> > > database to track which migrations have been run. After > > restoring > > > >> via > > > >> > > dbScript, we'd check the table and run any migrations > necessary > > > (or > > > >> > all > > > >> > > of > > > >> > > the table does not exist). > > > >> > > > > > >> > > Thoughts on these options? > > > >> > > > > > >> > > > > >> > I have used 2 a few times in the past and my take is it only more > > > complex > > > >> > in 1 fixed piece of (java) code that can be well unit tested. The > > sql > > > >> > scripts are easier to read and write and reason about for devs and > > > >> > operators alike. > > > >> > > > > >> > > > > >> > > > > > >> > > Anyone have any alternatives? > > > >> > > > > > >> > > Cheers, > > > >> > > > > > >> > > Joshua > > > >> > > > > > >> > > > > >> > > > > > > > > > > > > > > > > -- > > > > Head of Data & Infrastructure > > > > florian.pfeif...@gutefrage.net > > > > +49-89-515146-173 > > > > > > > > gutefrage.net GmbH > > > > Ein Unternehmen der Verlagsgruppe Georg von Holtzbrinck > > > > Erika-Mann-Str 23 > > > > 80636 München > > > > > >