SlideShare a Scribd company logo
1 of 100
@_AlexYates_
#SQLRelay
State-Based or Migrations-Based
Database Development?
A Review of the Pros and Cons…
Alex Yates
@_AlexYates_
#SQLRelay
DLM Consultant
workingwithdevs.com
alex.yates@dlmconsultants.com
AlexYates
@_AlexYates_
@_AlexYates_
#SQLRelay
@_AlexYates_ | #SQLRelay
@_AlexYates_
#SQLRelay
Agile
Scrum
Lean
Iterative
Continuous Delivery
Developers
@_AlexYates_
#SQLRelay
Monitoring
Deployment
Integrity
Performance
DBAs
@_AlexYates_
#SQLRelay
@_AlexYates_
#SQLRelay
Woah! Deployment fail?
@_AlexYates_
#SQLRelay
#worksOnMyMachine
Woah! Deployment fail?
@_AlexYates_
#SQLRelay
A cursor?! You just CAN’T do that?!
@_AlexYates_
#SQLRelay
#worksOnMyMachine
A cursor?! You just CAN’T do that?!
@_AlexYates_
#SQLRelay
Hey, you just dropped my hot-fix!
@_AlexYates_
#SQLRelay
#worksOnMyMachine
Hey, you just dropped my hot-fix!
@_AlexYates_
#SQLRelay
Farm Credit Services of America (FCSA)
• 100 person IT team, 14 sub-teams
• Database version control inconsistent
• Deployment process manual
• Delivery was slow and unreliable
@_AlexYates_
#SQLRelay
Farm Credit Services of America (FCSA)
• Deployments easier to review
• Delivery faster and more reliable
• Standardised source control and delivery process
• Automated manual deployment tasks
@_AlexYates_
#SQLRelay
The automated deployment pipeline
@_AlexYates_
#SQLRelay
Databases are hard
• Schema changes vs existing data
• Reference data vs production data
• Teamwork and testing
• Database drift (change outside
process, e.g. production hot-fixes)
@_AlexYates_
#SQLRelay
There’s
more than
one way to
skin a cat
@_AlexYates_
#SQLRelay
There’s
more than
one way to
skin
automate
a cat
@_AlexYates_
#SQLRelay
V1 V2
@_AlexYates_
#SQLRelay
V1 V2
Migrations-based solutions
@_AlexYates_
#SQLRelay
V1 V2
State-based solutions
@_AlexYates_
#SQLRelay
@_AlexYates_
#SQLRelay
“There's nothing more
reliable than keeping
track of exactly the
scripts you intend to run,
and running them, without
trying to compare state
and guess.”
@_AlexYates_
#SQLRelay
“There's nothing more
reliable than keeping
track of exactly the
scripts you intend to run,
and running them, without
trying to compare state
and guess.”
Paul Stovell,
Octopus Deploy
http://docs.octopusdeploy.com/display/OD/SQL+Server+databases
@_AlexYates_
#SQLRelay
“As soon as you have
multiple changes on a
single aspect of an object,
ordering and the ability to
detect which change
needs to be made gets
very complicated.”
@_AlexYates_
#SQLRelay
“As soon as you have
multiple changes on a
single aspect of an object,
ordering and the ability to
detect which change
needs to be made gets
very complicated.”
Gert Drapers,
built DataDude
https://blogs.msdn.microsoft.com/gertd/2009/06/05/declarative-database-development/
@_AlexYates_
#SQLRelay
Migrations vs state
http://workingwithdevs.com/delivering-databases-migrations-vs-state/
@_AlexYates_
#SQLRelay
Migrations vs state
http://workingwithdevs.com/delivering-databases-migrations-vs-state/
@_AlexYates_
#SQLRelay
Migrations vs state
http://workingwithdevs.com/delivering-databases-migrations-vs-state/
@_AlexYates_
#SQLRelay
Migrations vs state
http://workingwithdevs.com/delivering-databases-migrations-vs-state/
@_AlexYates_
#SQLRelay
Migrations vs state
http://workingwithdevs.com/delivering-databases-migrations-vs-state/
@_AlexYates_
#SQLRelay
Migrations vs state
http://workingwithdevs.com/delivering-databases-migrations-vs-state/
@_AlexYates_
#SQLRelay
Migrations vs state
http://workingwithdevs.com/delivering-databases-migrations-vs-state/
@_AlexYates_
#SQLRelay
11
2 Create view: kittenTrainersNrLdn
Selects only: kittenTrainers.FullName
Edit table: kittenTrainers
Add column: AcceptsTigerCubs BIT
Both work!
Same changes, versioned and deployed two ways
@_AlexYates_
#SQLRelay
Demo
@_AlexYates_
#SQLRelay
11
2 Create view: kittenTrainersNrLdn
Selects only: kittenTrainers.FullName
Edit table: kittenTrainers
Add column: AcceptsTigerCubs BIT
Both work!
Same changes, versioned and deployed two ways
@_AlexYates_
#SQLRelay
11
Edit table: kittenTrainers
Split column trainerFullName
into trainerFirstName
and trainerLastName
But both suck.
A tale of two work items…
2
Edit view: kittenTrainersNrLdn
Add column: AcceptsTigerCubs
@_AlexYates_
#SQLRelay
@_AlexYates_
#SQLRelay
0124_edit_view.sql
ALTER VIEW
kittenTrainersNrLdn
AS
SELECT
fullName,
acceptsTigerCubs
FROM kittenTrainers
@_AlexYates_
#SQLRelay
0124_edit_view.sql 0125_edit_table.sql
ALTER VIEW
kittenTrainersNrLdn
AS
SELECT
fullName,
acceptsTigerCubs
FROM kittenTrainers
ALTER TABLE
kittenTrainers
*FUN WITH STRINGS*
END
ALTER VIEW
kittenTrainersNrLdn
AS
SELECT
firstName,
lastName
FROM kittenTrainers
@_AlexYates_
#SQLRelay
ALTER TABLE
kittenTrainers
*FUN WITH STRINGS*
END
ALTER VIEW
kittenTrainersNrLdn
AS
SELECT
firstName,
lastName
FROM kittenTrainers
0124_edit_view.sql 0125_edit_table.sql
!
ALTER VIEW
kittenTrainersNrLdn
AS
SELECT
fullName,
acceptsTigerCubs
FROM kittenTrainers
@_AlexYates_
#SQLRelay
Conflicts easily missed
Changes overwritten, hard to spot
Order matters
Last script wins
The “winding path” problem
How do you fix a bug that has been deployed to
some environments but not others?
The problem with migrations
@_AlexYates_
#SQLRelay
V123
kittenTrainersNrLdn.sql
CREATE VIEW kittenTrai…
AS
SELECT
fullName
FROM kittenTrainers
@_AlexYates_
#SQLRelay
V124
kittenTrainersNrLdn.sql
CREATE VIEW kittenTrai…
AS
SELECT
fullName,
acceptsTigerCubs
FROM kittenTrainers
V123
kittenTrainersNrLdn.sql
CREATE VIEW kittenTrai…
AS
SELECT
fullName
FROM kittenTrainers
@_AlexYates_
#SQLRelay
V125
kittenTrainersNrLdn.sql
CREATE VIEW kittenTrai…
AS
SELECT
firstName,
lastName
FROM kittenTrainers
V124
kittenTrainersNrLdn.sql
CREATE VIEW kittenTrai…
AS
SELECT
fullName,
acceptsTigerCubs
FROM kittenTrainers
V123
kittenTrainersNrLdn.sql
CREATE VIEW kittenTrai…
AS
SELECT
fullName
FROM kittenTrainers
@_AlexYates_
#SQLRelay
V125
kittenTrainersNrLdn.sql
CREATE VIEW kittenTrai…
AS
SELECT
firstName,
lastName
FROM kittenTrainers
V124
kittenTrainersNrLdn.sql
CREATE VIEW kittenTrai…
AS
SELECT
fullName,
acceptsTigerCubs
FROM kittenTrainers
V123
kittenTrainersNrLdn.sql
CREATE VIEW kittenTrai…
AS
SELECT
fullName
FROM kittenTrainers
!
@_AlexYates_
#SQLRelay
@_AlexYates_
#SQLRelay
REVISION 123 REVISION 124
kittenTrainers.sql
CREATE TABLE kittenTrainers
(fullName,
acceptsTigerCubs)
kittenTrainersNrLdn.sql
CREATE VIEW kittenTrainersN…
AS
SELECT fullName
FROM kittenTrainers
kittenTrainers.sql
CREATE TABLE kittenTrainers
(firstName,
lastName,
acceptsTigetCubs)
kittenTrainersNrLdn.sql
CREATE VIEW kittenTrainersN…
AS
SELECT firstName,
lastName,
acceptsTigerCubs
FROM kittenTrainers
@_AlexYates_
#SQLRelay
Diff script:
DROP COLUMN fullName
ALTER TABLE kittenTrainers
ADD FirstName NVARCHAR(50),
LastName NVARCHAR(50)
ALTER VIEW kittenTrainersNrLdn
AS
…
@_AlexYates_
#SQLRelay
Diff script:
DROP COLUMN fullName
ALTER TABLE kittenTrainers
ADD FirstName NVARCHAR(50),
LastName NVARCHAR(50)
ALTER VIEW kittenTrainersNrLdn
AS
…
!
@_AlexYates_
#SQLRelay
Script:
DROP COLUMN fullName
ALTER TABLE kittenTrai…
ADD FirstName,
LastName
ALTER VIEW kittenTrain…
AS
…
Need to understand your tool
 It should be obvious to you that
