I sent out a review for a prototype of my proposed migration system here:
https://reviews.apache.org/r/45467/

Please take a look at the review and let me know if it seems reasonable at
a high level (noting the caveats called out in the review description, this
is not production quality code, etc.).

The biggest thing I'd like to call out that makes me a bit wary is that it
uses MyBatis Migrations and, as I mentioned right now that means we have to
consume a -SNAPSHOT jar, as for some reason they have not published a new
version to Maven Central since 2014 (even though the project is active on
github.) I opened https://github.com/mybatis/migrations/issues/38 to see
about addressing that.

On Thu, Mar 24, 2016 at 11:00 AM, Joshua Cohen <jco...@apache.org> wrote:

> 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
>> > >
>> >
>>
>
>

Reply via email to