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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章