your tool won’t work
What is the Plan B / override?
 Because one day you’ll need it
Test for data loss
 Automatically (naturally)
The problem with state
@_AlexYates_
#SQLRelay
So what is better?
State MigrationsVS
@_AlexYates_
#SQLRelay
State
 Easier (less control)
 Better for sprocs/functions
 Better for large/distributed
teams
 Better for frequent changes
 Better for dependency
nightmares
 Drift: rolled back
Migrations
 More control (harder/needs
discipline)
 Better for data migrations
 Better for small teams
 Better for infrequent
changes
 Better for simple data stores
 Drift: ignored
VS
@_AlexYates_
#SQLRelay
State
 Easier (less control)
 Better for sprocs/functions
 Better for large/distributed
teams
 Better for frequent changes
 Better for dependency
nightmares
 Drift: rolled back
 Better for development
Migrations
 More control (harder/needs
discipline)
 Better for data migrations
 Better for small teams
 Better for infrequent
changes
 Better for simple data stores
 Drift: ignored
 Better for automation
VS
@_AlexYates_
#SQLRelay
Pick appropriate tooling
State
DevArt Schema
Compare
DB Maestro
Migrations
DbUp
Flyway
Hybrid
@_AlexYates_
#SQLRelay
Let’s talk about:
https://msdn.microsoft.com/en-us/library/mt204009.aspx
@_AlexYates_
#SQLRelay
How does SSDT work?
Most scripts do not require
manual scripting
Manual scripting causes problems
@_AlexYates_
#SQLRelay
How does SQL Source Control work?
Most scripts do not require
manual scripting
Manual scripting causes problems
Perhaps just these ones?
So only write these ones
@_AlexYates_
#SQLRelay
How does SSDT work?
https://msdn.microsoft.com/en-US/library/hh272704(v=vs.103).aspx
https://msdn.microsoft.com/en-us/library/jj889461(v=vs.103).aspx
<< RefactorLog
Pre/Post-Deploy scripts >>
@_AlexYates_
#SQLRelay
Let’s talk about:
http://www.red-gate.com/sql-source-control/
@_AlexYates_
#SQLRelay
How does SQL Source Control work?
(This diagram again)
We still only need a few upgrade scripts
@_AlexYates_
#SQLRelay
How does SQL Source Control work?
@_AlexYates_
#SQLRelay
How does SQL Source Control work?
https://documentation.red-gate.com/display/SOC5/How+migration+scripts+work c
@_AlexYates_
#SQLRelay
Let’s talk about:
http://www.red-gate.com/readyroll/
@_AlexYates_
#SQLRelay
State
 Easier (less control)
 Better for sprocs/functions
 Better for large/distributed
