zoukankan      html  css  js  c++  java
  • Shell脚本中执行sql语句操作mysql

    对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本。本文描述了在Linux环境下mysql数据库中,shell脚本下调用sql语句的几种方法,供大家参考。对于脚本输出的结果美化,需要进一步完善和调整。以下为具体的示例及其方法。

    1、将SQL语句直接嵌入到shell脚本文件中

    复制代码 代码如下:

    --演示环境  
    [root@SZDB ~]# more /etc/issue  
    CentOS release 5.9 (Final)  
    Kernel on an m  
      
    root@localhost[(none)]> show variables like 'version';  
    +---------------+------------+  
    | Variable_name | Value      |  
    +---------------+------------+  
    | version       | 5.6.12-log |  
    +---------------+------------+  
      
    [root@SZDB ~]# more shell_call_sql1.sh   
    #!/bin/bash  
    # Define log  
    TIMESTAMP=`date +%Y%m%d%H%M%S`  
    LOG=call_sql_${TIMESTAMP}.log  
    echo "Start execute sql statement at `date`." >>${LOG}  
      
    # execute sql stat  
    mysql -uroot -p123456 -e "  
    tee /tmp/temp.log  
    drop database if exists tempdb;  
    create database tempdb;  
    use tempdb  
    create table if not exists tb_tmp(id smallint,val varchar(20));  
    insert into tb_tmp values (1,'jack'),(2,'robin'),(3,'mark');  
    select * from tb_tmp;  
    notee  
    quit"  
      
    echo -e " ">>${LOG}  
    echo "below is output result.">>${LOG}  
    cat /tmp/temp.log>>${LOG}  
    echo "script executed successful.">>${LOG}  
    exit;  
      
    [root@SZDB ~]# ./shell_call_sql1.sh   
    Logging to file '/tmp/temp.log'  
    +------+-------+  
    | id   | val   |  
    +------+-------+  
    |    1 | jack  |  
    |    2 | robin |  
    |    3 | mark  |  
    +------+-------+  
    Outfile disabled.  

    2、命令行调用单独的SQL文件

    复制代码 代码如下:

    [root@SZDB ~]# more temp.sql   
    tee /tmp/temp.log  
    drop database if exists tempdb;  
    create database tempdb;  
    use tempdb  
    create table if not exists tb_tmp(id smallint,val varchar(20));  
    insert into tb_tmp values (1,'jack'),(2,'robin'),(3,'mark');  
    select * from tb_tmp;  
    notee  
      
    [root@SZDB ~]# mysql -uroot -p123456 -e "source /root/temp.sql"  
    Logging to file '/tmp/temp.log'  
    +------+-------+  
    | id   | val   |  
    +------+-------+  
    |    1 | jack  |  
    |    2 | robin |  
    |    3 | mark  |  
    +------+-------+  
    Outfile disabled.  

    3、使用管道符调用SQL文件

    复制代码 代码如下:

    [root@SZDB ~]# mysql -uroot -p123456 </root/temp.sql  
    Logging to file '/tmp/temp.log'  
    id      val  
    1       jack  
    2       robin  
    3       mark  
    Outfile disabled.  
      
    #使用管道符调用SQL文件以及输出日志  
    [root@SZDB ~]# mysql -uroot -p123456 </root/temp.sql >/tmp/temp.log  
    [root@SZDB ~]# more /tmp/temp.log  
    Logging to file '/tmp/temp.log'  
    id      val  
    1       jack  
    2       robin  
    3       mark  
    Outfile disabled.  

    4、shell脚本中MySQL提示符下调用SQL

    复制代码 代码如下:

    [root@SZDB ~]# more shell_call_sql2.sh  
    #!/bin/bash  
    mysql -uroot -p123456 <<EOF  
    source /root/temp.sql;  
    select current_date();  
    delete from tempdb.tb_tmp where id=3;  
    select * from tempdb.tb_tmp where id=2;  
    EOF  
    exit;  
    [root@SZDB ~]# ./shell_call_sql2.sh  
    Logging to file '/tmp/temp.log'  
    id      val  
    1       jack  
    2       robin  
    3       mark  
    Outfile disabled.  
    current_date()  
    2014-10-14  
    id      val  
    2       robin  

    5、shell脚本中变量输入与输出

    复制代码 代码如下:

    [root@SZDB ~]# more shell_call_sql3.sh  
    #!/bin/bash  
    cmd="select count(*) from tempdb.tb_tmp"  
    cnt=$(mysql -uroot -p123456 -s -e "${cmd}")  
    echo "Current count is : ${cnt}"  
    exit   
    [root@SZDB ~]# ./shell_call_sql3.sh   
    Warning: Using a password on the command line interface can be insecure.  
    Current count is : 3  
      
    [root@SZDB ~]# echo "select count(*) from tempdb.tb_tmp"|mysql -uroot -p123456 -s  
    3  
      
    [root@SZDB ~]# more shell_call_sql4.sh  
    #!/bin/bash  
    id=1  
    cmd="select count(*) from tempdb.tb_tmp where id=${id}"  
    cnt=$(mysql -uroot -p123456 -s -e "${cmd}")  
    echo "Current count is : ${cnt}"  
    exit   
      
    [root@SZDB ~]# ./shell_call_sql4.sh   
    Current count is : 1   
     
     

    下面附上通过shell命令行非交互式的操作数据库的方法:

    mysql -hhostname -Pport -uusername -ppassword -e 相关mysql的sql语句,不用在mysql的提示符下运行mysql,即可以在shell中操作mysql的方法。

    #!/bin/bash

    HOSTNAME="192.168.111.84"  #数据库信息

    PORT="3306"

    USERNAME="root"

    PASSWORD=""

    DBNAME="test_db_test"  #数据库名称

    TABLENAME="test_table_test" #数据库中表的名称

    #创建数据库

    create_db_sql="create database IF NOT EXISTS ${DBNAME}"

    mysql -h${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} -e "${create_db_sql}"

    #创建表

    create_table_sql="create table IF NOT EXISTS ${TABLENAME} ( name varchar(20), id int(11) default 0 )"

    mysql -h${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} ${DBNAME} -e "${create_table_sql}"

    #插入数据

    insert_sql="insert into ${TABLENAME} values('billchen',2)"

    mysql -h${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} ${DBNAME} -e "${insert_sql}"

    #查询

    select_sql="select * from ${TABLENAME}"

    mysql -h${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} ${DBNAME} -e "${select_sql}"

    #更新数据

    update_sql="update ${TABLENAME} set id=3"

    mysql -h${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} ${DBNAME} -e "${update_sql}"

    mysql -h${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} ${DBNAME} -e "${select_sql}"

    #删除数据

    delete_sql="delete from ${TABLENAME}"

    mysql -h${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} ${DBNAME} -e "${delete_sql}"

    mysql -h${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} ${DBNAME} -e "${select_sql}"

  • 相关阅读:
    消息中间件(一)MQ详解及四大MQ比较
    SIP协议
    PAT (Basic Level) Practice 1008 数组元素循环右移问题
    LeetCode-Algorithms 1. 两数之和
    PAT (Basic Level) Practice 1040 有几个PAT
    PAT (Basic Level) Practice 1023 组个最小数
    PAT (Basic Level) Practice 1021 个位数统计
    PAT (Basic Level) Practice 1007 素数对猜想
    PAT (Basic Level) Practice 1006 换个格式输出整数
    PAT (Basic Level) Practice 1004 成绩排名
  • 原文地址:https://www.cnblogs.com/zhuawang/p/5179838.html
Copyright © 2011-2022 走看看