只有我的两分钱。从@gahooa升级优秀的脚本
它增加了授权保存。如果您想保存权限以及一些改进和值检查,这很有用。如果提供,还使用用户和通行证。
希望对你有帮助。
UDATE:为每个文件添加 sha1 和
#!/bin/bash
#
# Script to backup database and grants from mysql
# Author: Gonzalo Aguilar Delgado <gaguilar indomain level2crm.com>
# Usage:
# backup-mysql.sh <HOST> username password <--- Yes this is insecure as this will get on history
# Based on script http://stackoverflow.com/questions/1963884/how-to-automatically-backup-all-mysql-databases-into-sql-statement
# from gahooa (http://stackoverflow.com/users/64004/gahooa)
#
if [ "$#" -lt 1 ]; then
FILENAME="$(basename $0)"
echo "Usage $FILENAME <HOST> [user] [pass]"
exit 1
fi
#http://stackoverflow.com/questions/5947742/how-to-change-the-output-color-of-echo-in-linux
COLOR_GREEN='\e[0;32m'
COLOR_RED='\e[0;31m'
COLOR_BLACK='\e[0;30m'
COLOR_DISABLE='\e[0m'
HOST=$1
if [ ! -z "$2" ]; then
USER=$2
fi
PASS=$3
BACKUP_DIRECTORY="/home/gaguilar/mysql-backup"
if [ ! -x $BACKUP_DIRECTORY ]; then
echo "Cannot access to $BACKUP_DIRECTORY"
exit 1
fi
DUMP_COMMAND="/usr/bin/mysqldump --skip-extended-insert --force"
MYSQL_COMMAND=/usr/bin/mysql
TODAY_DATE=$(date "+%F")
COMMAND_ARGS="-h$HOST"
if [ ! -z "$USER" ]; then
COMMAND_ARGS="$COMMAND_ARGS -u$USER"
fi
if [ ! -z "$PASS" ]; then
COMMAND_ARGS="$COMMAND_ARGS -p$PASS"
fi
echo -e "Connecting to ${COLOR_BLACK}$HOST${COLOR_DISABLE} with user ${COLOR_BLACK}$USER${COLOR_DISABLE}..."
# Get a list of all databases
DB_LIST=$(echo "SHOW DATABASES" | $MYSQL_COMMAND $COMMAND_ARGS)
if [ "$?" -ne "0" ]; then
echo "Cannot connect"
exit 1
fi
echo "Starting backup"
for db in $DB_LIST; do
if [ "$db" != "information_schema" ] && [ "$db" != "mysql" ] && [ "$db" != "performance_schema" ]; then
date=`date`
file="$BACKUP_DIRECTORY/$HOST-$db-$TODAY_DATE.sql.bz2"
file_sum=$BACKUP_DIRECTORY/$HOST-$db-$TODAY_DATE.sql.bz2.sha1
echo "Backing up '$db' from '$HOST' on '$date' to: "
echo " [$file]..."
$DUMP_COMMAND $COMMAND_ARGS $db | bzip2 > $file
sha1sum $file > $file_sum
if [ "$?" -ne "0" ]; then
echo "Backup of '$db' from '$HOST' ${COLOR_RED}failed${COLOR_DISABLE}..."
fi
else
echo "Skipping $db database because mysql internal"
fi
done
echo -e "${COLOR_GREEN}Done backup databases${COLOR_DISABLE}"
echo "Backing up privileges of users"
USER_LIST=$(echo "SELECT CONCAT('\'',user,'\'@\'',host,'\'') FROM mysql.user WHERE user != 'root'" | $MYSQL_COMMAND -BN $COMMAND_ARGS)
grants_file="$BACKUP_DIRECTORY/$HOST-grants-$TODAY_DATE.sql"
echo "-- GRANTS FOR $HOST at $TODAY_DATE" > $grants_file
for username in $USER_LIST; do
echo "Backing up $username"
GRANT_LIST=$(echo "show grants for $username" | $MYSQL_COMMAND -BN $COMMAND_ARGS | sed 's/$/;/; s/\\\\/\\/g';) #
echo "" >> $grants_file
echo "-- " >> $grants_file
echo "-- BACKUP OF USERNAME [$username]" >> $grants_file
echo "-- " >> $grants_file
echo "$GRANT_LIST" >> $grants_file
done
echo -e "${COLOR_GREEN}Done backup users${COLOR_DISABLE}"
授权文件的输出是这样的:
-- GRANTS FOR localhost at 2014-10-15
--
-- BACKUP OF USERNAME ['java'@'%']
--
GRANT USAGE ON *.* TO 'java'@'%' IDENTIFIED BY PASSWORD 'XXX';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, TRIGGER ON `widgetdb`.* TO 'java'@'%';
--
-- BACKUP OF USERNAME ['planes2'@'%']
--
GRANT USAGE ON *.* TO 'planes2'@'%' IDENTIFIED BY PASSWORD 'XXX';
GRANT ALL PRIVILEGES ON `planes2`.* TO 'planes2'@'%';