Slide 1

Slide 1 text

Enabling Continuous Delivery with Database Practices Pramod Sadalage @pramodsadalage ThoughtWorks Inc.

Slide 2

Slide 2 text

Agenda Why Continuous Delivery Collaboration with the data team Automation for data Refactoring databases Deploying database changes

Slide 3

Slide 3 text

Why Continuous Delivery?

Slide 4

Slide 4 text

To get fast feedback from users, release frequently

Slide 5

Slide 5 text

Reduce risk of releasing

Slide 6

Slide 6 text

Learning and responding to customer needs is critical

Slide 7

Slide 7 text

Achieve Continuous Delivery

Slide 8

Slide 8 text

Close collaboration between everyone involved in delivery

Slide 9

Slide 9 text

Extensive automation of all parts involved in delivery process

Slide 10

Slide 10 text

Reduce the gap between development and operations

Slide 11

Slide 11 text

CD should involve the database team

Slide 12

Slide 12 text

How does continuous delivery apply to databases?

Slide 13

Slide 13 text

Collaboration techniques

Slide 14

Slide 14 text

Pair the DBA’s and Developers

Slide 15

Slide 15 text

Version control all database scripts and artifacts

Slide 16

Slide 16 text

Automation techniques

Slide 17

Slide 17 text

Let developers provision application database

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

√ × Jai Andy Laptop/Desktop Application Database

Slide 21

Slide 21 text

Continuously Integrate database changes

Slide 22

Slide 22 text

Integration environment Local dev environment ANT Maven Gradle Rake CI Server Source Control Dev Database PROD UAT QA Dev DB PROD UAT QA Environment Check in application code and database migration scripts Update and build Migration scripts (Dev/DBA) Apply migration scripts Migration scripts Artifacts Package Migration scripts War Jar Apply Migration scripts War Jar Integration Database Database changes applied by DBA Team

Slide 23

Slide 23 text

Benefits of CI with databases Test application code and database at one place Generate code and database artifacts Integrate application and database changes in an independent environment Show current state of application and database to all

Slide 24

Slide 24 text

DB artifacts in CI application artifact for build <> database artifact for build <>

Slide 25

Slide 25 text

Tracking Changes Each change is a delta/migration script Migration scripts are development time activity not deployment time tasks Package migration scripts for automated deployment Same scripts for: developers, QA, UAT and Production

Slide 26

Slide 26 text

Tracking Changes

Slide 27

Slide 27 text

Deployment Database migration/upgrade should be a development time task not deployment time task Package all the migration scripts, during Continuous Integration cycle Apply the migration scripts Deploy frequently to reduce risk

Slide 28

Slide 28 text

Database refactoring http://databaserefactoring.com/

Slide 29

Slide 29 text

A database refactoring improves its design while retaining both its behavioral and informational semantics. A database refactoring is a small change to your database schema (the DDL, data, and DB code) which improves its design without changing its semantics.

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

