Banco de Dados

11 mai, 2016

MyGitSchema: versionando o banco de dados

Publicidade

Manter o controle de versão de projetos tem sido uma tarefa fácil com auxilio de ferramentas de mercado como git, jenkis e tantas outras. Porém, tenho visto que em muitos casos as estruturas e objetos de banco de dados são tratados apartadamente como algo fora do escopo de projeto pelas equipes de desenvolvimento e por isso perde-se o histórico de alterações nas estruturas.

Ainda levando em consideração as alterações realizadas por um DBA, tais como inclusão de novos índices, particionamento e compressão ficará ainda mais difícil garantir que exista histórico de controle da estrutura de banco de dados de “produção”.

Trabalhando com esse tipo de problemática, desenvolvi um script bem simples, capaz de versionar diversos ambientes de bancos de dados de forma automatizada.

Com pouco tempo de uso, pude aumentar a integração com a área de desenvolvimento, pois cada alteração ou teste que é realizado no ambiente de desenvolvimento, gera uma notificação automaticamente via Slack e eu fico sabendo de qualquer alteração no escopo de projeto.

  • Versionamento de estruturas de base de dados;
  • Notificação em caso de alterações.

Requisitos:

  • Gitlab
  • Git Client

Instalação do GitLab:

O script

/root/mygitschema.sh


!/bin/bash
#########################################################
#-------------------------------------------------------#
# Developed by: Mathias Brem Garcia     ----------------#
#-------------------------------------------------------#
#########################################################
#
#SET VARIABLES
#
CFG="/etc/mygitschema.d/";
DIRECTORY="/usr/local/mygitschema"; #target directory to dump tables
USER="BACKUP_GITSCHEMA" #user
PASS="SENHAGITSCHEMA@(**&@quot; #password
DATE=$(date +"%Y-%m-%d %H:%M:%S");
#
# LOOP CFG CLUSTERS
#
for cfg in $(ls $CFG/*.cfg);do
#
#SET CURRENT CLUSTER VARIABLES
#
source $cfg;
#
#LOOP DATABASES
#
for database in $(mysql -u$USER -h$hostname -p$PASS -s -e"select distinct table_schema from information_schema.tables where table_schema not in('mysql','information_schema','performance_schema')");do
#
#LOOP TABLES
#
echo "CLUSTER: $cluster DATABASE: $database AMBIENTE:$envirioment";
for table in $(mysql -u$USER -p$PASS -h$hostname -s -e"show tables in $database" );do
if [ ! -d "$DIRECTORY/$envirioment/$cluster/$database" ];then
mkdir -p "$DIRECTORY/$envirioment/$cluster/$database"
fi;
echo "CLUSTER: $cluster DATABASE: $database TABELA: $table AMBIENTE:$envirioment";
mysqldump -u$USER -p$PASS -h$hostname $database $table --no-data --skip-opt --single-transaction | sed -e '/Dump completed on/d' > $DIRECTORY/$envirioment/$cluster/$database/$table.sql
done; # END LOOP TABLES
mysqldump -u$USER -p$PASS -h$CLUSTER $database --no-create-info --no-data --skip-opt --single-transaction --routines | sed -e '/Dump completed on/d' > $DIRECTORY/$envirioment/$cluster/$database/routines.sql
#
#COMMIT CHANGES TO REPOSITORY
#
cd $DIRECTORY
git add .
git commit -m "Cluster:$cluster Database: $database | Estruturas de base de dados atualizadas em: $DATE"
git push
done; #END LOOP DATABASES
done; #END LOOP CLUSTERS
mkdir /etc/mygitschema.d/

/etc/mygitschema.d/ecommerce_devel.cfg

cluster='ecommerce'
hostname='ecommercedb_devel'
envirioment='desenvolvimento'

/etc/mygitschema.d/ecommerce_prod.cfg

cluster='ecommerce'
hostname='slave_backup_ecommerce'
envirioment='producao'

/etc/mygitschema.d/blog_devel.cfg

cluster='blog'
hostname='blogdb_devel'
envirioment='desenvolvimento'

/etc/mygitschema.d/blog_prod.cfg

cluster='blog'
hostname='slave_backup_blogdb'
envirioment='producao'

Crie um repositório gitlab (no gitlab é possível configurar notificações com diversas plataformas). Depois crie uma pasta para salvar as estruturas de banco de dados:

mkdir /usr/local/mygitschema/

Cron:11

crontab -e

# BACKUP MYSQL
0 * * * * * sh /root/mygitschema.sh
O script está disponível via GitHub: https://github.com/mathiasbrem/mygitschema