Shell 脚本指定 MySQL 数据库导出所有的表

Shell 脚本指定 MySQL 数据库导出所有的表

1. 简介

脚本的目的就是用于简化操作.
这个脚本作用: 指定数据库自动导出该数据库中所有的表.
脚本内容如下:

#!/bin/bash

#######################################################
# h: 主机 (IP) 默认 localhost
# P: 端口号 默认 3306
# u: 用户 默认 root
# p: 密码 不能默认
# e: 自定义执行 MySQL 的语句
# f: 指定导出 MySQL 数据的数据库
#######################################################

host="localhost"
port="3306"
user="root"
password=""
# MySQL 语句
MySQL_COMMAND=""
# 指定导出 MySQL 数据的数据库
MySQL_file_database=""


# 定义错误输出
function errorEcho() {
  echo -e "\033[31;40m$1\033[0m"
}

# 定义提示输出
function tipEcho() {
  echo -e "\033[34;40m$1\033[0m"
}

# 密码参数必写
#getopts "h:u:P:p:" arg;
# 判断是否含有 -p 的参数
#c=$(echo "${arg[@]}" | grep -wq "p" &&  echo "1" || echo "0")
# 没有后的提示
#if [ $c = "0" ]; then
#  errorEcho "  -p  Password; Required."
#  exit 1
#fi

while getopts "h:u:P:p:e:f:" arg; do
  case $arg in
    # 用 $OPTARG 取参数值
	# 用 $OPTIND 得到索引
    h)
      host=$OPTARG
    ;;
    P)
      port=$OPTARG
    ;;
    u)
      user=$OPTARG
    ;;
    p)
      password=$OPTARG
    ;;
    e)
      MySQL_COMMAND=$OPTARG
    ;;
    f)
      MySQL_file_database=$OPTARG
    ;;
    ?)
      errorEcho "There is no such parameter!"
      tipEcho "  -h  Host name or IP; Default localhost."
      tipEcho "  -P  Port; Default 3306."
      tipEcho "  -u  User name; Default root."
      tipEcho "  -p  Password;"
      tipEcho "  -e  MySQL_COMMAND;"
      tipEcho "  -f  Database. Data export."
    ;;
  esac
done

# 自定义写 MySQL 语句
if [ -n "$MySQL_COMMAND" ]; then
  # 打印 MySQL 语句
  tipEcho "mysql -h $host -P $port -u$user -p$password -t << EOF
  $MySQL_COMMAND
EOF"
  # 执行 MySQL 语句
  mysql -h $host -P $port -u$user -p$password -t << EOF
  $MySQL_COMMAND
EOF
fi

# 导出的数据库
if [ -n "$MySQL_file_database" ]; then

  # 打印 MySQL 语句
  tipEcho "mysql -h $host -P $port -u$user -p$password  -sN << EOF
  show variables like '%secure_file%';
