shell脚本执行mysql语句的几种方法并实现增删改查

shell脚本可以通过执行mysql命令来完成对数据库的操作。对于网站的日志分析,把一些日志信息存储在mysql中,分析起来会更加方便。这里总结一下shell脚本中如何执行mysql命令。

准备工作 首先要有个mysql账号,和一个可以操作的数据库。

-- 创建一个mysql用户
mysql> create user 'shelljiaoben'@localhost identified by '123456';
-- 创建一个可以使用的数据库
 create database dbshelljiaoben;
-- 授权 mysql用户 (shelljiaoben) 可以访问创建的数据库 (dbshelljiaoben)
 grant all privileges on dbshelljiaoben.* to shelljiaoben@localhost;
-- 刷新一下权限表
flush privileges;
Query OK, 0 rows affected (0.00 sec)

其实创建用户,和授权用户访问某个数据库可以使用一行命令搞定。
下面这个行命令,如果用户不存在就会自动创建一个用户。

grant all privileges on dbshelljiaoben.* to shelljiaoben@localhost identified by '123456';

在shell中执行单行mysql语言

使用mysql 的产生 -e

 mysql -ushelljiaoben -p123456 -e "select now()";
+---------------------+
| now()               |
+---------------------+
| 2017-12-20 10:58:17 |
+---------------------+

优点是操作简单,适合执行简单的sql语句。如果遇到比较长,或者复杂点的语句,书写会困难点。可以用以下两种方法解决

  1. mysql -e 加 source
  2. 通过管道执行

shell中通过mysql -e "source ..." 执行sql语句

创建一个sql文件

cat test.sql
use dbshelljiaoben;
drop table if exists `test`;

create table `test` (
    `id` int unsigned not null auto_increment primary key,
    `name` char(20),
    `email` varchar(80)
) charset=utf8 engine=myisam;

通过 mysql 选项 -e 执行命令

mysql -ushelljiaoben -p123456 -e "source test.sql"
echo $? # 输出 0 表示执行成功

通过管道重定向来执行 sql 语句

mysql -ushelljiaoben -p123456  <  test.sql

其他的写法, 常用在脚本中


echo "select now()" | mysql -ushelljiaoben -p123456 mysql -ushelljiaoben -p123456 <<EOF select 1+1; select now(); EOF

shell中执行mysql的增删改查

曾删改查是数据库的最基本操作,如果在shell中执行就需要对mysql这个命令了解多一点。
mysql 中的一些命令参数

参数 含义
-A 禁用一些预读取,如果表多会容易卡,使用-A不进行预读取
-E 垂直显示,每个字段都是一行
-H html方式显示结果
-X xml 格式显示结果
-N 不显示列的名字,仅仅显示结果部分
-q 不缓存结果
-t 表格的形式输出
-u 用户名
-p 密码
-P(大写) 端口

shell中 mysql 增删改查的示例

cat test.sql


use dbshelljiaoben;
drop table if exists `test`;
create table `test` (
    `id` int unsigned not null auto_increment primary key,
    `name` char(20),
    `email` varchar(80)
) charset=utf8 engine=myisam;

insert into `test` (`name`, `email`) values ("zhangsan", "zs#mail");
insert into `test` (`name`, `email`) values ("lisi", "ls#mail");
insert into `test` (`name`, `email`) values ("wangwu", "ww#mail");

执行命令, 创建表,和写入数据

mysql -ushelljiaoben  -p123456 < test.sql
#查看结果
mysql -ushelljiaoben  -p123456 -e "select * from dbshelljiaoben.test"
+----+----------+---------+
| id | name     | email   |
+----+----------+---------+
|  1 | zhangsan | zs#mail |
|  2 | lisi     | ls#mail |
|  3 | wangwu   | ww#mail |
+----+----------+---------+

# 结果写入文本文件
mysql -ushelljiaoben  -p123456 -e "select * from dbshelljiaoben.test" > user.db
# cat user.db
id      name    email
1       zhangsan        zs#mail
2       lisi    ls#mail
3       wangwu  ww#mail

# 如果希望有第一行的 (id      name    email)可以使用参数 -N

# 删除所有的数据
mysql -ushelljiaoben  -p123456 -e "delete  from dbshelljiaoben.test "

# 通过数据库文本文件再次导入数据库
 cat user.db  | sed  '1d' | while read id name email
> do
> mysql -ushelljiaoben -p123456 -e "insert into dbshelljiaoben.test values ({id}, '{name}', '{email}');"
> done

# 获取一个字段的值, 如果没有参数 -N ,输出字段的名字
 name=`mysql -ushelljiaoben  -p123456 -e "select name from dbshelljiaoben.test where id=1";`
 echoname
 name zhangsan
 name=`mysql -ushelljiaoben  -p123456 -N  -e "select name from dbshelljiaoben.test where id=1";`
 echo $name
 zhangsan
# 修改一个字段的值
mysql -ushelljiaoben  -p123456 -N -D dbshelljiaoben  -e "update test  set name='shelljiaoben' where id=1";
这里使用了一个参数 -D 用指定的数据

发表评论

邮箱地址不会被公开。