mysql工具和技巧拾遗

一、视图 VIEW
1、是什么?
将一段查询sql封装为一个虚拟的表。
这个虚拟表只保存了sql逻辑,不会保存任何查询结果。
2、作用
1、封装复杂sql语句,提高复用性
2、逻辑放在数据库上面,更新不需要发布程序,面对频繁的需求变更更灵活
3、使用场景
很多地方可以共用的一组查询结果
报表
4、语法
CREATE VIEW view_name AS SELECT column_name(s) FROM table_name
WHERE condition
使用:
select * from view_name
二、触发器 Trigger
1、根据某张表发生的事件比如:insert,update,delete,来触发执行某些处理
2、语法
DELIMITER $$
CREATE TRIGGER tr_afterupdate_t_dept
AFTER UPDATE ON t_dept
FOR EACH ROW
BEGIN
UPDATE t_emp a
LEFT JOIN t_dept b ON a.`deptId` = b.`id`
LEFT JOIN t_emp c ON b.`CEO` = c.`id`
SET a.`ceo_name`=c.name
WHERE b.id=new.id; #new 或old 指向当前正在更新的行
END $$
DELIMITER ;
3、注意事项
1、trigger触发器虽然方便但是非常不利于维护
2、影响数据库性能
3、这种非程序触发的写操作很难被日志追踪
4、触发了某事件的表,不能利用触发器对自己做操作
三、事件 event
1、作用
用来做定时任务
2、语法
CREATE
[DEFINER = { user | CURRENT_USER }]
EVENT
[IF NOT EXISTS]
event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'comment']
DO event_body;
schedule:
AT timestamp [+ INTERVAL interval] ...
| EVERY interval
[STARTS timestamp [+ INTERVAL interval] ...]
[ENDS timestamp [+ INTERVAL interval] ...]
interval:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
3、完成一个定时更新实体表
#创建实体表
CREATE TABLE mv_top_second ( deptid INT ,NAME VARCHAR(200),age INT);
SELECT * FROM mv_top_second
#创建更新实体表的存储过程
delimiter $$
create procedure proc_mv_top_second()
begin
truncate table mv_top_second;
SET @rank=0;
SET @last_deptid=0;
INSERT INTO mv_top_second
SELECT a.deptid,a.name,a.age
FROM (
SELECT
t.*,
IF (@last_deptid=deptid,@rank:=@rank+1,@rank:=1) AS rk,
@last_deptid:=deptid AS last_deptid
FROM t_emp t
ORDER BY deptid ,age DESC
) a WHERE a.rk=2;
end $$
#创建定时任务
DELIMITER $$
CREATE EVENT ev_onemin_job
ON SCHEDULE EVERY 1 MINUTE STARTS NOW() # 从现在开始 每分钟执行1次
ON COMPLETION PRESERVE ENABLE # COMPLETION [NOT] PRESERVE 结束的时候 是否还保存该事件 ENABLE/DISABLE 结束后是否还启用该事件
DO
BEGIN
call proc_mv_top_second();
end$$
四、定时备份数据库
1、需求
每日凌晨2点备份mydb数据库脚本。并以年月为目录,以年月日为文件名,放到/backup/mysql下。
2、备份
mysqldump命令
导出 sql文件
格式: mysqldump -u[用户名] -p[密码] [要导出的数据库]>[导出的文件.sql]
例如:
mysqldump -uroot -p123123 mydb>/backup/mysql/mydb_2017050X.sql
shell:
1、保存成脚本文件 backup.sh
2、if then else fi
linux的判断语句
if [ #判断语句 ]
then
#执行的内容
else
#执行的内容
fi
或者
if test #判断语句
then
#执行的内容
else
#执行的内容
fi
其中判断语句
[ -a FILE ] 如果 FILE 存在则为真。
[ -d FILE ] 如果 FILE 存在且是一个目录则为真。
[ -e FILE ] 如果 FILE 存在则为真。
[ -f FILE ] 如果 FILE 存在且是一个普通文件则为真。
[ FILE1 -nt FILE2 ] 如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1 exists and FILE2 does not则为真。
[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在则为真。
[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则为真。
[ -o OPTIONNAME ] 如果 shell选项 “OPTIONNAME” 开启则为真。
[ -z STRING ] “STRING” 的长度为零则为真。
[ -n STRING ] or [ STRING ] “STRING” 的长度为非零 non-zero则为真。
[ STRING1 == STRING2 ] 如果2个字符串相同。 “=” may be used instead of “==” for strict POSIX compliance则为真。
[ STRING1 != STRING2 ] 如果字符串不相等则为真。
[ STRING1 < STRING2 ] 如果 “STRING1” sorts before “STRING2” lexicographically in the current locale则为真。
[ STRING1 > STRING2 ] 如果 “STRING1” sorts after “STRING2” lexicographically in the current locale则为真。
Linux的编程中常用字符串代替符号,比如用 eq 代替 ==
eq -- equal ==
ne -- not eq !=
gt -- great >
ge -- g&e >=
lt -- little <
le -- l&e <=
3、Linux Shell 中的反引号,单引号,双引号
反引号位 (`) 位于键盘的Tab键的上方、1键的左方。注意与单引号(')位于Enter键的左方的区别。
  在shell脚本中被反引号括起来的字符串会被shell识别为可执行且有返回值的命令。
  如下,shell会执行反引号中的date命令,把结果插入到echo命令显示的内容中。
  [root@localhost sh]# echo The date is `date`
  The date is 2011年 03月 14日 星期一 21:15:43 CST
  
  单引号、双引号用于用户把带有空格的字符串赋值给变量事的分界符。
  [root@localhost sh]# str="Today is Monday"
  [root@localhost sh]# echo $str
  Today is Monday
  如果没有单引号或双引号,shell会把空格后的字符串解释为命令。
  [root@localhost sh]# str=Today is Monday
  bash: is: command not found
  单引号和双引号的区别。单引号告诉shell忽略所有特殊字符,而双引号忽略大多数,但不包括$、\、`。
  [root@localhost sh]# testvalue=100
  [root@localhost sh]# echo 'The testvalue is $testvalue'
  The testvalue is $testvalue
  [root@localhost sh]# echo "The testvalue is $testvalue"
  The testvalue is 100
在shell脚本中被反引号括起来的字符串会被shell识别为可执行且有返回值的命令
所以`date +%Y%m%d` 代表它执行后的结果,即 20170101
----------------------------------------------------------------------------
#! /bin/sh
DIR=/backup/mysql/`date +%Y%m`
DATABASE=mydb
if [ ! -d $DIR ]
then
mkdir -p $DIR
else
echo "already has dir"
fi
echo "start to backup"
mysqldump -uroot -p123123 $DATABASE>$DIR'/'$DATABASE`date +%Y%m%d`'.sql'
echo $DIR'/'$DATABASE`date +%Y%m%d`'.sql'

3、crond和crontab
crond是linux定时任务服务。
通过service crond start/stop来控制服务的启动关闭。
crond是每分钟检查一次事件是否触发。所以linux定时任务最小的执行频率是1分钟。
crontab 是设定、管理定时任务的命令行工具。
通过crontab -e 来定制定时任务
基本格式 :
30  2  1  12  *  command
分 时 日 月 周 命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
crontab文件的一些例子:
30 21 * * * service mysql restart
上面的含义是 每天21点30分执行重启mysql
定时执行脚本就是 0 2 * * * sh /backup/mysql/backup.sh

猜你喜欢

转载自blog.csdn.net/wojiao228925661/article/details/80664095