shell调用存储过程


shell脚本,调用存储过程:
   mysql -h *** -u *** -D *** -p*** -e ***

   -h ip地址
   -u 数据库用户
   -D 数据库
   -p密码
   -e 调用存储过程的语句 call haha()
   
   -p和密码之间没有空格,请注意!

   shell脚本范例:
    #ip地址
    HOST="xxx"
    #端口号
    PORT="xxx"
    #用户名
    USER="xxx"
    #密码
    PASSWORD="xxx"
    #数据库名
    DATABASE="xxx"
    #路径,日志所在路径,
    DIR="xxx"
    #日志
    log="log.txt"
    #存储过程
    CALL="call m_user_day()"
    #当前时间
    cur_dateTime="`date +%Y-%m-%d,%H:%m:%s`"


    MAILTO=""
    cd ${DIR}

    #输入到日志
    SQL="exec mysql -h${HOST} -u${USER} -p${PASSWORD} -D ${DATABASE} --default-character-set=utf8 -e \"${CALL}\""

 

#

$()是将括号内命令的执行结果赋值给变量

${}和$变量名没有什么区别,但使用括号语义更明确


    echo ${SQL} >> ${log} 2>&1
    echo ${cur_dateTime} >> ${log} 2>&1

    if   mysql -h ${HOST} \
           -u ${USER} \
           -p${PASSWORD} \
           -D ${DATABASE} \
           --default-character-set=utf8 \
           -e "${CALL}"; then
          echo "ok"  >> ${log} 2>&1
    else
          echo "error" >> ${log} 2>&1
    fi

    exit
    shell编写后,肯定要先测试一下shell脚本是否可以:

    一.MAILTO="",禁止发送邮件,定时器执行shell脚本时,会以发送邮件的形式表现,使shell脚本的echo无作用
      所以必须禁止发送邮件,
    二.如果在shell脚本中需要进行输出的话,echo并不会起作用,只能将语句输出到一个日志文件中,
      需要 >> 重定向到一个文件中,并在后面加上2>&1 如echo "ok"  >> ${log} 2>&1
      需要 MAILTO=""  >>  2>&1 三者配合才可以将日志输出到文件中
    三.如果脚本语句没有问题的话,进行执行脚本,脚本执行时,如果超过10秒,那你对数据库的操作就是失败的了,
    最有可能报的一个错误就是 连接不到数据库,这是一个很笼统的错误,错误原因很多
       1.网络原因,
          ping www.baidu.com  没有问题
      ping 数据库所在的服务器ip 不通,就是网络的问题了,
      我就是这样的问题,(云服务器上执行脚本,操作公司内网服务器上的数据库),执行脚本时,一直提示mysql连接失败
      所以,先ping ip,看看是否可以连通,如果不可以,就要注意一下了
    2.ping ip可以的话,在执行shell脚本,还是提示mysql连接失败,就有可能是mysql的问题了
       有可能是mysql没有开启远程调用权限
       解决办法:1.关闭mysql,在my.ini文件的最后一行加上一句话  skip-grant-tables 开启mysql
                  2.更新user表的Host为% update user authentication_String
              UPDATE user SET authentication_String=PASSWORD(’newpassword’) where USER=’root’;

              注意,mysql的password列有可能变为了authentication_String

              FLUSH PRIVILEGES重启misql

              登陆mysql

 

1、在 bash shell 中,$()是将括号内命令的执行结果赋值给变量:
(base) zeng@zeng-X11DAi-N:~/workspace$ ls a.sh data.sh results.txt #将命令 ls 赋值给变量 a (base) zeng@zeng-X11DAi-N:~/workspace$ a=$(ls) (base) zeng@zeng-X11DAi-N:~/workspace$ echo $a a.sh data.sh results.txt 
2、${} 是用来作变量替换。一般情况下,$var 与 ${var} 并没有啥不一样。但是用 ${ } 会比较精确的界定变量名称的范围:
(base) zeng@zeng-X11DAi-N:~/workspace$ A=B
#目的想打印变量A,然后再加上一个B,结果返回无。
(base) zeng@zeng-X11DAi-N:~/workspace$ echo $AB
#此时,${ }可以较为精确的确定变量的范围
(base) zeng@zeng-X11DAi-N:~/workspace$ echo ${A}B
BB
(base) zeng@zeng-X11DAi-N:~/workspace$
3、${ } 的一些特殊功能:

假设我们定义了一个变量为:file=/dir1/dir2/dir3/my.file.txt

${file#*/}:拿掉第一条 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt ${file##*/}:拿掉最后一条 / 及其左边的字符串:my.file.txt ${file#*.}:拿掉第一个 . 及其左边的字符串:file.txt ${file##*.}:拿掉最后一个 . 及其左边的字符串:txt ${file%/*}:拿掉最后条 / 及其右边的字符串:/dir1/dir2/dir3 ${file%%/*}:拿掉第一条 / 及其右边的字符串:(空值) ${file%.*}:拿掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file ${file%%.*}:拿掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my 记忆的方法为: # 是去掉左边(在鉴盘上 # 在 $ 之左边) % 是去掉右边(在鉴盘上 % 在 $ 之右边) 单一符号是最小匹配﹔两个符号是最大匹配。 ${file#/}(不加*号)表示只去掉最左边的/ 
 
 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM