linux下用shell编写linux shell脚本编写mysql问题。

通过shell脚本进行数据库操作
在做一些日常的运维工作的时候,经常需要些一些shell脚本进行设备性能以及其它参数的监控。在过去的一年工作中,接触到的比较多的是对数据库中某些信息的监控。
于是就想到了用shell+mysql+crontab进行实现。
下面附上通过shell命令行非交互式的操作数据库的方法:
mysql -hhostname -Pport -uusername -ppassword
相关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
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}"
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。Linux下MySQL主从同步监控shell脚本 | 系统运维
技术交流QQ群:& && && &
现在的位置:
Linux下MySQL主从同步监控shell脚本
操作系统:CentOS
目的:定时监控MySQL主从数据库是否同步,如果不同步,记录故障时间,并执行命令使主从恢复同步状态
1、创建脚本文件
vi /home/crontab/check_mysql_slave.sh
#编辑,添加下面代码
# check_mysql_slave status
# author www.osyunwei.com
mysql_binfile=/usr/local/mysql/bin/mysql
mysql_user=root
#MySQL数据库账号
mysql_pass=123456
mysql_sockfile=/tmp/mysql.sock
datetime=`date +"%Y-%m-%d/%H:%M:%S"`
#获取当前时间
mysql_slave_logfile=/home/logs/check_mysql_slave.log
#日志文件路径,必须提前创建好
slave_ip=`ifconfig $ip|grep "inet addr" | awk -F[:" "]+ '{print $4}'`
status=$($mysql_binfile -u$mysql_user -p$mysql_pass -S $mysql_sockfile -e "show slave status\G" | grep -i "running")
Slave_IO_Running=`echo $status | grep Slave_IO_Running | awk ' {print $2}'`
Slave_SQL_Running=`echo $status | grep Slave_SQL_Running | awk '{print $2}'`
if [ "$Slave_IO_Running" = "Yes" -a "$Slave_SQL_Running" = "Yes" ]
then echo "Slave is Running!"
echo " $datetime $slave_ip Slave is not running!" && $mysql_slave_logfile
$mysql_binfile -u$mysql_user -p$mysql_pass -S $mysql_sockfile -e "SLAVE STOP;"
$mysql_binfile -u$mysql_user -p$mysql_pass -S $mysql_sockfile -e "SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;"
$mysql_binfile -u$mysql_user -p$mysql_pass -S $mysql_sockfile -e "SLAVE START;"
$mysql_binfile -u$mysql_user -p$mysql_pass -S $mysql_sockfile -e "EXIT"
chmod +x /home/crontab/check_mysql_slave.sh
#添加脚本执行权限
2、添加任务计划,修改/etc/crontab
温馨提醒:qihang01原创内容 版权所有,转载请注明出处及原文链接
vi /etc/crontab #在最后一行添加
*/10 * * * * root /home/crontab/check_mysql_slave.sh
#表示每10分钟执行一次
3、重新启动crond使设置生效
/etc/rc.d/init.d/crond restart
#yum install -y vixie-cron安装计划任务,某些系统上可能没有预装
chkconfig crond on #设为开机启动
service crond start #启动
可以根据日志文件/home/logs/check_mysql_slave.log查看MySQL主从同步状态
至此,Linux下MySQL主从同步监控shell脚本完成。
&&&&&>> 本文链接:>> 订阅本站:>> 转载请注明来源: >>
&&系统运维技术交流QQ群:①& ②& ③&
【上篇】【下篇】
您可能还会对这些文章感兴趣!
您必须才能发表留言!
本分类最新文章
日志总数:336篇
评论总数:1030条
分类总数:70个
标签总数:479个
友情链接:36个
网站运行:2435天
最后更新:日
欢迎PR值≥3的IT类技术博客与本站友情链接(申请前请先做好本站链接)
Copyright&
系统运维 All rights reserved
版权声明:本站所有文章均为作者原创内容,如需转载,请注明出处及原文链接使用Linux的Shell脚本定时处理MySQL超时
转载 & & 作者:
本文提供使用Linux的Shell脚本定时处理MySQL超时Locked进程脚本
最近一段时间,我刚刚进入一家新公司,并接手了这里的一个站点,由于这个站点的架构设计不太合理,导致MySQL的压力始终很大,经常出现超时的Locked进程,于是编写了一段Linux的Shell脚本来定时kill掉这些进程。脚本如下: 代码如下:#!/bin/bash mysql_pwd="xxxxxx" #mysql的root密码 mysql_exec="/usr/local/mysql/bin/mysql"tmp_dir="/tmp"file_sh="$tmp_dir/mysql_kill_locked.sh"file_tmp="$tmp_dir/mysql_kill_locked.tmp"file_log="$tmp_dir/mysql_kill_locked.log" #日志 $mysql_exec -uroot -p$mysql_pwd -e "show processlist" | grep -i "Locked" & $file_tmp cat $file_tmp && $file_log for line in `cat $file_tmp | awk '{print $1}'` doecho "$mysql_exec -uroot -p$mysql_pwd -e "kill $line"" && $file_sh donechmod +x $file_sh sh $file_sh #执行临时脚本 & $file_sh #清空临时脚本&最后,将这段脚本加入到crontab,定时执行即可。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具shell脚本:MySQL启动简易脚本
<span type="1" blog_id="1704762" userid='
分享到朋友圈
好的文章,和好友一起分享shell脚本连接、读写、操作mysql数据库实例
转载 & & 作者:蓝色夏威夷
这篇文章主要介绍了shell脚本连接、读写、操作mysql数据库实例,本文包含连接、读取、插入、创建数据库等操作示例,需要的朋友可以参考下
本文介绍了如何在shell中读写mysql数据库。主要介绍了如何在shell 中连接mysql数据库,如何在shell中创建数据库,创建表,插入csv文件,读取mysql数据库,导出mysql数据库为xml或html文件, 并分析了核心语句。本文介绍的方法适用于PostgreSQL ,相对mysql而言,shell 中读写PostgreSQL会更简单些。
1. 连接mysql 数据库
shell中连接数据库的方法很简单,只需要指定用户名,密码,连接的数据库名称,然后通过重定向,输入mysql的语句,如下所示:
代码如下:mysql -u USERNAME -p PASSWORD DATABASENAME &&EOF 2&/dev/null
但这并不是一个好办法,任何使用该脚本的用户都能看到该数据库用户的账号和密码,要解决这个问题,可以用mysql 数据库的一个特殊配置文件。mysql 数据库使用$HOME/.my.cnf 文件来读取特殊的启动命令和设置。其中一项设置是由该用户账户发起的mysql 会话的默认密码。要在这个文件中设置默认密码,可以加入下面的内容:
password = 123456
然后,别忘了修改权限:
chmod 400& .my.cnf
这样就可以通过脚本访问mysql数据库了,如下所示:
#!/bin/bash
MYSQL=`which mysql`
$MYSQL test -u root && EOF
select * from employees where salary & 4000;
2. 创建数据库
通过上面的方法连接数据库,再通过重定向输入mysql语句,shell中读写mysql基本就介绍完了。只要把sql语句写对了,通过重定向执行即可,下面来看一个实例:
#!/bin/bash
##############################
# @file create_db_mysql.sh
# @brief create database and tables in mysql
# @author Mingxing LAI
# @version 0.1
##############################
USER="root"
DATABASE="students"
TABLE="students"
######################
#crate database
mysql -u $USER && EOF 2&/dev/null
CREATE DATABASE $DATABASE
[ $&#63; -eq 0 ] && echo "created DB" || echo DB already exists
######################
#create table
mysql -u $USER $DATABASE && EOF 2&/dev/null
CREATE TABLE $TABLE(
name varchar(100),
dept varchar(4)
[ $&#63; -eq 0 ] && echo "Created table students" || echo "Table students already exist"
######################
#delete data
mysql -u $USER $DATABASE && EOF 2&/dev/null
DELETE FROM $TABLE;
这个脚本比较简单,就是几条SQL语句,没什么好解释的,下面来看一下,如何读入csv 文件,然后插入到mysql数据库中。
3. 插入csv 文件
上面创建了一个学生表,表中有学生的学号,姓名,成绩,系别,假设有一个csv文件,内容如下:
代码如下:$cat data
1,Navin M,98,CS
2,Kavya N,70,CS
3,Nawaz O,80,CS
4,Hari S,80,EC
5,Alex M,50,EC
6,Neenu J,70,EC
7,Bob A,30,EC
8,Anu M,90,AE
9,Sruthi,89,AE
10,Andrew,89,AE
为了将csv 文件插入到数据库,我们需要逐行读入,然后给字符串加上双引号,最后生成语句如下:
insert into students VALUES(1, "Navin M", 98, "CS");
要解析csv 文件,最好的工具莫过于awk了,将域的分隔符指定为逗号-F,,awk就自动将各个域拆分出来了,然后在需要双引号的地方打印输出一个双引号,就能够轻松得到下面这样的数据:
代码如下:1, "Navin M", 98, "CS" awk 代码如下:
query=`echo $line | awk -F, '{ printf("%s,\"%s\",%s,\"%s\"", $1, $2, $3, $4)}'`
statement=`echo "INSERT INTO $TABLE VALUES($query);"`
echo $statement
当然了,你也可以用其他办法,不过,几乎没有比awk更简单的了,第2种方法如下:
oldIFS=$IFS
values=($line)
values[1]="\"`echo ${values[1]} | tr ' ' '#' `\""
values[3]="\"`echo ${values[3]}`\""
query=`echo ${values[@]} | tr ' #' ', '`
IFS=$oldIFS
statement=`echo "INSERT INTO $TABLE VALUES($query);"`
echo "$statement"
首先通过指定域分隔符,将csv文件解析成一个数组,然后将空格替换成一个特殊的符号"#"(因为后面的替换中,会一次性输出数组,而数组是用空格分隔各字段,我们要将分隔数组的空格替换成逗号,所以这里将数据中的空格替换成"#") ,给字符串加上双引号,最后再把空格替换成逗号,把"#"替换为空格。这种方法真是让人抓狂,我第一次就没有看明白,尤其是为什么要将空格替换成"#"。
完整的插入数据的程序如下:
#!/bin/bash
# @file write_to_db_mysql.sh
# @brief wirte data to database in mysql
# @author Mingxing LAI
# @version 0.1
USER="root"
DATABASE="students"
TABLE="students"
if [ $# -ne 1 ]; then
&&& echo $0 DATAFILE
&&& exit 2
#&& query=`echo $line | awk -F, '{ printf("%s,\"%s\",%s,\"%s\"", $1, $2, $3, $4)}'`
&&& oldIFS=$IFS
&&& values=($line)
&&& values[1]="\"`echo ${values[1]} | tr ' ' '#' `\""
&&& values[3]="\"`echo ${values[3]}`\""
&&& query=`echo ${values[@]} | tr ' #' ', '`
&&& IFS=$oldIFS
&&& statement=`echo "INSERT INTO $TABLE VALUES($query);"`
#&& echo $statement
mysql -u $USER $DATABASE && EOF
&&& INSERT INTO $TABLE VALUES($query);
done & $data
if [[ $&#63; -eq 0 ]]; then
&&& echo "Wrote data into DB"
4. 读取数据
知道怎么在shell 中连接mysql ,也知道了怎么在shell中批量执行sql 语句,读取数据,就没有任何难度了。
代码如下:#!/bin/bash
# @file read_db_mysql.sh
# @brief read data from mysql
# @author Mingxing LAI
# @version 0.1
USER="root"
DATABASE="students"
TABLE="students"
#用tail 去掉表头
depts=`mysql -u $USER $DATABASE &&EOF | tail -n +2
SELECT DISTINCT dept FROM $TABLE;
for d in $ do
&&& echo Department: $d
&&& result="`mysql -u $USER $DATABASE && EOF
&&& set @i:=0;
&&& SELECT @i:=@i+1 as rank, name, mark FROM students WHERE dept="$d" ORDER BY mark DESC;
echo "$result"
我们还可以在mysql语句中,使用选项来控制数据的输出格式
&&& -H 输出为html
&&& -X 输出为xml
如下所示:
#!/bin/bash
USER="root"
DATABASE="students"
TABLE="students"
mysql -u $USER $DATABASE -H && EOF
select * from $TABLE
html 格式的可读性比较差,输出效果如下:
代码如下:&TABLE BORDER=1&&TR&&TH&id&/TH&&TH&name&/TH&&TH&mark&/TH&&TH&dept&/TH&&/TR&&TR&&TD&1&/TD&&TD&Navin M&/TD&&TD&98&/TD&&TD&CS&/TD&&/TR&&TR&&TD&2&/TD&&TD& Kavya N&/TD&&TD&70&/TD&&TD&CS&/TD&&/TR&&TR&&TD&3&/TD&&TD& Nawaz O&/TD&&TD&80&/TD&&TD&CS&/TD&&/TR&&TR&&TD&4&/TD&&TD&Hari S&/TD&&TD&80&/TD&&TD&EC&/TD&&/TR&&TR&&TD&5&/TD&&TD&Alex M&/TD&&TD&50&/TD&&TD&EC&/TD&&/TR&&TR&&TD&6&/TD&&TD&Neenu J&/TD&&TD&70&/TD&&TD&EC&/TD&&/TR&&TR&&TD&7&/TD&&TD&Bob A&/TD&&TD&30&/TD&&TD&EC&/TD&&/TR&&TR&&TD&8&/TD&&TD&Anu M&/TD&&TD&90&/TD&&TD&AE&/TD&&/TR&&TR&&TD&9&/TD&&TD&Sruthi&/TD&&TD&89&/TD&&TD&AE&/TD&&/TR&&TR&&TD&10&/TD&&TD&Andrew&/TD&&TD&89&/TD&&TD&AE&/TD&&/TR&&/TABLE&
可读性差也可以理解,因为人家觉得,你没必要修改么,直接以html形式展示数据就可以了。
代码如下:id&&& name&&& mark&&& dept
1&&& Navin M&&& 98&&& CS
2&&& Kavya N&&& 70&&& CS
3&&& Nawaz O&&& 80&&& CS
4&&& Hari S&&& 80&&& EC
5&&& Alex M&&& 50&&& EC
6&&& Neenu J&&& 70&&& EC
7&&& Bob A&&& 30&&& EC
8&&& Anu M&&& 90&&& AE
9&&& Sruthi&&& 89&&& AE
10&&& Andrew&&& 89&&& AE
xml形式的数据显示就比较正常了,直接将上面的-H 换成-X,输出如下:
代码如下:&&#63;xml version="1.0"&#63;&
&resultset statement="select * from students" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&
&&& &field name="id"&1&/field&
&&& &field name="name"&Navin M&/field&
&&& &field name="mark"&98&/field&
&&& &field name="dept"&CS&/field&
&&& &field name="id"&2&/field&
&&& &field name="name"& Kavya N&/field&
&&& &field name="mark"&70&/field&
&&& &field name="dept"&CS&/field&
&/resultset&
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具}

我要回帖

更多关于 linux mysql webshell 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信