teams
 Better for frequent changes
 Better for dependency
nightmares
 Drift: rolled back
Migrations
 More control (harder/needs
discipline)
 Better for data migrations
 Better for small teams
 Better for infrequent
changes
 Better for simple data stores
 Drift: ignored
Better for sprocs/functions
Better data migrations
How does ReadyRoll work?
@_AlexYates_
#SQLRelay
How does ReadyRoll work?
Programmable objects
(Views, stored procedures etc)
V125
myproc.sql
EXEC sp_rename
'table_foo',
'table_bar‘
Migrations
(Tables, reference data etc)
@_AlexYates_
#SQLRelay
How does ReadyRoll work?
Programmable objects
(Views, stored procedures etc)
V125
myproc.sql
EXEC sp_rename
'table_foo',
'table_bar‘
Migrations
(Tables, reference data etc)
@_AlexYates_
#SQLRelay
How does ReadyRoll work?
Programmable objects
(Views, stored procedures etc)
V125
myproc.sql
EXEC sp_rename
'table_foo',
'table_bar‘
Migrations
(Tables, reference data etc)
https://documentation.red-gate.com/display/RR1/Programmable+Objects
@_AlexYates_
#SQLRelay
But haven’t we been doing
hybrid for years?
@_AlexYates_
#SQLRelay
ProdTestDev
@_AlexYates_
#SQLRelay
ProdTestDev
@_AlexYates_
#SQLRelay
ProdTestDev S0
@_AlexYates_
#SQLRelay
ProdTestDev S0
S0
@_AlexYates_
#SQLRelay
ProdTestDev S0
S0
State Migrations
@_AlexYates_
#SQLRelay
Prod
Test
Dev
S0
“Late migrations”
S1
Prod
Test
Dev S0
“Early migrations”
@_AlexYates_
#SQLRelay
Early vs Late
• Test deploy script early 
• Easier to automate 
• Developers own deployments
(typically)
• Optimised deployment
scripts (no winding path) 
• Easier to intervene 
• DBAs own deployments
(typically)
@_AlexYates_
#SQLRelay
Drift
@_AlexYates_
#SQLRelay
@_AlexYates_
#SQLRelay
“When making changes
directly on production, you are
making a decision that the
delay due to poor cycle time is
more expensive than the risk of
making a mistake.”
@_AlexYates_
#SQLRelay
“When making changes
directly on production, you are
making a decision that the
delay due to poor cycle time is
more expensive than the risk of
making a mistake.”
AlexYates,
Built this slide
@_AlexYates_
#SQLRelay
The bad stuff:
• Accidental roll-backs
(state)
• Failed deployments
(migrations)
• Environment inconsistency
(migrations)
@_AlexYates_
#SQLRelay
Drift
Strategies to help
 Improve cycle time
 Strict security policies
 Monitor drift (play with DDL
triggers)
 Redgate DLM Dashboard (free)
https://www.simple-talk.com/sql/database-administration/database-deployment-the-bits-database-version-drift/
@_AlexYates_
#SQLRelay
Drift
Strategies to help
 Improve cycle time
 Strict security policies
 Monitor drift (play with DDL
triggers)
 Redgate DLM Dashboard (free)
