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语句。如果遇到比较长,或者复杂点的语句,书写会困难点。可以用以下两种方法解决
- mysql -e 加 source
- 通过管道执行
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 用指定的数据