mysqldump
只导出数据库表结构
mysqldump --opt -h 主机名或地址 -d 数据库名 -u root -p密码 > xxx.sql只导出数据
mysqldump -t 数据库名 -uroot -p密码 > xxx.sql导出数据和表结构
mysqldump 数据库名 -uroot -p密码 > xxx.sql导出指定表结构
mysqldump -uroot -p密码 -B 数据库名 --table 表名 > xxx.sql导出单表数据
mysqldump -h 主机地址 -u用户名 -p密码 数据库名 表名 > xxx.sql导入数据
进入mysql
use 数据库
source xxx.sql
dev 上mysql 相关命令:
sudo service mysql start/stop/restart
mysql 5.6版本慢查询配置参数
slow_query_log = 1
slow_query_log_file = XXX
long_query_time = 1
MySQL 事件调度器
介绍
事件调度器是在 MySQL 5.1 中新增的另一个特色功能,可以作为定时任务调度器,取代部分原先只能用操作系统任务调度器才能完成的定时功能。事件调度器是定时触发执行的,在这个角度上也可以称作是”临时的触发器”。触发器只是针对某个表产生的事件执行一些语句,而事件调度器则是在某一个(间隔)时间执行一些语句。事件是由一个特定的线程来管理的,也就是所谓的”事件调度器”。启用事件调度器后,拥有 SUPER 权限的账户执行 SHOW PROCESSLIST 就可以看到这个线程了。通过设定全局变量event_scheduler 的值即可动态的控制事件调度器是否启用。开启事件调度器
SELECT @@event_scheduler; # 查看事件调度器是否开启
SET GLOBAL event_scheduler = ON; # 开启事件调度器,mysql重启后会失效修改配置文件,开启事件调度器
在 my.cnf 的 [mysqld] 下添加:
event_scheduler=ON
管理事件的相关命令
查看所有事件
show events查看事件创建信息
show create event <event_name>查看事件详细信息
SELECT * FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME = <event_name> AND EVENT_SCHEMA = <schema_name>关闭事件
ALTER EVENT <event_name> DISABLE开启事件
ALTER EVENT <event_name> ENABLE删除事件
DROP EVENT IF EXISTS <event_name>-
创建事件
CREATE EVENT [IF NOT EXISTS] <event_name>
ON SCHEDULE <schedule>
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
[COMMENT 'comment']
DO <sql_statement>;<schedule>:
AT TIMESTAMP [+ INTERVAL INTERVAL]
| EVERY INTERVAL [STARTS TIMESTAMP] [ENDS TIMESTAMP]INTERVAL:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
ON SCHEDULE 计划任务,有两种设定计划任务的方式:
- AT 时间戳,用来完成单次的计划任务。
- EVERY 时间(单位)的数量时间单位[STARTS 时间戳] [ENDS时间戳],用来完成重复的计划任务
在两种计划任务中,时间戳可以是任意的TIMESTAMP 和DATETIME 数据类型,时间戳需要大于当前时间。
在重复的计划任务中,时间(单位)的数量可以是任意非空(Not Null)的整数式,时间单位是关键词:YEAR,MONTH,DAY,HOUR,MINUTE 或者SECOND。
提示:
其他的时间单位也是合法的如:QUARTER, WEEK,YEAR_MONTH,DAY_HOUR,DAY_MINUTE,DAY_SECOND,HOUR_MINUTE,HOUR_SECOND, MINUTE_SECOND,不建议使用这些不标准的时间单位。
ON COMPLETION参数表示"当这个事件不会再发生的时候",即当单次计划任务执行完毕后或当重复性的计划任务执行到了ENDS阶段。而PRESERVE的作用是使事件在执行完毕后不会被Drop掉,建议使用该参数,以便于查看EVENT具体信息。
若干例子:
每秒插入一条记录到数据表
CREATE EVENT e_test_insert
ON SCHEDULE EVERY 1 SECOND
DO INSERT INTO test.aaa VALUES (CURRENT_TIMESTAMP);5天后清空test表:
CREATE EVENT e_test
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 DAY
DO TRUNCATE TABLE test.aaa;2007年7月20日12点整清空test表:
CREATE EVENT e_test
ON SCHEDULE AT TIMESTAMP '2007-07-20 12:00:00'
DO TRUNCATE TABLE test.aaa;每天定时清空test表:
CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
DO TRUNCATE TABLE test.aaa;5天后开启每天定时清空test表:
CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY
DO TRUNCATE TABLE test.aaa;每天定时清空test表,5天后停止执行:
CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
ENDS CURRENT_TIMESTAMP + INTERVAL 5 DAY
DO TRUNCATE TABLE test.aaa;5天后开启每天定时清空test表,一个月后停止执行:
CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY
ENDS CURRENT_TIMESTAMP + INTERVAL 1 MONTH
DO TRUNCATE TABLE test.aaa;每天凌晨一点执行
CREATE EVENTevent_call_inproc
ON SCHEDULE EVERY 1 DAY
STARTS '2013-09-12 01:00:00'
ON COMPLETION PRESERVE ENABLE
DO call ty.inproc();每天凌晨三点执行
create event event_call_defer
on schedule every 1 day
starts date_add(date(curdate() + 1),interval 3 hour)
on completion preserve enable
do call test.warn();每个月的一号凌晨1 点执行
CREATE EVENT EVENT2
ON SCHEDULE EVERY 1 MONTH
STARTS DATE_ADD(DATE_ADD(DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY),INTERVAL 1 MONTH),INTERVAL 1 HOUR)
ON COMPLETION PRESERVE ENABLE
DO CALL STAT();每个季度一号的凌晨2点执行
CREATE EVENT TOTAL_SEASON_EVENT
ON SCHEDULE EVERY 1 QUARTER
STARTS DATE_ADD(DATE_ADD(DATE( CONCAT(YEAR(CURDATE()),'-',ELT(QUARTER(CURDATE()),1,4,7,10),'-',1)),INTERVAL 1 QUARTER),INTERVAL 2 HOUR)
ON COMPLETION PRESERVE ENABLE
DO CALL SEASON_STAT();
- 每年1月1号凌晨四点执行
CREATE EVENT TOTAL_YEAR_EVENT
ON SCHEDULE EVERY 1 YEAR
STARTS DATE_ADD(DATE(CONCAT(YEAR(CURDATE()) + 1,'-',1,'-',1)),INTERVAL 4 HOUR)
ON COMPLETION PRESERVE ENABLE
DO CALL YEAR_STAT();
[ON COMPLETION [NOT] PRESERVE]可以设置这个事件是执行一次还是持久执行,默认为NOT PRESERVE。
- 每天定时清空test表(只执行一次,任务完成后就终止该事件):
CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
ON COMPLETION NOT PRESERVE
DO TRUNCATE TABLE test.aaa;
[ENABLE | DISABLE]可是设置该事件创建后状态是否开启或关闭,默认为ENABLE。
[COMMENT 'comment']可以给该事件加上注释。
修改事件
ALTER EVENT event_name
[ON SCHEDULE schedule]
[RENAME TO new_event_name]
[ON COMPLETION [NOT] PRESERVE]
[COMMENT 'comment']
[ENABLE | DISABLE]
[DO sql_statement]将每天清空test表改为5天清空一次:
ALTER EVENT e_test
ON SCHEDULE EVERY 5 DAY;
MySQL 预定义语句
介绍
借助预定义语句可以实现动态SQL语句语法
定义
PREPARE
<stmt_name>
FROM
<preparable_stmt>
执行
EXECUTE <stmt_name>注意
1> 即使 preparable_stmt 语句中的 ? 所代表的是一个字符串,你也不需要将 ? 用引号包含起来
2> 如果新的 PREPARE 语句使用了一个已存在的 stmt_name ,那么原有的将被立即释放!
即使这个新的 PREPARE 语句因为错误而不能被正确执行
3> PREPARE stmt_name 的作用域是当前客户端连接会话可见
4> 要释放一个预定义语句的资源,可以使用 DEALLOCATE PREPARE 句法
5> 执行语句中,如果 stmt_name 不存在,将会引发一个错误
6> 如果在终止客户端连接会话时,没有显式地调用 DEALLOCATE PREPARE 句法释放资源,服务器端会自己动释放它
7> PREPARE 语句不可以用于存储过程,自定义函数!但从 MySQL 5.0.13 开始,它可以被用于存储过程,仍不支持在函数中使用!
例子:
SET @skip=1; SET @numrows=5;
PREPARE STMT FROM "SELECT * FROM tbl LIMIT ?, ?";
EXECUTE STMT USING @skip, @numrows;
# 根据当前日期创建表
set @tb_name = replace(current_date(), '-', '');
set @sqlcmd = concat("create table if not exists pay.", @tb_name, "(id int primary key);");
prepare stmt from @sqlcmd;
execute stmt;