http://www.red-gate.com/products/dlm/dlm-dashboard/
@_AlexYates_
#SQLRelay
Demo
@_AlexYates_
#SQLRelay
Farm Credit Services of America (FCSA)
• Standardised DLM processes
• FCSA delivering much more efficiently
• The FCSA model being rolled out at FCMA (sister org)
• The team all have excellent CV’s
@_AlexYates_
#SQLRelay
@_AlexYates_
#SQLRelay
Siloed sparrows suck at DLM
@_AlexYates_
#SQLRelay
Heated hippos are closed minded
@_AlexYates_
#SQLRelay
State
 Easier (less control)
 Better for sprocs/functions
 Better for large/distributed
teams
 Better for frequent changes
 Better for dependency
nightmares
 Drift: rolled back
 Better for development
Migrations
 More control (harder/needs
discipline)
 Better for data migrations
 Better for small teams
 Better for infrequent
changes
 Better for simple data stores
 Drift: ignored
 Better for automation
VS
Clever people consider options
@_AlexYates_
#SQLRelay
State
DevArt Schema
Compare
DB Maestro
Migrations
DbUp
Flyway
Hybrid
Hybrid tools are awesomeTools are pretty good
@_AlexYates_
#SQLRelay
Prod
Test
Dev
S0
“Late migrations”
S1
Prod
Test
Dev S0
“Early migrations”
It’s a balance, not a choice
@_AlexYates_
#SQLRelay
Hunt his smug face - make pain on it
@_AlexYates_
#SQLRelay
This stuff makes a big difference
http://www.codeaperture.io/2016/09/13/how-redgate-helped-define-our-process/
@_AlexYates_
#SQLRelay
Questions?
@_AlexYates_
#SQLRelay
DLM Consultant
workingwithdevs.com
alex.yates@dlmconsultants.com
Alex Yates
@_AlexYates_
@_AlexYates_
#SQLRelay
PREMIER SPONSOR
GOLD SPONSORS
SILVER SPONSORS
BRONZE SPONSORS
SUPPORTERS
@_AlexYates_
#SQLRelay
Please give us your feedback:
sqlrelay.co.uk/feedback
Thank you
@_AlexYates_
#SQLRelay
Image sources
Author Source Information
Chiltepinster Wikimedia Commons Mocking Bird Argument.jpg – Wikimedia Commons. This file is licensed under the Creative Commons Attribution-Share
Alike 3.0 Unported license. Source on Wikimedia Commons: “Own work”
Bit Boy Flickr The elephant in the room – Flickr. This file is licensed under the Creative Commons Attribution 2.0 Generic license.
Nils Rinaldi Flickr Hippo fight 2/3 – Flickr. This file is licensed under the Creative Commons Attribution 2.0 Generic license.
My own collection Taken by/property of Alex Yates Kitten, “There’s more than one way to skin a cat!”
Memegenerator.net Memegenerator.net I don’t always edit database. Content designed to be shared and delivered with credit to memegenerator.net.
Ctrl.Alt.Design ctrla.lt Social Media share icons

More Related Content

More from Alex Yates

Getting Release Management Right for SQL Server
Getting Release Management Right for SQL ServerGetting Release Management Right for SQL Server
Getting Release Management Right for SQL ServerAlex Yates
 
Getting CI right for SQL Server
Getting CI right for SQL ServerGetting CI right for SQL Server
Getting CI right for SQL ServerAlex Yates
 
Getting CI right for SQL Server
Getting CI right for SQL ServerGetting CI right for SQL Server
Getting CI right for SQL ServerAlex Yates
 
DevOps 101 for data professionals
DevOps 101 for data professionalsDevOps 101 for data professionals
DevOps 101 for data professionalsAlex Yates
 
Database DevOps Anti-patterns
Database DevOps Anti-patternsDatabase DevOps Anti-patterns
Database DevOps Anti-patternsAlex Yates
 
DevOps 101 for data professionals
DevOps 101 for data professionalsDevOps 101 for data professionals
DevOps 101 for data professionalsAlex Yates
 

More from Alex Yates (7)

GDPR and DLM
GDPR and DLMGDPR and DLM
GDPR and DLM
 
Getting Release Management Right for SQL Server
Getting Release Management Right for SQL ServerGetting Release Management Right for SQL Server
Getting Release Management Right for SQL Server
 
Getting CI right for SQL Server
Getting CI right for SQL ServerGetting CI right for SQL Server
Getting CI right for SQL Server
 
Getting CI right for SQL Server
Getting CI right for SQL ServerGetting CI right for SQL Server
Getting CI right for SQL Server
 
DevOps 101 for data professionals
DevOps 101 for data professionalsDevOps 101 for data professionals
DevOps 101 for data professionals
 
Database DevOps Anti-patterns
Database DevOps Anti-patternsDatabase DevOps Anti-patterns
Database DevOps Anti-patterns
 
DevOps 101 for data professionals
DevOps 101 for data professionalsDevOps 101 for data professionals
DevOps 101 for data professionals
 

Recently uploaded

Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksSoftradix Technologies
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?XfilesPro
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptxLBM Solutions
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 

