標籤:
Shell指令碼中執行mysql的幾種方式(轉)
對於自動化營運,諸如備份恢複之類的,DBA經常需要將SQL語句封裝到shell指令碼。本文描述了在Linux環境下mysql資料庫中,shell指令碼下調用sql語句的幾種方法,供大家參考。對於指令碼輸出的結果美化,需要進一步完善和調整。以下為具體的樣本及其方法。
1、將SQL語句直接嵌入到shell指令檔中
複製代碼 代碼如下:
--示範環境
[[email protected] ~]# more /etc/issue
CentOS release 5.9 (Final)
Kernel \r on an \m
[email protected][(none)]> show variables like ‘version‘;
+---------------+------------+
| Variable_name | Value |
+---------------+------------+
| version | 5.6.12-log |
+---------------+------------+
[[email protected] ~]# 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 "\n">>${LOG}
echo "below is output result.">>${LOG}
cat /tmp/temp.log>>${LOG}
echo "script executed successful.">>${LOG}
exit;
[[email protected] ~]# ./shell_call_sql1.sh
Logging to file ‘/tmp/temp.log‘
+------+-------+
| id | val |
+------+-------+
| 1 | jack |
| 2 | robin |
| 3 | mark |
+------+-------+
Outfile disabled.
2、命令列調用單獨的SQL檔案
複製代碼 代碼如下:
[[email protected] ~]# 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
[[email protected] ~]# 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檔案
複製代碼 代碼如下:
[[email protected] ~]# mysql -uroot -p123456 </root/temp.sql
Logging to file ‘/tmp/temp.log‘
id val
1 jack
2 robin
3 mark
Outfile disabled.
#使用管道符調用SQL檔案以及輸出日誌
[[email protected] ~]# mysql -uroot -p123456 </root/temp.sql>/tmp/temp.log
[[email protected] ~]# more /tmp/temp.log
Logging to file ‘/tmp/temp.log‘
id val
1 jack
2 robin
3 mark
Outfile disabled.
4、shell指令碼中MySQL提示符下調用SQL
複製代碼 代碼如下:
[[email protected] ~]# 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;
[[email protected] ~]# ./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指令碼中變數輸入與輸出
複製代碼 代碼如下:
[[email protected] ~]# 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
[[email protected] ~]# ./shell_call_sql3.sh
Warning: Using a password on the command line interface can beinsecure.
Current count is : 3
[[email protected] ~]# echo "select count(*) from tempdb.tb_tmp"|mysql -uroot-p123456 -s
3
[[email protected] ~]# 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
[[email protected] ~]# ./shell_call_sql4.sh
Current count is : 1
轉自:http://blog.sina.com.cn/s/blog_4a80a5730101mbeg.html
下面附上通過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} ( namevarchar(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}"
(轉)http://www.cnblogs.com/zhuawang/p/5179838.html
Shell指令碼中執行mysql的幾種方式(轉)