shell脚本备份mysql数据库中的表
来源:原创
时间:2018-10-17
作者:脚本小站
分类:SHELL
#!/bin/bash ############################################## # # 手动备份数据库 # ############################################## export HOSTNAME="prd-mysql002" export DUMP_PRD_MYSQL="mysqldump -h$HOSTNAME -P3306 -uroot -p123456" export CONNECT_PRD_MYSQL="mysql -h$HOSTNAME -P3306 -uroot -p123456" export BACK_DIR="/backup/deply_mysql/" export BACKUP_FILE="" # # 帮助 -h # @param # usage() { echo -e "\n\t-d database table 备份表" echo -e "\t-s database table 查看表的大小"; echo -e "\t\t-s ? 显示库" echo -e "\t\t-s database ? 显示表\n" exit } # # 输出显示蓝色 # @param $1 string # echo_blue() { echo -e "\033[36m$1\033[0m"; } # # 输出显示红色 # @param $1 string # echo_red() { echo -e "\033[31m$1\033[0m" } # # 日期 # @param # @return 输出格式如:20181017 # dir_time() { echo $(date "+%Y%m%d") } # # 获取库名和表名 # @param $1 database name # @param $2 table name # set_database_table_name() { export DATABASE=$1 export TABLE=$2 } # # 检查数据库是否存在 # @param $1 数据库名称 # check_database_exists() { local dbname=$1 query=$($CONNECT_PRD_MYSQL -e "SELECT information_schema.SCHEMATA.SCHEMA_NAME FROM information_schema.SCHEMATA where SCHEMA_NAME='${dbname}'" | grep $dbname) if [ -z "$query" ]; then echo $(echo_red "ERROR: database $dbname NOT exists!") exit; fi } # # 查看帮助 # @param # show_help() { if [ "$DATABASE" == "?" ] ; then echo "show databases"; show_database exit 0 elif [ "$TABLE" == "?" ] ; then echo "show tables" show_tables $DATABASE exit 0 elif [ -z "$DATABASE" ] ; then usage exit 1 elif [ -z "$TABLE" ] ; then usage exit 1 fi } # # 创建备份目录 # @param # get_directory() { local databasename=$1 local directory=$BACK_DIR$databasename/$(dir_time) if [ ! -d $directory ]; then mkdir $directory -p fi echo $directory } # # 显示数据库 # @param # show_database() { $CONNECT_PRD_MYSQL -e "show databases" } # # 显示数据库下面的表 # @param $1 数据库名称 # show_tables() { local dbname=$1 check_database_exists $dbname $CONNECT_PRD_MYSQL -e "use $dbname;show tables" } # # 显示表大小 # @param $1 数据库名称 # @param $2 表名称 # show_table_size() { local databasename=$1 local tablename=$2 local query=$($CONNECT_PRD_MYSQL -e "use information_schema;select concat(round(sum(DATA_LENGTH/1024/1024),2),'MB') as data from TABLES where table_schema='$databasename' and table_name='$tablename';" | grep MB) echo_blue $query } # # 备份表 # @param $1 数据库名称 # @param $2 表名称 # @param $3 备份存放的目录 # backup_table() { local databasename=$1 local tablename=$2 local backupdir=$3 local backupfile=$backupdir/$tablename".sql" $DUMP_PRD_MYSQL $databasename $tablename > $backupfile # echo "$DUMP_PRD_MYSQL $databasename $tablename > $backupfile" if [ "$?" -eq 0 ] ; then echo $backupfile fi } # # 备份数据 # @param $1 数据库名称 # @param $2 表名称 # confirm_option() { local databasename=$1 local tablename=$2 echo -e "\n$tablename size is:" echo -e "\t"$(show_table_size $databasename $tablename) read -p "确定要备份 $(echo_blue $databasename) 的 $(echo_blue $tablename) 表吗? y/n:" answer case $answer in y|Y) # 开始备份 echo -e "start backup ..." BACKUP_FILE=$(backup_table $databasename $tablename $(get_directory $databasename)) echo -e "$BACKUP_FILE size is:\n\t" $(echo_blue $(du -sh $BACKUP_FILE)) echo -e "backup is OK" ;; n|N) echo_red "备份已取消!" ;; esac } if [ -z "$1" ]; then usage fi while [ -n "$1" ] do case "$1" in -d|--database) set_database_table_name $2 $3 show_help confirm_option $2 $3 shift 2 ;; -s|--showtablesize) set_database_table_name $2 $3 show_help show_table_size $2 $3 shift 2 ;; -h|--help) usage ;; *) usage ;; esac shift done