diff --git a/README.md b/README.md index 4f05d9ef1253bb49f50043c44b25d1e615c60cb9..2a00b8f57ac4bf4e53785b55bd8660725e3ae5dc 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,3 @@ - - # Automated SQL Backup Script A simple bash script, to automatically create sql dumps on a daily basis, scheduled by systemd. diff --git a/config.json b/config.json new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/config_template.json b/config_template.json new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/sql-backup.service b/service-unit/sql-backup.service similarity index 87% rename from sql-backup.service rename to service-unit/sql-backup.service index 7fc1ca361e580d3c78f442412bff58227c5a4dea..bbd9977419c0855aafced92461f6994d769651ca 100644 --- a/sql-backup.service +++ b/service-unit/sql-backup.service @@ -4,7 +4,7 @@ Wants=sql-backup.timer [Service] Type=oneshot -ExecStart=./sql-backup.sh +ExecStart= [Install] WantedBy=multi-user.target diff --git a/sql-backup.timer b/service-unit/sql-backup.timer similarity index 100% rename from sql-backup.timer rename to service-unit/sql-backup.timer diff --git a/sql-backup-sample.conf b/sql-backup-sample.conf new file mode 100644 index 0000000000000000000000000000000000000000..5cc4c1256559221f753d2921e45455d8935fefb4 --- /dev/null +++ b/sql-backup-sample.conf @@ -0,0 +1,9 @@ +{ + "sqlHost": "localhost", + "sqlPort": "3306", + "sqlUser": "root", + "sqlPass": null, + "dbNames": "all", + "backupRoot": "/var/backups/sql/", + "backupRetainDays": 30 +} diff --git a/sql-backup.conf b/sql-backup.conf new file mode 100644 index 0000000000000000000000000000000000000000..edd87294287028b28ca80cd9b62b6846d6b59f85 --- /dev/null +++ b/sql-backup.conf @@ -0,0 +1,9 @@ +{ + "sqlHost": "localhost", + "sqlPort": "3306", + "sqlUser": "backup", + "sqlPass": "l)m0h4vtJ@D7*f5YOvLO5c=0g?4K3aEM", + "dbNames": "all", + "backupRoot": "/var/backups/sql/", + "backupRetainDays": 30 +} diff --git a/sql-backup.py b/sql-backup.py new file mode 100755 index 0000000000000000000000000000000000000000..07de054136d4d5f7a9f3adbe1300020fa3cf3de6 --- /dev/null +++ b/sql-backup.py @@ -0,0 +1,52 @@ +import os +import json +import subprocess +import mysql.connector + +######################### +### ### +### SETTINGS ### +### ### +######################### + +try: + configFile = open('/opt/sql-backup/sql-backup.conf') + print('INFO: File exists, load it --> To be implemented') +except: + print('WARN: No configuration file found. Attempting to backup all existing Databases as root.') + configFile = open('/opt/sql-backup/sql-backup-sample.conf') + +config = json.load(configFile) +configFile.close() + +sqlHost = config['sqlHost'] +sqlPort = config['sqlPort'] +sqlUser = config['sqlUser'] +sqlPass = config['sqlPass'] +dbNames = config['dbNames'] +backupRoot = config['backupRoot'] +backupRetainDays = config['backupRetainDays'] + +######################### +### ### +### START OF SCRIPT ### +### ### +######################### + +isDir = os.path.isdir(backupRoot) +if isDir == False: + print('WARN: Backup root directory does not exist. Try to create it.') + try: + os.mkdir(backupRoot) + except: + print('ERROR: Could not create backup root directory. Stopping backup process') + quit() + +connection = mysql.connector.connect(host = sqlHost, port = sqlPort, + user = sqlUser, password = sqlPass) +cursor = connection.cursor() +cursor.execute('SHOW DATABASES;') +dbNames = [] +for record in cursor.fetchall(): + dbNames.append(record[0]) +print(dbNames) diff --git a/sql-backup.sh b/sql-backup.sh index 005f0ef03bdd869125ef60b5c10814acab576f83..2250c84cb5423e850b61a830ed9e5be501978d54 100755 --- a/sql-backup.sh +++ b/sql-backup.sh @@ -1,41 +1,96 @@ -#!/bin/bash +#!/usr/bin/env bash +set -o nounset # Treat unset variables as an error + +######################### +### ### +### SETTINGS ### +### ### +######################### + export PATH=/bin:/usr/bin:/usr/local/bin +configFile=/etc/sql-backup/sql-backup.conf +if test -f "configFile"; then + echo "INFO: Config file exists, load it --> To be implemented" +else + echo "WARN: No configuration file found. Attempting to backup all existing Databases as root." + sqlHost="localhost" + sqlPort="3306" + sqlUser="root" + sqlPass="" + dbNames=($(mysql -u root -e "SHOW DATABASES;")) + backupRoot="/var/backups/sql/" + backupRetainDays=30 +fi today=$(date +"%y%m%d") -sqlHost="localhost" -sqlPort="3306" -sqlUser="backup" -sqlPass="l)m0h4vtJ@D7*f5YOvLO5c=0g?4K3aEM" -dbName="booked_prod" -backupPath="/var/backups/sql/"$dbName -backupRetainDays=30 - -mkdir -p ${backupPath} -cd $backupPath - -mysqldump -h ${sqlHost} \ - -P${sqlPort} \ - -u${sqlUser} \ - -p${sqlPass} \ - ${dbName} > ${backupPath}/${dbName}-${today}.sql - -if [ $? -eq 0 ]; then - echo "Database backup successfully completed" +######################### +### ### +### START OF SCRIPT ### +### ### +######################### + +# check for backup root directory +if [[ -d "$backupRoot" ]]; +then + echo "INFO: Backup root directory found. Proceeding." else - echo "Error found during backup" + echo "WARN: Backup root directory does not exist. Try to create it." + { # try + mkdir $backupRoot + } || { + echo "ERROR: Could not create Backup root directory. Stop script." + exit 1 + } fi -delDate=$(date +"%y%m%d" --date="${BACKUP_RETAIN_DAYS} days ago") -delFile=${dbName}-${delDate}.sql -for f in * +for dbName in "${dbNames[@]}"; do - if [[ "$f" < "$delFile" ]] + + if [ $dbName == "Database" ] || \ + [ $dbName == "information_schema" ] || \ + [ $dbName == "mysql" ] || \ + [ $dbName == "performance_schema" ] || \ + [ $dbName == "phpmyadmin" ]; then - echo "delete $f" - rm -f $f + continue + fi + + backupPath=$backupRoot$dbName + mkdir -p ${backupPath} + cd $backupPath + + if [ -z $sqlPass ]; + then + mysqldump -h ${sqlHost} \ + -P${sqlPort} \ + -u${sqlUser} \ + ${dbName} > ${backupPath}/${dbName}_${today}.sql + else + mysqldump -h ${sqlHost} \ + -P${sqlPort} \ + -u${sqlUser} \ + -p${sqlPass} \ + ${dbName} > ${backupPath}/${dbName}_${today}.sql + fi + + if [ $? -eq 0 ]; then + + echo "INFO: Database backup for ${dbName} successfully completed." + delDate=$(date +"%y%m%d" --date="${backupRetainDays} days ago") + delFile=${dbName}-${delDate}.sql + + for f in *; do + if [[ "$f" < "$delFile" ]]; then + echo "delete $f" + rm -f $f + else + echo "keep $f" + fi + done else - echo "keep $f" + echo "ERROR: Backup failed for ${dbName}. Skip deletion process for older Backups." + continue fi done