Skip to content

Commit 4e8ae39

Browse files
committed
v1.0.0
1 parent b4890c7 commit 4e8ae39

File tree

4 files changed

+158
-1
lines changed

4 files changed

+158
-1
lines changed

.env-example

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Directory for the sql files
2+
BACKUP_DIR=/home/myuser/preciousdata
3+
MYSQL_HOST=localhost
4+
MYSQL_USER=root
5+
MYSQL_PASS=toor
6+
# Databases to skip with no space between the args separated by a ,
7+
SKIP_DATABASES=mysql,information_schema,performance_schema,phpmyadmin
8+
# No not use if you are a goat
9+
EXPERT_ARGS=--default-character-set=utf8 --extended-insert=FALSE --single-transaction --skip-comments --skip-dump-date --hex-blob --tz-utc

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
.env
2+
*.sql

README.md

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,34 @@
11
# sql-backup
2-
Backup you MySQL databases ( data, users, grants, views, triggers, routines, events )
2+
Backup your MySQL server ( data, users, grants, views, triggers, routines, events )
3+
4+
## Install
5+
6+
```bash
7+
8+
git clone https://github.com/williamdes/sql-backup.git --depth 1
9+
```
10+
```bash
11+
cd sql-backup
12+
13+
cp .env-example .env
14+
```
15+
```bash
16+
nano .env
17+
```
18+
or
19+
```bash
20+
vi .env
21+
22+
```
23+
24+
## Options
25+
26+
| NAME | DEFAULT VALUE | OPTIONAL |
27+
|---------------- |-------------------------------------------------------------------------------------------------------------------------------- |---------- |
28+
| BACKUP_DIR | | NO |
29+
| MYSQL_HOST | | NO |
30+
| MYSQL_USER | | NO |
31+
| MYSQL_PASS | | YES |
32+
| SKIP_DATABASES | | YES |
33+
| EXPERT_ARGS | --default-character-set=utf8 --extended-insert=FALSE --single-transaction --skip-comments --skip-dump-date --hex-blob --tz-utc | YES |
34+

