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