{"id":69154,"date":"2020-09-06T16:54:04","date_gmt":"2020-09-06T16:54:04","guid":{"rendered":"https:\/\/www.baeldung.com\/?p=86708"},"modified":"2020-09-06T16:54:04","modified_gmt":"2020-09-06T16:54:04","slug":"rolling-back-migrations-with-flyway","status":"publish","type":"post","link":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/2020\/09\/06\/rolling-back-migrations-with-flyway\/","title":{"rendered":"Rolling Back Migrations with Flyway"},"content":{"rendered":"<p class=\"syndicated-attribution\"><meta name= \\\"keywords \\\" content= \\\"\u96fb\u5b50\u8a08\u7b97\u6a5f, \u6559\u80b2, IT \u96fb\u8166\u73ed,\u96fb\u8166\u88dc\u7fd2\uff0c \u96fb\u8166\u73ed\uff0c \u5bb6\u6559\uff0c \u79c1\u4eba\u8001\u5e2b\uff0c \u8cc7\u8a0a\u6280\u8853\uff0c \u7a0b\u5e8f\u8a2d\u8a08\uff0c \u96fb\u5b50\u8a08\u7b97\u6a5f\uff0c \u904a\u6232\uff0c \u860b\u679c\uff0c \u96fb\u5f71\uff0c \u8a08\u7b97\u6a5f\uff0c\u7de8\u78bc\uff0c Java\uff0c C\/C++\uff0c JavaScript\uff0c PHP\uff0c HTML\uff0c CSS\uff0c MySQL\uff0c mobile\uff0c Android\uff0c \u52d5\u6f2b\uff0c Python\uff0c teacher\uff0c \u88dc\u7fd2\uff0c \u96fb\u8166\u88dc\u7fd2 \u8cc7\u8a0a, \u7535\u5b50\u8ba1\u7b97\u673a, IT ,Game, apple, movie, Computer,student,Java,\u6559\u80b2, ,\u5b66\u751f, \u5b66\u4e60, learn, \u6559\u5b66,  Android, apple,anime, animation, \u4fe1\u606f\u6280\u672f, \u7a0b\u5e8f\u8bbe\u8ba1, \u79fb\u52a8\u7535\u8bdd, \u8cc7\u8a0a\u79d1\u6280,Game, Jeu, Juego,Call Of Duty ,\u4f7f\u547d\u53ec\u559a , \u6e38\u620f, \u7535\u5b50\u6e38\u620f,, \u591a\u4eba\u7535\u5b50\u6e38\u620f, \u7f51\u7edc\u6e38\u620f\uff0conline\uff0conline game, \u624b\u673a\u6e38\u620f, mobile \\\"><\/p>\n<h2 data-id=\"introduction\">1. Introduction<\/h2>\n<div class=\"bd-anchor\" id=\"introduction\"><\/div>\n<p>In this short tutorial, we&#8217;ll explore a couple of ways to rollback a migration with\u00a0<a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/www.baeldung.com\/database-migrations-with-flyway\">Flyway.<\/a><\/p>\n<h2 data-id=\"simulate-rollback-with-a-migration\">2. Simulate Rollback with a Migration<\/h2>\n<div class=\"bd-anchor\" id=\"simulate-rollback-with-a-migration\"><\/div>\n<p>In this section, we&#8217;ll rollback our database using a standard migration file.<\/p>\n<p>In our examples, we&#8217;ll use the command-line version of Flyway. However, the core principles are equally applicable to the other formats, such as the core API, Maven plugin, etc.<\/p>\n<h3 data-id=\"1-create-migration\">2.1. Create Migration<\/h3>\n<div class=\"bd-anchor\" id=\"1-create-migration\"><\/div>\n<p>First, let&#8217;s add a new <em>book<\/em> table to our database.\u00a0In order to do this, we&#8217;ll create a migration file called\u00a0<em>V1_0__create_book_table.sql<\/em>:<\/p>\n<pre><code class=\"language-sql\">create table book (\r\n  id numeric,\r\n  title varchar(128),\r\n  author varchar(256),\r\n  constraint pk_book primary key (id)\r\n);<\/code><\/pre>\n<p>Secondly, let&#8217;s apply the migration:<\/p>\n<pre><code class=\"language-bash\">.\/flyway migrate<\/code><\/pre>\n<h3 data-id=\"2-simulate-rollback\">2.2. Simulate Rollback<\/h3>\n<div class=\"bd-anchor\" id=\"2-simulate-rollback\"><\/div>\n<p>Then, at some point, say we need to reverse the last migration.<\/p>\n<p>In order to\u00a0restore the database to before the <em>book<\/em> table was created, let&#8217;s create migration called\u00a0<em>V2_0__drop_table_book.sql<\/em>:<\/p>\n<pre><code class=\"language-sql\">drop table book;<\/code><\/pre>\n<p>Next, let&#8217;s apply the migration:<\/p>\n<pre><code class=\"language-bash\">.\/flyway migrate<\/code><\/pre>\n<p>Finally, we can check the history of all the migrations using:<\/p>\n<pre><code class=\"language-bash\">.\/flyway info<\/code><\/pre>\n<p>which gives us the following output:<\/p>\n<pre><code class=\"language-bash\">+-----------+---------+-------------------+------+---------------------+---------+\r\n| Category  | Version | Description       | Type | Installed On        | State   |\r\n+-----------+---------+-------------------+------+---------------------+---------+\r\n| Versioned | 1.0     | create book table | SQL  | 2020-08-29 16:07:43 | Success |\r\n| Versioned | 2.0     | drop table book   | SQL  | 2020-08-29 16:08:15 | Success |\r\n+-----------+---------+-------------------+------+---------------------+---------+<\/code><\/pre>\n<p>Notice that our second migration ran successfully.<\/p>\n<p>As far as Flyway is concerned, the second migration file is just another standard migration. The actual restoring of the database to the previous version is done entirely through SQL. For example, in our case, the SQL of dropping the table is the opposite of the first migration, which creates the table.<\/p>\n<p>Using this method, <strong>the audit trail doesn&#8217;t show us that the second migration is related to the first<\/strong>, as they have different version numbers.\u00a0In order to get such an audit trail, we need to use Flyway Undo.<\/p>\n<h2 data-id=\"using-flyway-undo\">3. Using Flyway Undo<\/h2>\n<div class=\"bd-anchor\" id=\"using-flyway-undo\"><\/div>\n<p>Firstly, it&#8217;s important to note that<strong> Flyway Undo is a commercial feature of Flyway and isn&#8217;t available in the Community Edition.<\/strong> Therefore, we&#8217;ll need either the Pro Edition or Enterprise Edition in order to use this feature.<\/p>\n<h3 data-id=\"1-create-migration-files\">3.1. Create Migration Files<\/h3>\n<div class=\"bd-anchor\" id=\"1-create-migration-files\"><\/div>\n<p>First, let&#8217;s create a migration file called\u00a0<em>V1_0__create_book_table.sql<\/em>:<\/p>\n<pre><code class=\"language-sql\">create table book (\r\n  id numeric,\r\n  title varchar(128),\r\n  author varchar(256),\r\n  constraint pk_book primary key (id)\r\n);<\/code><\/pre>\n<p>Secondly, let&#8217;s create the corresponding undo migration file <em>U1_0__create_book_table.sql<\/em>:<\/p>\n<pre><code class=\"language-sql\">drop table book;<\/code><\/pre>\n<p>In our undo migration, notice how the filename prefix is &#8216;U&#8217; compared with the normal migration prefix of &#8216;V&#8217;. Also, in our undo migration files, <strong>we write the SQL that reverses the changes of the corresponding migration file<\/strong>. In our case, we&#8217;re dropping the table that&#8217;s created by the normal migration.<\/p>\n<h3 data-id=\"2-apply-migrations\">3.2. Apply Migrations<\/h3>\n<div class=\"bd-anchor\" id=\"2-apply-migrations\"><\/div>\n<p>Next, let&#8217;s check the current state of the migrations:<\/p>\n<pre><code class=\"language-bash\">.\/flyway -pro info<\/code><\/pre>\n<p>This gives us the following output:<\/p>\n<pre><code class=\"language-bash\">+-----------+---------+-------------------+------+--------------+---------+----------+\r\n| Category  | Version | Description       | Type | Installed On | State   | Undoable |\r\n+-----------+---------+-------------------+------+--------------+---------+----------+\r\n| Versioned | 1.0     | create book table | SQL  |              | Pending | Yes      |\r\n+-----------+---------+-------------------+------+--------------+---------+----------+\r\n<\/code><\/pre>\n<p>Notice the last column, <em>Undoable<\/em>, which indicates Flyway has detected an undo migration file that accompanies our normal migration file.<\/p>\n<p>Next, let&#8217;s apply our migrations:<\/p>\n<pre><code class=\"language-bash\">.\/flyway migrate<\/code><\/pre>\n<p>When it completes, our migrations are complete, and our schema has a new book table:<\/p>\n<pre><code class=\"language-bash\">                List of relations\r\n Schema |         Name          | Type  |  Owner   \r\n--------+-----------------------+-------+----------\r\n public | book                  | table | baeldung\r\n public | flyway_schema_history | table | baeldung\r\n(2 rows)\r\n<\/code><\/pre>\n<h3 data-id=\"3-rollback-the-last-migration\">3.3. Rollback the Last Migration<\/h3>\n<div class=\"bd-anchor\" id=\"3-rollback-the-last-migration\"><\/div>\n<p>Finally, let&#8217;s undo the last migration using the command line:<\/p>\n<pre><code class=\"language-bash\">.\/flyway -pro undo<\/code><\/pre>\n<p>After the command has run successfully, we can check the status of the migrations again:<\/p>\n<pre><code class=\"language-bash\">.\/flyway -pro info<\/code><\/pre>\n<p>which gives us the following output:<\/p>\n<pre><code class=\"language-bash\">+-----------+---------+-------------------+----------+---------------------+---------+----------+\r\n| Category  | Version | Description       | Type     | Installed On        | State   | Undoable |\r\n+-----------+---------+-------------------+----------+---------------------+---------+----------+\r\n| Versioned | 1.0     | create book table | SQL      | 2020-08-22 15:48:00 | Undone  |          |\r\n| Undo      | 1.0     | create book table | UNDO_SQL | 2020-08-22 15:49:47 | Success |          |\r\n| Versioned | 1.0     | create book table | SQL      |                     | Pending | Yes      |\r\n+-----------+---------+-------------------+----------+---------------------+---------+----------+<\/code><\/pre>\n<p>Notice how the undo has been successful, and the first migration is back to pending. Also, in contrast to the first method, the<strong> audit trail clearly shows the migrations that were rolled back.<\/strong><\/p>\n<p>Although Flyway Undo can be useful, <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/flywaydb.org\/documentation\/command\/undo\">it assumes that the whole migration has succeeded.<\/a> For example, it may not work as expected if a migration fails partway through.<\/p>\n<h2 data-id=\"conclusion\">4. Conclusion<\/h2>\n<div class=\"bd-anchor\" id=\"conclusion\"><\/div>\n<p>In this short tutorial, we looked at restoring our database using a standard migration. We also looked at the official way of rolling back migrations using Flyway Undo. As usual, all of our code that relates to this tutorial can be found <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/github.com\/eugenp\/tutorials\/tree\/master\/persistence-modules\/flyway\">over on GitHub.<\/a><\/p>\n<p>The post <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/www.baeldung.com\/flyway-roll-back\/\" >Rolling Back Migrations with Flyway<\/a> first appeared on <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/www.baeldung.com\/\" >Baeldung<\/a>.<\/p>\n<p><Img align=\"left\" border=\"0\" height=\"1\" width=\"1\" alt=\"\" style=\"border:0;float:left;margin:0;padding:0;width:1px!important;height:1px!important;\" hspace=\"0\" src=\"https:\/\/feeds.feedblitz.com\/~\/i\/635136474\/0\/baeldung\"><\/p>\n<div style=\"clear:both;padding-top:0.2em;\"><a title=\"Like on Facebook\" href=\"https:\/\/feeds.feedblitz.com\/_\/28\/635136474\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/fblike20.png\" style=\"border:0;margin:0;padding:0;\"><\/a>&#160;<a title=\"Share on Google+\" href=\"https:\/\/feeds.feedblitz.com\/_\/30\/635136474\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/googleplus20.png\" style=\"border:0;margin:0;padding:0;\"><\/a>&#160;<a title=\"Pin it!\" href=\"https:\/\/feeds.feedblitz.com\/_\/29\/635136474\/baeldung,\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/pinterest20.png\" style=\"border:0;margin:0;padding:0;\"><\/a>&#160;<a title=\"Tweet This\" href=\"https:\/\/feeds.feedblitz.com\/_\/24\/635136474\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/twitter20.png\" style=\"border:0;margin:0;padding:0;\"><\/a>&#160;<a title=\"Subscribe by email\" href=\"https:\/\/feeds.feedblitz.com\/_\/19\/635136474\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/email20.png\" style=\"border:0;margin:0;padding:0;\"><\/a>&#160;<a title=\"Subscribe by RSS\" href=\"https:\/\/feeds.feedblitz.com\/_\/20\/635136474\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/rss20.png\" style=\"border:0;margin:0;padding:0;\"><\/a>&#160;<a rel=\"NOFOLLOW\" title=\"View Comments\" href=\"https:\/\/www.baeldung.com\/flyway-roll-back#respond\"><img decoding=\"async\" height=\"20\" style=\"border:0;margin:0;padding:0;\" src=\"https:\/\/assets.feedblitz.com\/i\/comments20.png\"><\/a>&#160;<a title=\"Follow Comments via RSS\" href=\"https:\/\/www.baeldung.com\/flyway-roll-back\/feed\/\"><img decoding=\"async\" height=\"20\" style=\"border:0;margin:0;padding:0;\" src=\"https:\/\/assets.feedblitz.com\/i\/commentsrss20.png\"><\/a>&#160;<\/div>\n\n<p class=\"syndicated-attribution\"><figure class= \\\"wp-block-image alignnone \\\"><img src= \\\"http:\/\/itteacheritfreelance.hk\/test\/wordpress\/wp-content\/uploads\/2016\/05\/logo2-2.png\\\" alt=\\\"IT\u96fb\u8166\u88dc\u7fd2 java\u88dc\u7fd2 \u70ba\u5927\u5bb6\u914d\u5c0d\u96fb\u8166\u88dc\u7fd2,IT freelance, \u79c1\u4eba\u8001\u5e2b, PHP\u88dc\u7fd2,CSS\u88dc\u7fd2,XML,Java\u88dc\u7fd2,MySQL\u88dc\u7fd2,graphic design\u88dc\u7fd2,\u4e2d\u5c0f\u5b78ICT\u88dc\u7fd2,\u4e00\u5c0d\u4e00\u79c1\u4eba\u88dc\u7fd2\u548cFreelance\u81ea\u7531\u5de5\u4f5c\u914d\u5c0d\u3002\\\"\/><figcaption>\u7acb\u523b\u8a3b\u518a\u53ca\u5831\u540d\u96fb\u8166\u88dc\u7fd2\u8ab2\u7a0b\u5427!<\/figcaption><\/figure>\r\n<\/br>Find A Teacher Form:\r\n<\/br>https:\/\/docs.google.com\/forms\/d\/1vREBnX5n262umf4wU5U2pyTwvk9O-JrAgblA-wH9GFQ\/viewform?edit_requested=true#responses\r\n<\/br><\/br>Email:\r\n<\/br>public1989two@gmail.com<br><br><br><br><br><br><br>\r\n<a href=www.itsec.hk style=color:#FFFFFF;>www.itsec.hk<\/a><br>\r\n<a href=\\\"www.itsec.vip\\\" style=color:#FFFFFF;>www.itsec.vip<\/a><br>\r\n<a href=\\\"www.itseceu.uk\\\" style=color:#FFFFFF;>www.itseceu.uk<\/a><br><\/p>","protected":false},"excerpt":{"rendered":"<div class=\"mh-excerpt\"><p>Learn how to safely roll back migrations using Flyway.<\/p>\n<p>The post <a rel=\"NOFOLLOW noopener noreferrer\" href=\"https:\/\/feeds.feedblitz.com\/~\/635136474\/0\/baeldung~Rolling-Back-Migrations-with-Flyway\/\" target=\"_blank\">Rolling Back Migrations with Flyway<\/a> first appeared on <a rel=\"NOFOLLOW noopener noreferrer\" href=\"https:\/\/www.baeldung.com\/\" target=\"_blank\">Baeldung<\/a>.<\/p>\n<div><a title=\"Like on Facebook\" href=\"https:\/\/feeds.feedblitz.com\/_\/28\/635136474\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/fblike20.png\"><\/a>&nbsp;<a title=\"Share on Google+\" href=\"https:\/\/feeds.feedblitz.com\/_\/30\/635136474\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/googleplus20.png\"><\/a>&nbsp;<a title=\"Pin it!\" href=\"https:\/\/feeds.feedblitz.com\/_\/29\/635136474\/baeldung,\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/pinterest20.png\"><\/a>&nbsp;<a title=\"Tweet This\" href=\"https:\/\/feeds.feedblitz.com\/_\/24\/635136474\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/twitter20.png\"><\/a>&nbsp;<a title=\"Subscribe by email\" href=\"https:\/\/feeds.feedblitz.com\/_\/19\/635136474\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/email20.png\"><\/a>&nbsp;<a title=\"Subscribe by RSS\" href=\"https:\/\/feeds.feedblitz.com\/_\/20\/635136474\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/rss20.png\"><\/a>&nbsp;<a rel=\"NOFOLLOW\" title=\"View Comments\" href=\"https:\/\/www.baeldung.com\/flyway-roll-back#respond\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/comments20.png\"><\/a>&nbsp;<a title=\"Follow Comments via RSS\" href=\"https:\/\/www.baeldung.com\/flyway-roll-back\/feed\/\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/commentsrss20.png\"><\/a>&nbsp;<\/div>\n<\/div>","protected":false},"author":214,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"slim_seo":{"title":"Rolling Back Migrations with Flyway - ITTeacherITFreelance.hk","description":"Learn how to safely roll back migrations using Flyway. The post Rolling Back Migrations with Flyway first appeared on Baeldung . &nbsp; &nbsp; &nbsp; &nbsp; &nb"},"footnotes":""},"categories":[6],"tags":[],"_links":{"self":[{"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/69154"}],"collection":[{"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/users\/214"}],"replies":[{"embeddable":true,"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/comments?post=69154"}],"version-history":[{"count":8,"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/69154\/revisions"}],"predecessor-version":[{"id":76643,"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/69154\/revisions\/76643"}],"wp:attachment":[{"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/media?parent=69154"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/categories?post=69154"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/tags?post=69154"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}