backup.sh

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
#!/bin/bash
2+
3+
export -n $(egrep -v '^#' .env | xargs)
4+
5+
6+
if [ -z "${BACKUP_DIR}" ]; then
7+
echo "Empty Variable BACKUP_DIR"
8+
fi
9+
10+
if [ -z "${MYSQL_HOST}" ]; then
11+
echo "Empty Variable MYSQL_HOST"
12+
fi
13+
14+
if [ -z "${MYSQL_USER}" ]; then
15+
echo "Empty Variable MYSQL_USER"
16+
fi
17+
18+
19+
MYSQL_CONN="-h${MYSQL_HOST} -u${MYSQL_USER}"
20+
21+
if [ ! -z "${MYSQL_PASS}" ]; then
22+
MYSQL_CONN="${MYSQL_CONN} -p${MYSQL_PASS}"
23+
fi
24+
25+
if [ -z "${EXPERT_ARGS}" ]; then
26+
EXPERT_ARGS="--default-character-set=utf8 --extended-insert=FALSE --single-transaction --skip-comments --skip-dump-date --hex-blob --tz-utc"
27+
fi
28+
29+
MYSQLDUMP_DEFAULTS="${MYSQL_CONN} ${EXPERT_ARGS}"
30+
31+
DB_LIST_SQL="SELECT schema_name FROM information_schema.schemata"
32+
33+
# If ${SKIP_DATABASES} is not empty, create a where chain
34+
if [ ! -z "${SKIP_DATABASES}" ]; then
35+
DB_LIST_SQL="${DB_LIST_SQL} WHERE schema_name NOT IN ("
36+
# Split on ,
37+
SKIP_DATABASES=$(echo -e "${SKIP_DATABASES}" | tr "," "\n")
38+
for DB in ${SKIP_DATABASES} ; do
39+
DB_LIST_SQL="${DB_LIST_SQL}'${DB}'," ;
40+
done
41+
DB_LIST_SQL="${DB_LIST_SQL: : -1}"
42+
DB_LIST_SQL="${DB_LIST_SQL});"
43+
fi
44+
# echo -e "${DB_LIST_SQL}"
45+
# Get result
46+
DB_LIST=`mysql ${MYSQL_CONN} -ANe"${DB_LIST_SQL}"`
47+
48+
for DB in $DB_LIST; do # Concat ignore command
49+
DBS="${DBS} ${DB}"
50+
done
51+
52+
VIEW_LIST_SQL="SET SESSION group_concat_max_len = 1000000;SELECT GROUP_CONCAT(concat(':!\`',table_schema,'\`.\`',table_name,'\`') SEPARATOR '') FROM information_schema.views"
53+
# Get result
54+
VIEWS_LIST=`mysql ${MYSQL_CONN} -ANe"${VIEW_LIST_SQL}"`
55+
56+
VIEW_IGNORE_ARG=""
57+
# Split on :!
58+
VIEWS=$(echo -e "${VIEWS_LIST}" | tr ":!" "\n")
59+
60+
for VIEW in $VIEWS; do # Concat ignore command
61+
VIEW_IGNORE_ARG="${VIEW_IGNORE_ARG} --ignore-table=${VIEW}"
62+
done
63+
# echo -e "${VIEW_IGNORE_ARG}"
64+
65+
echo "Structure..."
66+
mysqldump ${MYSQLDUMP_DEFAULTS} --routines=FALSE --triggers=FALSE --events=FALSE --no-data ${VIEW_IGNORE_ARG} --databases ${DBS} > ${BACKUP_DIR}/structure.sql
67+
68+
echo "Data ..."
69+
mysqldump ${MYSQLDUMP_DEFAULTS} --routines=FALSE --triggers=FALSE --events=FALSE --no-create-info ${VIEW_IGNORE_ARG} --databases ${DBS} > ${BACKUP_DIR}/database.sql
70+
71+
echo "Users ..."
72+
mysqldump ${MYSQLDUMP_DEFAULTS} mysql --complete-insert --tables user db > ${BACKUP_DIR}/users.sql
73+
74+
echo "Routines ..."
75+
mysqldump ${MYSQLDUMP_DEFAULTS} --routines=TRUE --triggers=FALSE --events=FALSE --no-create-info --no-data --no-create-db --databases ${DBS} > ${BACKUP_DIR}/routines.sql
76+
77+
echo "Triggers ..."
78+
mysqldump ${MYSQLDUMP_DEFAULTS} --routines=FALSE --triggers=TRUE --events=FALSE --no-create-info --no-data --no-create-db --databases ${DBS} > ${BACKUP_DIR}/triggers.sql
79+
80+
echo "Events ..."
81+
mysqldump ${MYSQLDUMP_DEFAULTS} --routines=FALSE --triggers=FALSE --events=TRUE --no-create-info --no-data --no-create-db --databases ${DBS} > ${BACKUP_DIR}/events.sql
82+
83+
echo "Views ..."
84+
VIEWS_SHOW_SQL=""
85+
for VIEW in $VIEWS; do # Concat SHOW CREATE VIEW command
86+
VIEWS_SHOW_SQL="${VIEWS_SHOW_SQL}SHOW CREATE VIEW ${VIEW};"
87+
done
88+
# echo -e "${VIEWS_SHOW_SQL}"
89+
echo ${VIEWS_SHOW_SQL} | sed 's/;/\\G/g' | mysql ${MYSQL_CONN} > ${BACKUP_DIR}/views.sql
90+
91+
#Keeps lines starting with Create
92+
sed -i '/Create/!d' ${BACKUP_DIR}/views.sql
93+
# Removes 'Create View'
94+
sed -i -e 's/Create\ View://g' ${BACKUP_DIR}/views.sql
95+
#add ; at lines end
96+
sed -i 's/)$/);/' ${BACKUP_DIR}/views.sql
97+
#Remove spaces before start of line
98+
sed -i 's/^ *//' ${BACKUP_DIR}/views.sql
99+
#Add ; at line end
100+
sed -i 's/$/;/' ${BACKUP_DIR}/views.sql
101+
#Replace double ;; by ;
102+
sed -i 's/;;/;/' ${BACKUP_DIR}/views.sql
103+
104+
echo "Grants ..."
105+
# Needs refactor
106+
GRANTS_SQL="select distinct concat( \"SHOW GRANTS FOR '\",user,\"'@'\",host,\"';\" ) from mysql.user WHERE user != 'root';"
107+
GRANTS_LIST=`mysql ${MYSQL_CONN} -ANe"${GRANTS_SQL}"`
108+
echo ${GRANTS_LIST} | mysql --default-character-set=utf8 --skip-comments ${MYSQL_CONN} | sed 's/\(GRANT .*\)/\1;/;s/^\(Grants for .*\)/-- \1 --/;/--/{x;p;x;}' > ${BACKUP_DIR}/grants.sql
109+
# Removes double backslashes > \\
110+
sed -i -e 's/\\\\//g' ${BACKUP_DIR}/grants.sql
111+
# echo -e ${GRANTS_SQL}
112+
113+
echo "Backup done !"
114+

0 commit comments

Comments
 (0)