Timeline of Change Transition Transition Period (old and new) { Start Implement the refactoring { Deploy new changes, migrate data, put in scaffolding code Expand End Refactoring completed { Remove old schema, scaffolding code Contract

Slide 32

Slide 32 text

Keeping Old and New alive DB Should be able to handle multiple versions of the application Create Interfaces in the database Wrap tables with views Create calculated columns Create triggers to sync data

Slide 33

Slide 33 text

Expand Contract an example Start name = “Pramod Sadalage” Expand name = “Pramod Sadalage” firstname = “Pramod” lastname = “Sadalage” Contract firstname = “Pramod” lastname = “Sadalage”

Slide 34

Slide 34 text

Expand More on expand contract Start name = “Pramod Sadalage” Contract firstname = “Pramod” lastname = “Sadalage” Without data migration name = “Pramod Sadalage” firstname = null lastname = null With data migration name = “Pramod Sadalage” firstname = “Pramod” lastname = “Sadalage”

Slide 35

Slide 35 text

Simple scenario - DBDeploy ALTER TABLE Customer ADD firstname VARCHAR2(60); ALTER TABLE Customer ADD lastname VARCHAR2(60); --//@UNDO ALTER TABLE Customer DROP COLUMN firstname VARCHAR2(60); ALTER TABLE Customer DROP COLUMN lastname VARCHAR2(60);

Slide 36

Slide 36 text

With synchronized data ALTER TABLE Customer ADD firstname VARCHAR2(60); ALTER TABLE Customer ADD lastname VARCHAR2(60); CREATE OR REPLACE TRIGGER SynchronizeName BEFORE INSERT OR UPDATE ON Customer REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW BEGIN IF :NEW.Name IS NULL THEN :NEW.Name := :NEW.firstname||' '||:NEW.lastname; END IF; IF :NEW.name IS NOT NULL THEN :NEW.firstname := extractfirstname(:NEW.name); :NEW.lastname := extractlastname(:NEW.name); END IF; END; / —//@UNDO ……

Slide 37

Slide 37 text

Migrate and Synchronize data ALTER TABLE Customer ADD firstname VARCHAR2(60); ALTER TABLE Customer ADD lastname VARCHAR2(60); UPDATE Customer set firstname = extractfirstname (name); UPDATE Customer set lastname = extractlastname (name); CREATE OR REPLACE TRIGGER SynchronizeName BEFORE INSERT OR UPDATE …. —//@UNDO …… UPDATE Customer set name = firstname ||’ ‘||lastname WHERE name IS NULL; ALTER TABLE Customer DROP COLUMN firstname; ALTER TABLE Customer DROP COLUMN lastname;

Slide 38

Slide 38 text

Contract ALTER TABLE Customer DROP COLUMN name; —//@UNDO ALTER TABLE Customer ADD name VARCHAR2(120); UPDATE Customer set name = firstname ||’ ‘||lastname WHERE name IS NULL; SET UNUSED name; When drop takes forever

Slide 39

Slide 39 text

Keep legacy apps happy ALTER TABLE Customer DROP COLUMN name; ALTER TABLE CUSTOMER ADD (name AS (generatename (firstname,lastname)) ); —//@UNDO ALTER TABEL Customer DROP COLUMN name; ALTER TABLE Customer ADD name VARCHAR2(120); UPDATE Customer set name = firstname ||’ ‘||lastname WHERE name IS NULL; Virtual column in Oracle, Generated Column in MySQL.

Slide 40

Slide 40 text

Another example

Slide 41

Slide 41 text

Migration script ALTER TABLE custordr rename to customerorder; CREATE OR REPLACE VIEW custordr AS SELECT custordrid, ponumber, ordrdt, shipdate, sptoadid FROM customerorder ; --//@UNDO DROP VIEW custordr; ALTER TABLE customerorder RENAME TO custordr;

Slide 42

Slide 42 text

data in migrations INSERT INTO businessunit ( businessunitid, name, regionid ) VALUES ( 22, 'John Doe Services', 1 ); INSERT INTO businessunit ( businessunitid, name, regionid ) VALUES ( 23, 'Bob Products', 1 ); INSERT INTO businessunit ( businessunitid, name, regionid ) VALUES ( 24, 'Carr Machinery', 1 ); INSERT INTO currency ( currencyid, name, code ) VALUES ( 2, 'Canadian Dollar', 'CAD' ); INSERT INTO currency ( currencyid, name, code ) VALUES ( 3, 'Australian Dollar', 'AUD' ); INSERT INTO currency ( currencyid, name, code ) VALUES ( 4, 'EMU Euro', 'EUR' ); DELETE FROM contact ct WHERE NOT EXISTS (SELECT 1 FROM customer p WHERE ct.contactid=p.contactid) and EXISTS (SELECT 1 FROM (SELECT customerid, COUNT(*) FROM contact WHERE customerid IS NOT NULL GROUP BY customerid HAVING COUNT(*) >1) ct2 WHERE ct.customerid=ct2.customerid);

Slide 43

Slide 43 text

Tips Large refactorings are risky Sequence of many small refactorings can create the desired change Migration scripts should be checked in and run on local dev/ci/qa/uat/prod etc. Changes to data are also migrations

Slide 44

Slide 44 text

Continuous Delivery ant -propertyfile qa.properties upgrade ant -propertyfile live.properties upgrade Deployment should be easy

Slide 45

Slide 45 text

Thanks @pramodsadalage sadalage.com databaserefactoring.com devopsfordba.com