Recently uploaded (20)

Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other Frameworks
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food Manufacturing
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping Elbows
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptx
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 

Database version control and deployment - model or migration scripts

Editor's Notes

  1. This is Alex, he writes software to help you achieve DevOps for databases. This is Alex,
  2. Who has read a book?
  3. Show of hands… Who is a developer? Project manager? Do we have any DBAs? DBAs care about… NEXT SLIDE
  4. DBAs care about this stuff. Two buisness entities with different goals. It causes friction. NEXT SLIDE
  5. Sometimes OPS fail
  6. Sometimes OPS fail
  7. Sometimes OPS fail
  8. Sometimes OPS fail
  9. Sometimes OPS fail
  10. Sometimes OPS fail
  11. Sometimes OPS fail
  12. We’ve all done DevOps right. It looks like this. VCS, CI, RM. We are versioning, packaging and deploying our webapps. Maybe we’ve gone serverless? Everything is in source control and all our infrastructure is disposable. Right?
  13. We’ve all done DevOps right. It looks like this. VCS, CI, RM. We are versioning, packaging and deploying our webapps. Maybe we’ve gone serverless? Everything is in source control and all our infrastructure is disposable. Right?
  14. We’ve all done DevOps right. It looks like this. VCS, CI, RM. We are versioning, packaging and deploying our webapps. Maybe we’ve gone serverless? Everything is in source control and all our infrastructure is disposable. Right?
  15. What about databases? The persistent data the our businesses our built on? Schema changes vs existing data There is an odd relationship here between how you want the code to look and how you update prod. You can’t simply drop and replace the DB because you’ll lose your data. You have to create some sort of upgrade script. Twice as much code normally means twice as many errors and if the state you want and your way to get there don’t match, which is right? What is your source of truth? Without a clear idea of your source of truth – how is DevOps even possible? Reference data vs production data But while the database has existing data, not all of it is ‘production’ data in that sense. What about country codes? Reference data, lookup data, static data, the data that makes your system work. This data needs to get deployed with your schema changes. And you also need to think about how to transfer data in the other direction for testing. How do you test the latest dev build with production (or-production-like) data? Teamwork and testing The word DevOps refers to the problems associated with siloed Dev and Ops teams. Nowhere is this more apparent than in the land of the database? Is there anyone here who has never heard of any problems between Dev and DBA teams? But it goes further than that. With application source code we use source control, we invented distributed source control systems and we debate about the optimal branching strategies and strategies for implementing continuous integration. We’ve barely begun to have these conversations about databases. We barely have strategies for how to provision individual developers with their own sandboxes. Sometimes different developers work in different ways, some working off scripts and others working directly on the database. We need a better way of working together. And finally testing. Our problems with database source control and acquiring suitable test data make it hard for us to provision test database environments manually, let alone automatically. Database drift And all these problems result in this final point. In DevOps and Continuous Delivery we often talk about cycle time. How long would it take you to make a one line change, run it through your normal testing process and get it to production? If the cycle time for your database is measured in days, weeks or months (or years?) then when you hit a production issue you don’t have time to go back to your source code. The business is haemorrhaging money and the DBA will make a decision: What is more expensive, the cost of delaying the fix, or the risk of making that low risk change now and fixing the problem right away. It’s all well and good wagging your finger at people who choose to make hot-fixes directly on production, but until we sort out the cycle time problem, it won’t go away. Production drift is a symptom of poor DevOps or DLM strategy. And drift causes more problems: Environment inconsistencies undermine your tests and can cause failed deployments either because code clashes or because important fixes are accidentally rolled back. Drift and poor DevOps processes are a vicious circle that needs to be broken.
  16. For example, Paul Stovell (creator of Octopus Deploy) basically says the migrations approach is reliable and provides the functionality to handle the deployment whatever way works.
  17. For example, Paul Stovell (creator of Octopus Deploy) basically says the migrations approach is reliable and provides the functionality to handle the deployment whatever way works.
  18. Essentially, here is the challenge: get from one state to another, using some upgrade script. NEXT SLIDE…
  19. This leads some to think about database migrations in terms of the upgrade scripts… The source of truth is the upgrade script. Developers write upgrade scripts. They give these scripts to DBAs to review. The scripts get run in a specified order. A simple concept, and one that is easy to automate. It’s the sort of solution that you can hack together in an afternoon or you can use one of the open source frameworks like DbUp or Flyway. It’s pretty straightforward for users to understand how it all works. NEXT SLIDE…
  20. Other people still see the value/need to consider the state. This is important for repeatable testing etc. Migrations become a deployment detail because some would argue that scripting out every minor change is an overhead and opens up possibility of human error. This has the added benefit that it is easier to think declaratively about how specific objects should look. Arguably it is easier to handle source control, branching, merging and CI tasks this way. NEXT SLIDE…
  21. For example, Paul Stovell (creator of Octopus Deploy) basically says the migrations approach is reliable and provides the functionality to handle the deployment whatever way works.
  22. For example, Paul Stovell (creator of Octopus Deploy) basically says the migrations approach is reliable and provides the functionality to handle the deployment whatever way works.
  23. For example, Paul Stovell (creator of Octopus Deploy) basically says the migrations approach is reliable and provides the functionality to handle the deployment whatever way works.
  24. For example, Paul Stovell (creator of Octopus Deploy) basically says the migrations approach is reliable and provides the functionality to handle the deployment whatever way works.
  25. For example, Paul Stovell (creator of Octopus Deploy) basically says the migrations approach is reliable and provides the functionality to handle the deployment whatever way works.
  26. So what is better? Well, this is my attempt to summarise. The answer is neither is perfect. Generally, if the stuff on the left sounds more like your database, you’ll probably find a state based solution works better for you and visa verca. However, most people don’t live entirely on one side or the other. Let’s look at the tools available.
  27. So what is better? Well, this is my attempt to summarise. The answer is neither is perfect. Generally, if the stuff on the left sounds more like your database, you’ll probably find a state based solution works better for you and visa verca. However, most people don’t live entirely on one side or the other. Let’s look at the tools available.
  28. So what is better? Well, this is my attempt to summarise. The answer is neither is perfect. Generally, if the stuff on the left sounds more like your database, you’ll probably find a state based solution works better for you and visa verca. However, most people don’t live entirely on one side or the other. Let’s look at the tools available.
  29. So what is better? Well, this is my attempt to summarise. The answer is neither is perfect. Generally, if the stuff on the left sounds more like your database, you’ll probably find a state based solution works better for you and visa verca. However, most people don’t live entirely on one side or the other. Let’s look at the tools available.
  30. So what is better? Well, this is my attempt to summarise. The answer is neither is perfect. Generally, if the stuff on the left sounds more like your database, you’ll probably find a state based solution works better for you and visa verca. However, most people don’t live entirely on one side or the other. Let’s look at the tools available.
  31. So what is better? Well, this is my attempt to summarise. The answer is neither is perfect. Generally, if the stuff on the left sounds more like your database, you’ll probably find a state based solution works better for you and visa verca. However, most people don’t live entirely on one side or the other. Let’s look at the tools available.
  32. So what is better? Well, this is my attempt to summarise. The answer is neither is perfect. Generally, if the stuff on the left sounds more like your database, you’ll probably find a state based solution works better for you and visa verca. However, most people don’t live entirely on one side or the other. Let’s look at the tools available.
  33. I’m here to say neither solution is perfect. I’m going to explain it with an example. Let’s say my team has two tickets/work items. Each is picked up by a different developer.
  34. I’m here to say neither solution is perfect. I’m going to explain it with an example. Let’s say my team has two tickets/work items. Each is picked up by a different developer.
  35. I’m here to say neither solution is perfect. I’m going to explain it with an example. Let’s say my team has two tickets/work items. Each is picked up by a different developer.
  36. Let’s use a migrations approach first…
  37. Developer A alters the sproc like this…
  38. Developer A alters the sproc like this…
  39. Developer A alters the sproc like this…
  40. This brings me to the nub of the problem: With migrations you have to maintain many upgrade scripts. Strength: Complete control. Power and responsibility. Weakness: Challenge to manage. Winding path. So clearly migrations is broken – lets try state…
  41. Developer B adds their version
  42. Developer B adds their version
  43. Developer B adds their version
  44. Developer B adds their version
  45. But conflicts are a known problem and there is plenty of software to help with that. This is KDiff. Its free and open source. There are many other options. Many source control systems have equivalent functionality built in. Problem solved right? Ahem. Maybe. Let’s talk about that table rename…
  46. Here is the difference between the before and after state for the table and the sproc, with the differences highlighted in red. Now I’m going to use some sort of software tool to generate an upgrade script. Who can guess why this will fail? Anyone?
  47. That DROP TABLE could be a problem right? Diff tools that generate your upgrade scripts do not know the context for stuff. They see Table A on one side and table B on the other side and don’t know about the relationship between them. The don’t know how you got from one state to the other so they make it up. In this case by building a brand new table instead of renaming the existing table. If you cared about the data in table_foo you might not want to automate the deployment of this script. You can get similar issues with column re-names, table splits/merges, column splits/merges, adding not-null columns to tables with existing data, data migrations that won’t get picked up by schema diff tools etc. Also, when deployment scripts are generated badly they can have exceptionally poor performance. Often a skilled DBA will be able to significantly improve the performance of the upgrade script.
  48. That DROP TABLE could be a problem right? Diff tools that generate your upgrade scripts do not know the context for stuff. They see Table A on one side and table B on the other side and don’t know about the relationship between them. The don’t know how you got from one state to the other so they make it up. In this case by building a brand new table instead of renaming the existing table. If you cared about the data in table_foo you might not want to automate the deployment of this script. You can get similar issues with column re-names, table splits/merges, column splits/merges, adding not-null columns to tables with existing data, data migrations that won’t get picked up by schema diff tools etc. Also, when deployment scripts are generated badly they can have exceptionally poor performance. Often a skilled DBA will be able to significantly improve the performance of the upgrade script.
  49. So while the state based approach is arguably better for development and teamwork and for certain types of objects, it could have disastrous consequences when it goes wrong. If you are going to employ this approach you need to know the software you are using. (And by the way, you probably need to pay for it. Diff tools are more expensive and there aren’t any open source options. T’s worth investing in a good one for obvious reasons.) You need to be skilled at spotting when it will go wrong. You need to have some sort of review process and a plan B. This often means you still need a fair amount of manual steps in your deployment process, which is counter to the ideas at the root of DevOps.
  50. So what is better? Well, this is my attempt to summarise. The answer is neither is perfect. Generally, if the stuff on the left sounds more like your database, you’ll probably find a state based solution works better for you and visa verca. However, most people don’t live entirely on one side or the other. Let’s look at the tools available.
  51. So what is better? Well, this is my attempt to summarise. The answer is neither is perfect. Generally, if the stuff on the left sounds more like your database, you’ll probably find a state based solution works better for you and visa verca. However, most people don’t live entirely on one side or the other. Let’s look at the tools available.
  52. So what is better? Well, this is my attempt to summarise. The answer is neither is perfect. Generally, if the stuff on the left sounds more like your database, you’ll probably find a state based solution works better for you and visa verca. However, most people don’t live entirely on one side or the other. Let’s look at the tools available.
  53. So what is better? Well, this is my attempt to summarise. The answer is neither is perfect. Generally, if the stuff on the left sounds more like your database, you’ll probably find a state based solution works better for you and visa verca. However, most people don’t live entirely on one side or the other. Let’s look at the tools available.
  54. Once you figure this out, a lot of the rest of the problems kind of work themselves out. If you only use migration scripts for your tables you have less of them, they are easier to manage and there is less chance of a conflict. If you only use state for the objects that don’t touch the data you avoid the risk of migration scripts corrupting data or taking 8 hours to run.
  55. Once you figure this out, a lot of the rest of the problems kind of work themselves out. If you only use migration scripts for your tables you have less of them, they are easier to manage and there is less chance of a conflict. If you only use state for the objects that don’t touch the data you avoid the risk of migration scripts corrupting data or taking 8 hours to run.
  56. Once you figure this out, a lot of the rest of the problems kind of work themselves out. If you only use migration scripts for your tables you have less of them, they are easier to manage and there is less chance of a conflict. If you only use state for the objects that don’t touch the data you avoid the risk of migration scripts corrupting data or taking 8 hours to run.
  57. Once you figure this out, a lot of the rest of the problems kind of work themselves out. If you only use migration scripts for your tables you have less of them, they are easier to manage and there is less chance of a conflict. If you only use state for the objects that don’t touch the data you avoid the risk of migration scripts corrupting data or taking 8 hours to run.
  58. Once you figure this out, a lot of the rest of the problems kind of work themselves out. If you only use migration scripts for your tables you have less of them, they are easier to manage and there is less chance of a conflict. If you only use state for the objects that don’t touch the data you avoid the risk of migration scripts corrupting data or taking 8 hours to run.
  59. Once you figure this out, a lot of the rest of the problems kind of work themselves out. If you only use migration scripts for your tables you have less of them, they are easier to manage and there is less chance of a conflict. If you only use state for the objects that don’t touch the data you avoid the risk of migration scripts corrupting data or taking 8 hours to run.
  60. Once you figure this out, a lot of the rest of the problems kind of work themselves out. If you only use migration scripts for your tables you have less of them, they are easier to manage and there is less chance of a conflict. If you only use state for the objects that don’t touch the data you avoid the risk of migration scripts corrupting data or taking 8 hours to run.
  61. Once you figure this out, a lot of the rest of the problems kind of work themselves out. If you only use migration scripts for your tables you have less of them, they are easier to manage and there is less chance of a conflict. If you only use state for the objects that don’t touch the data you avoid the risk of migration scripts corrupting data or taking 8 hours to run.
  62. Once you figure this out, a lot of the rest of the problems kind of work themselves out. If you only use migration scripts for your tables you have less of them, they are easier to manage and there is less chance of a conflict. If you only use state for the objects that don’t touch the data you avoid the risk of migration scripts corrupting data or taking 8 hours to run.
  63. So what is better? Well, this is my attempt to summarise. The answer is neither is perfect. Generally, if the stuff on the left sounds more like your database, you’ll probably find a state based solution works better for you and visa verca. However, most people don’t live entirely on one side or the other. Let’s look at the tools available.
  64. Once you figure this out, a lot of the rest of the problems kind of work themselves out. If you only use migration scripts for your tables you have less of them, they are easier to manage and there is less chance of a conflict. If you only use state for the objects that don’t touch the data you avoid the risk of migration scripts corrupting data or taking 8 hours to run.
  65. Once you figure this out, a lot of the rest of the problems kind of work themselves out. If you only use migration scripts for your tables you have less of them, they are easier to manage and there is less chance of a conflict. If you only use state for the objects that don’t touch the data you avoid the risk of migration scripts corrupting data or taking 8 hours to run.
  66. Once you figure this out, a lot of the rest of the problems kind of work themselves out. If you only use migration scripts for your tables you have less of them, they are easier to manage and there is less chance of a conflict. If you only use state for the objects that don’t touch the data you avoid the risk of migration scripts corrupting data or taking 8 hours to run.
  67. So what is better? Well, this is my attempt to summarise. The answer is neither is perfect. Generally, if the stuff on the left sounds more like your database, you’ll probably find a state based solution works better for you and visa verca. However, most people don’t live entirely on one side or the other. Let’s look at the tools available.
  68. So what is better? Well, this is my attempt to summarise. The answer is neither is perfect. Generally, if the stuff on the left sounds more like your database, you’ll probably find a state based solution works better for you and visa verca. However, most people don’t live entirely on one side or the other. Let’s look at the tools available.
  69. So what is better? Well, this is my attempt to summarise. The answer is neither is perfect. Generally, if the stuff on the left sounds more like your database, you’ll probably find a state based solution works better for you and visa verca. However, most people don’t live entirely on one side or the other. Let’s look at the tools available.
  70. So what is better? Well, this is my attempt to summarise. The answer is neither is perfect. Generally, if the stuff on the left sounds more like your database, you’ll probably find a state based solution works better for you and visa verca. However, most people don’t live entirely on one side or the other. Let’s look at the tools available.
  71. So what is better? Well, this is my attempt to summarise. The answer is neither is perfect. Generally, if the stuff on the left sounds more like your database, you’ll probably find a state based solution works better for you and visa verca. However, most people don’t live entirely on one side or the other. Let’s look at the tools available.
  72. So what is better? Well, this is my attempt to summarise. The answer is neither is perfect. Generally, if the stuff on the left sounds more like your database, you’ll probably find a state based solution works better for you and visa verca. However, most people don’t live entirely on one side or the other. Let’s look at the tools available.
  73. So what is better? Well, this is my attempt to summarise. The answer is neither is perfect. Generally, if the stuff on the left sounds more like your database, you’ll probably find a state based solution works better for you and visa verca. However, most people don’t live entirely on one side or the other. Let’s look at the tools available.
  74. For example, Paul Stovell (creator of Octopus Deploy) basically says the migrations approach is reliable and provides the functionality to handle the deployment whatever way works.
  75. For example, Paul Stovell (creator of Octopus Deploy) basically says the migrations approach is reliable and provides the functionality to handle the deployment whatever way works.
  76. For example, Paul Stovell (creator of Octopus Deploy) basically says the migrations approach is reliable and provides the functionality to handle the deployment whatever way works.
  77. For example, Paul Stovell (creator of Octopus Deploy) basically says the migrations approach is reliable and provides the functionality to handle the deployment whatever way works.
  78. So what is better? Well, this is my attempt to summarise. The answer is neither is perfect. Generally, if the stuff on the left sounds more like your database, you’ll probably find a state based solution works better for you and visa verca. However, most people don’t live entirely on one side or the other. Let’s look at the tools available.
  79. So what is better? Well, this is my attempt to summarise. The answer is neither is perfect. Generally, if the stuff on the left sounds more like your database, you’ll probably find a state based solution works better for you and visa verca. However, most people don’t live entirely on one side or the other. Let’s look at the tools available.
  80. We’ve all done DevOps right. It looks like this. VCS, CI, RM. We are versioning, packaging and deploying our webapps. Maybe we’ve gone serverless? Everything is in source control and all our infrastructure is disposable. Right?
  81. For example, Paul Stovell (creator of Octopus Deploy) basically says the migrations approach is reliable and provides the functionality to handle the deployment whatever way works.
  82. For example, Paul Stovell (creator of Octopus Deploy) basically says the migrations approach is reliable and provides the functionality to handle the deployment whatever way works.
  83. So what is better? Well, this is my attempt to summarise. The answer is neither is perfect. Generally, if the stuff on the left sounds more like your database, you’ll probably find a state based solution works better for you and visa verca. However, most people don’t live entirely on one side or the other. Let’s look at the tools available.
  84. So what is better? Well, this is my attempt to summarise. The answer is neither is perfect. Generally, if the stuff on the left sounds more like your database, you’ll probably find a state based solution works better for you and visa verca. However, most people don’t live entirely on one side or the other. Let’s look at the tools available.
  85. So what is better? Well, this is my attempt to summarise. The answer is neither is perfect. Generally, if the stuff on the left sounds more like your database, you’ll probably find a state based solution works better for you and visa verca. However, most people don’t live entirely on one side or the other. Let’s look at the tools available.
  86. For example, Paul Stovell (creator of Octopus Deploy) basically says the migrations approach is reliable and provides the functionality to handle the deployment whatever way works.
  87. For example, Paul Stovell (creator of Octopus Deploy) basically says the migrations approach is reliable and provides the functionality to handle the deployment whatever way works.
  88. If no questions, Alex Y to kick of some Q+A by asking Alex T the following questions: - We talked about conflict resolution in programmable objects, but what about conflict resolution in migration scripts? I loved the demo, but demos are built on demo software and designed to make it all look so easy. What sort of problems am I going to run into in the real world? DevOps is about automation, and tools like ReadyRoll can help. But it’s also about Culture, Lean, Measurements and Sharing. Can you comment on how ReadyRoll supports DevOps in the wider sense?
  89. This is Alex, he writes software to help you achieve DevOps for databases. This is Alex,
  90. This is Alex, he writes software to help you achieve DevOps for databases. This is Alex,
  91. This is Alex, he writes software to help you achieve DevOps for databases. This is Alex,