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