Skip to content
Snippets Groups Projects
Commit 019fa8b9 authored by root's avatar root
Browse files

Complete rewrite of backup script. Extend logic on standard config (for...

Complete rewrite of backup script. Extend logic on standard config (for localhost, as root, no password, all databases).
parent 447297ac
No related branches found
No related tags found
No related merge requests found
![Logo of the project](https://raw.githubusercontent.com/jehna/readme-best-practices/master/sample-logo.png)
# Automated SQL Backup Script # Automated SQL Backup Script
A simple bash script, to automatically create sql dumps on a daily basis, scheduled by systemd. A simple bash script, to automatically create sql dumps on a daily basis, scheduled by systemd.
......
...@@ -4,7 +4,7 @@ Wants=sql-backup.timer ...@@ -4,7 +4,7 @@ Wants=sql-backup.timer
[Service] [Service]
Type=oneshot Type=oneshot
ExecStart=./sql-backup.sh ExecStart=
[Install] [Install]
WantedBy=multi-user.target WantedBy=multi-user.target
File moved
{
"sqlHost": "localhost",
"sqlPort": "3306",
"sqlUser": "root",
"sqlPass": null,
"dbNames": "all",
"backupRoot": "/var/backups/sql/",
"backupRetainDays": 30
}
{
"sqlHost": "localhost",
"sqlPort": "3306",
"sqlUser": "backup",
"sqlPass": "l)m0h4vtJ@D7*f5YOvLO5c=0g?4K3aEM",
"dbNames": "all",
"backupRoot": "/var/backups/sql/",
"backupRetainDays": 30
}
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)
#!/bin/bash #!/usr/bin/env bash
set -o nounset # Treat unset variables as an error
#########################
### ###
### SETTINGS ###
### ###
#########################
export PATH=/bin:/usr/bin:/usr/local/bin 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") today=$(date +"%y%m%d")
sqlHost="localhost" #########################
sqlPort="3306" ### ###
sqlUser="backup" ### START OF SCRIPT ###
sqlPass="l)m0h4vtJ@D7*f5YOvLO5c=0g?4K3aEM" ### ###
dbName="booked_prod" #########################
backupPath="/var/backups/sql/"$dbName
backupRetainDays=30 # check for backup root directory
if [[ -d "$backupRoot" ]];
mkdir -p ${backupPath} then
cd $backupPath echo "INFO: Backup root directory found. Proceeding."
mysqldump -h ${sqlHost} \
-P${sqlPort} \
-u${sqlUser} \
-p${sqlPass} \
${dbName} > ${backupPath}/${dbName}-${today}.sql
if [ $? -eq 0 ]; then
echo "Database backup successfully completed"
else 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 fi
delDate=$(date +"%y%m%d" --date="${BACKUP_RETAIN_DAYS} days ago")
delFile=${dbName}-${delDate}.sql
for f in * for dbName in "${dbNames[@]}";
do do
if [[ "$f" < "$delFile" ]]
if [ $dbName == "Database" ] || \
[ $dbName == "information_schema" ] || \
[ $dbName == "mysql" ] || \
[ $dbName == "performance_schema" ] || \
[ $dbName == "phpmyadmin" ];
then then
echo "delete $f" continue
rm -f $f 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 else
echo "keep $f" echo "ERROR: Backup failed for ${dbName}. Skip deletion process for older Backups."
continue
fi fi
done done
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment