├── README.md ├── backupper_mysql ├── .gitignore └── run.sh └── example.gif /README.md: -------------------------------------------------------------------------------- 1 | Backupper MySQL 2 | --------------- 3 | This script is designed to create MySQL database backups. 4 | 5 | The script automatically finds all databases, so you don't have to add new, unless you have some exceptions. You can also transfer the key to back up only certain databases. 6 | 7 | ---------- 8 | 9 | **The script contains the following settings:** 10 | 11 | Connection settings: 12 | 13 | DBUSER="root" 14 | DBPASS="" 15 | DBHOST="" 16 | 17 | Archives retention period: 18 | 19 | DAYS_STORE=20 20 | 21 | Directory for save archive: 22 | 23 | BACKUP_DIR="backups" 24 | 25 | A list of excluded databases (database is a part of SHOW DATABASES output): 26 | 27 | EXCLUDES_DB=( 28 | 'example_db' 29 | 'example_db2' 30 | ) 31 | 32 | An array of excluded tables (requires BASH v. 4 >=). 33 | The structure of the excluded tables will be saved in the backup file: 34 | 35 | EXCLUDED_TABLES[example_db]="example_table example_table2" 36 | 37 | Parameter for change the store time (days) "-t": 38 | 39 | $ ./run.sh -t 10 40 | 41 | If you do not want the script to back up the new bases, then upon running, specify that you want to back up, using the "-b" parameter: 42 | 43 | $ ./run.sh -b "example_db example_db2" 44 | 45 | To exclude tables from data base "-e": 46 | 47 | $ ./run.sh -e "example_db.example_table example_db.example_table2" 48 | 49 | If you want add custom parameters, use the parameter "-p": 50 | 51 | $ ./run.sh -p "--hex-blob" 52 | 53 | Example for cron. Backup all databases: 54 | 55 | 0 * * * * backupper_mysql/run.sh >/dev/null 2>&1 56 | 57 | ![](https://raw.githubusercontent.com/wdda/backupper_mysql/master/example.gif) -------------------------------------------------------------------------------- /backupper_mysql/.gitignore: -------------------------------------------------------------------------------- 1 | tmp 2 | backups -------------------------------------------------------------------------------- /backupper_mysql/run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Backupper MySQL 4 | # Author Alferov D. WDDA 5 | # https://github.com/wdda/backupper_mysql 6 | 7 | # Connection settings 8 | DBUSER="root" 9 | DBPASS="" 10 | DBHOST="" 11 | 12 | # Archives retention period 13 | DAYS_STORE=20 14 | 15 | # A list of excluded databases (database is a part of SHOW DATABASES output) 16 | EXCLUDES_DB=( 17 | 'Database' 18 | 'information_schema' 19 | 'mysql' 20 | 'performance_schema' 21 | 'phpmyadmin' 22 | 'sys' 23 | ) 24 | 25 | # An array of excluded tables (requires BASH v. 4 >=). 26 | # The structure of the excluded tables will be saved in the backup file. 27 | # 28 | # if you want to exclude tables uncomment the lines 29 | # 30 | # declare -A EXCLUDED_TABLES 31 | # EXCLUDED_TABLES[example_db]="example_table,example_table2" 32 | 33 | DATE=`date +%Y-%M-%d` 34 | YEAR=`date +%Y` 35 | MONTH=`date +%m` 36 | DAY=`date +%d` 37 | HOURS=`date +%H` 38 | MINUTES=`date +%M` 39 | 40 | BASEDIR=`dirname $0` 41 | PROJECT_PATH=`cd $BASEDIR; pwd` 42 | cd $PROJECT_PATH 43 | 44 | DATA_BASE_FROM_KEY=0 45 | EXCLUDES_TABLE_FROM_KEY=0 46 | PARAMETERS="" 47 | 48 | while getopts ":b:e:p:t:h" opt; do 49 | case $opt in 50 | b) 51 | DATA_BASE_FROM_KEY="$OPTARG" 52 | ;; 53 | e) 54 | EXCLUDES_TABLE_FROM_KEY="$OPTARG" 55 | ;; 56 | p) 57 | PARAMETERS="$OPTARG" 58 | ;; 59 | t) 60 | DAYS_STORE="$OPTARG" 61 | ;; 62 | h) 63 | echo "-b Data bases for backup. Default all. Example: run.sh -b \"example_db example_db2\"" 64 | echo "-e For ignore table. Example: run.sh -e \"data_base.table data_base2.table2\"" 65 | echo "-p Custom parameters. Example: run.sh -p \"--hex-blob\"" 66 | echo "-t Storage time (days). Example: run.sh -t 3" 67 | exit 68 | ;; 69 | \?) 70 | echo "Invalid option: -$OPTARG" >&2 71 | exit 1 72 | ;; 73 | esac 74 | done 75 | 76 | DIR="tmp" 77 | if [ ! -d "$DIR" ]; then 78 | mkdir "$DIR" 79 | fi 80 | 81 | # Create backup dir 82 | BACKUP_DIR="backups" 83 | 84 | if [ ! -d "$BACKUP_DIR" ]; then 85 | mkdir "$BACKUP_DIR" 86 | fi 87 | 88 | if [ "" != "$DBPASS" ] ; then 89 | DBPASS="-p$DBPASS" 90 | fi 91 | 92 | # Create list of databases 93 | mysql -u $DBUSER $DBPASS -e "show databases;" > tmp/databases.list 94 | 95 | if [ "$DATA_BASE_FROM_KEY" == 0 ] ; then 96 | LIST_DB=`cat tmp/databases.list` 97 | else 98 | LIST_DB="$DATA_BASE_FROM_KEY" 99 | fi 100 | 101 | # Now we can backup current database 102 | cd $BACKUP_DIR 103 | 104 | for database in $LIST_DB 105 | do 106 | skip=0 107 | let count=0 108 | while [ $count -lt ${#EXCLUDES_DB[@]} ] ; do 109 | # check if this name in excludes list 110 | if [ "$database" = ${EXCLUDES_DB[$count]} ] ; then 111 | let skip=1 112 | break 113 | fi 114 | 115 | let count=$count+1 116 | done 117 | 118 | if [ $skip -eq 0 ] ; then 119 | 120 | IGNORED_TABLES_STRING='' 121 | for i in "${!EXCLUDED_TABLES[@]}" 122 | do 123 | if [ "$i" = "$database" ] ; then 124 | EXCLUDED_TABLE=(${EXCLUDED_TABLES[$i]//,/ }) 125 | for b in "${EXCLUDED_TABLE[@]}" 126 | do 127 | IGNORED_TABLES_STRING+=" --ignore-table="${database}"."${b} 128 | done 129 | fi 130 | done 131 | 132 | if [ "$EXCLUDES_TABLE_FROM_KEY" != 0 ] ; then 133 | for ignore_table in $EXCLUDES_TABLE_FROM_KEY 134 | do 135 | IGNORED_TABLES_STRING+=" --ignore-table="${ignore_table} 136 | done 137 | fi 138 | 139 | 140 | echo "" 141 | echo "*---- start backup $database" 142 | 143 | backup_name="$YEAR-$MONTH-$DAY.$HOURS-$MINUTES.$database.backup.sql" 144 | backup_tarball_name="$backup_name.tar.gz" 145 | 146 | `/usr/bin/mysqldump -h "$DBHOST" --databases --single-transaction --no-data "$database" -u "$DBUSER" ${DBPASS} ${IGNORED_TABLES_STRING} > "$backup_name"` 147 | echo "**--- add structure $backup_name" 148 | 149 | `/usr/bin/mysqldump -h "$DBHOST" --databases "$database" -u "$DBUSER" ${DBPASS} ${IGNORED_TABLES_STRING} >> "$backup_name"` 150 | echo "***-- add data $backup_name" 151 | 152 | `/bin/tar -zcf "$backup_tarball_name" "$backup_name"` 153 | echo "****- compress $backup_tarball_name" 154 | 155 | `/bin/rm "$backup_name"` 156 | echo "***** cleanup $backup_name" 157 | fi 158 | done 159 | 160 | echo "Delete old backups" 161 | 162 | find *.sql.tar.gz -maxdepth 1 -mtime +$DAYS_STORE -type f -delete 163 | echo "Done!" 164 | -------------------------------------------------------------------------------- /example.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wdda/backupper_mysql/0598968ad7eb375f5b4b1db459503c4b3a7a1cfa/example.gif --------------------------------------------------------------------------------