shell中执行 mysql 使用tee 返回执行结果

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell中执行 mysql 使用tee 返回执行结果相关的知识,希望对你有一定的参考价值。

方式1
mysql -uroot -p --tee=/root/Desktop/xxxx.log -e " create table test.db (id integer);"

方式2
echo " create table test.db (id integer);" |mysql -uroot -p --tee=/root/Desktop/xxxx.log
方式3
mysql -uroot -p -e "tee /root/Desktop/xxxx.log;create table test.db (id integer); notee;"

方式4
mysql -uroot -p << EOF
tee /root/Desktop/xxxx.log
create table test.db6(id integer);
notee
EOF

为什么 tee只有在 进入mysql 后
mysql>
这样情况下才会有记录

参考技术A 因为你这里调用的tee就是mysql中的tee命令啊!追问

是啊 我知道是mysel的tee 但为什么没有效果?

追答

tee只支持在交互模式下,不支持batch(批)模式下!你可以查一下mysql的帮助文档,有说明的

追问

那就是说若是想得到返回情况只能是通过shell的返回值 来判定了么回复

追答

是的,判断$?的值 非0为失败

追问

谢谢啦

追答

不客气

本回答被提问者采纳
参考技术B mysql -uroot -p123456 -Dmysql -e "select user,password,host from user;" > log.txt追问

这个是输出查询记录,我要的是执行操作记录 如create load 之类

参考技术C

本文介绍 MySQL 8.0 shell 子模块 Util 的两个导入特性 importTable/import_table(JS和python 版本的命名差异)、importJson/import_json的使用方法。


其中 import_table 是通过传统 MySQL 协议来通信,Import_json 是通过 X 插件协议来通信。MySQL 一直以来提供导入文件 SQL 命令 load data infile(单线程)以及对应的可执行文件 mysqlimport(多线程)。


比如我导入 100W 行示例数据到表 ytt.tl1,花了 24 秒。这个已经是 MySQL 默认导入来的最快的。分析那我们现在看下 mysqlimport 工具的升级版,mysqlshell 的 util 工具集。


使用这两个工具之前,必须得临时开启 local_infile 选项。1. import_table建立 3306 端口的新连接我这里切换为 python 模式清空掉示例表 Ytt.tl1import_table 有两个参数,第一个参数定义导入文件的路径,第二个定义相关选项,比如导入的格式,并发的数量等。定义文件路径(参数1)定义选项(参数2)执行导入:只花了不到 17 秒,比传统 mysqlimport 快了不少。


我们上面指定了显式指定了字段分隔符,那有没有已经定义好的组合格式呢? 答案是有的,选项 dialect 可以指定以下格式:csv,tsv,json,csv-unix那么上面的导入,我们可以更简单,改下变量 y_options1 的定义导入时间差不多。这里要说明下,dialect 选项的优先级比较低,比如添加了'linesTerminatedBy':'\\r\\n', 则覆盖他自己的'\\n'。


选项 diaelect 还有一个可选值为 json,可以直接把 json 结果导入到文档表里。比如我新建一张表 tl1_json重新定义文件以及导入选项。导入 JSON 数据速度也还可以,不到 24 秒。那导入 json 数据,就必须得提到以 X 插件协议通信的工具 import_json了。2. imort_json我们切换到 mysqlx 端口import_json 参数和 Import_table 参数类似,这里我改下选项我在手册上没有看到多线程的选项,所以单线程跑 35 秒慢了些。查看刚刚导入的数据import_json 不仅仅可以导入 Json 数据,更重要的是可以在 BSON 和 JSON 之间平滑的转换,有兴趣的同学可以去 TRY 下。


shell运行下的写日志

tee 重定向输出到多个文件
 
在执行Linux命令时,我们既想把输出保存到文件中,又想在屏幕上看到输出内容,就可以使用tee命令
要注意的是:在使用管道线时,前一个命令的标准错误输出不会被tee读取。
tee file         //覆盖
tee -a file     //追加
tee -            //输出到标准输出两次
tee - -          //输出到标准输出三次
tee file1 file2 -    //输出到标准输出两次,并写到那两个文件中
ls | tee file  
另:把标准错误也被tee读取
ls "*" 2>&1 | tee ls.txt
例子1:
#!/bin/sh
if [ $# -ne 1 ]
then 
 echo "Usage:sh $0   YYYYMMDD "
  exit 1
fi
V_DT=$1

exec 1>>`basename $0`.log
date_current=`date +%Y%m%d`
echo "传入时间为: ${V_DT}"
echo "系统时间为: ${date_current}"
exit 0
例子2:
#!/bin/sh
if [ $# -ne 1 ]
then 
 echo "Usage:sh $0   YYYYMMDD "
  exit 1
fi
V_DT=$1

date_current=`date +%Y%m%d`
echo "传入时间为: ${V_DT}"  >> $(basename $0).log
echo "系统时间为: ${date_current}" >> $(basename $0).log
echo "tee commant test" 2>&1|tee -a $(basename $0).log     --日志和屏幕都存在
exit 0
 
结果输出:
[[email protected] test]$ sh test.sh 20181010
[[email protected] test]$ sh test2.sh 20181010
tee commant test
[[email protected] test]$ more test2.sh.log
传入时间为: 20181010
系统时间为: 20181029
tee commant test

 












以上是关于shell中执行 mysql 使用tee 返回执行结果的主要内容,如果未能解决你的问题,请参考以下文章

shell中的tee命令的使用

如何在 shell 脚本中使用 tee 和 sshpass

shell运行下的写日志

保存mysql执行结果

如何把shell 命令执行的结果放到指定的日志文件中? 例如ant,sh命令

Centos 执行shell命令返回127错误