EOF"
  # 执行 MySQL 语句, 得到数据库
  databases=`mysql -h $host -P $port -u$user -p$password -sN << EOF
  show databases;
EOF`
  
  # 数据库数据
  databaseList=${databases//	/}
  
  # 判断是否含有输入的数据库
  c=`echo "${databaseList[@]}" | grep -wq "$MySQL_file_database" &&  echo "1" || echo "0"`
  # 没有后的提示
  if [ $c = "0" ]; then
    errorEcho "没有 $MySQL_file_database 数据库"
    exit 1
  fi

  # 打印 MySQL 语句
  tipEcho "mysql -h $host -P $port -u$user -p$password  -sN << EOF
  show variables like '%secure_file%';
EOF"
  # 执行 MySQL 语句, 得到文件需要出的路径
  secure_file_priv=`mysql -h $host -P $port -u$user -p$password -sN << EOF
  show variables like '%secure_file%';
EOF`
  file_output_path=${secure_file_priv#*	}
  
  # 打印 MySQL 语句
  tipEcho "mysql -h $host -P $port -u$user -p$password -sN << EOF
  use $MySQL_file_database;
  show tables;
EOF"
  # 执行 MySQL 语句, 得到该多有表格
  tables=`mysql -h $host -P $port -u$user -p$password -sN << EOF
  use $MySQL_file_database;
  show tables;
EOF`
  
  # 存放数据
  path_database=$file_output_path
  # 文件夹不存在则建立
  if [ ! -d $path_database ]; then
    mkdir $path_database
	tipEcho "创建 $path_database 文件夹"
  else
	tipEcho "$path_database 文件夹已存在"
  fi
  
  # 遍历表
  for table in ${tables//	/}; do
    # 存放数据
    path_table=$path_database/$table.txt
	
    # 文件夹不存在则建立
    #if [ ! -d $path_table ]; then
    #  mkdir $path_table
	#  tipEcho "创建 $path_table 文件夹"
    #else
	#  tipEcho "$path_table 文件夹已存在"
    #fi
	
    # 导出数据表
    if [ ! -f $path_table ]; then
      # 打印 MySQL 语句
      tipEcho "mysql -h $host -P $port -u$user -p$password -sN << EOF
  SELECT * from $MySQL_file_database.$table into outfile \"$path_table\";
EOF"
      # 执行 MySQL 语句, 导出表
      mysql -h $host -P $port -u$user -p$password -sN << EOF
  SELECT * from $MySQL_file_database.$table into outfile "$path_table";
EOF
    else
	  # 存在怎么做
	  while true; do
	    # 让用户输入自行判断
        echo -ne "\033[36;40m$path_table 文件已存在是否删除, 重新导出 y/n: \033[0m"
        read judge
        case $judge in
          Y|y|YES|yes)
	  	    # 删除文件, 执行 MySQL 语句
	        rm -rf $path_table;
            tipEcho "删除 $path_table 文件"
            # 打印 MySQL 语句
            tipEcho "mysql -h $host -P $port -u$user -p$password -sN << EOF
  SELECT * from $MySQL_file_database.$table into outfile \"$path_table\";
EOF"
            # 执行 MySQL 语句, 导出表
            mysql -h $host -P $port -u$user -p$password -sN << EOF
  SELECT * from $MySQL_file_database.$table into outfile "$path_table";
EOF
            break;;
          N|n|NO|no)
            break;;
          *)
          continue;;
        esac
      done
	  
    fi
  done
  
fi

2. 简单使用

该脚本名字: MySQL_output.sh.
将脚本放在一个路径下. 假设为: /var/lib/mysql-files/sh/MySQL_output.sh

指定命令运行: 自定义这个命令为 mysqlfile

vim ~/.bashrc

# 添加内容
alias mysqlfile='/var/lib/mysql-files/sh/MySQL_output.sh'

source ~/.bashrc

简单使用

mysqlfile -e "show databases;"

在这里插入图片描述

3. 执行语句和导出

1. h: 主机 (IP) 默认 localhost
2. P: 端口号 默认 3306
3. u: 用户 默认 root
4. p: 密码 不能默认
5. e: 自定义执行 MySQL 的语句
6. f: 指定导出 MySQL 数据的数据库
mysqlfile -h [主机] -P [端口号] -u[用户] -p[密码] -e [MySQL 语句] -f [数据库]

mysqlfile -h localhost -P 3306 -uroot -p[密码] -e "select * from mysql.global_grants limit 5"
在这里插入图片描述

mysqlfile -p[密码] -f mysql
导出 mysql 数据库中的表.
在这里插入图片描述

导出文件夹的选择是根据 MySQL 中 show variables like '%secure_file%' 语句得出来的
在这里插入图片描述

4. 助理解

[1]: Mysql 查询出来的数据进行导出: https://blog.csdn.net/YKenan/article/details/100547470

[2]: Linux 执行 MySQL 语句: https://blog.csdn.net/YKenan/article/details/106517855

猜你喜欢

转载自blog.csdn.net/YKenan/article/details/106531433