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:
- https://about.gitlab.com/installation/
- https://www.digitalocean.com/community/tutorials/how-to-set-up-gitlab-as-your-very-own-private-github-clone
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