浏览目录

  • 视图

  • 触发器

  • 存储过程

  • 函数

  • 事务

  • 数据库锁

  • 数据库备份

  • 事件

一、视图

1、视图概念

视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据.

2、视图特点

  • 视图的列可以来自不同的表,是表的抽象和逻辑意义上建立的新关系

  • 视图是由基本表(实表)产生的表(虚表)

  • 视图的建立和删除不影响基本表

  • 对视图内容的更新(添加、删除和修改)直接影响基本表

  • 当视图来自多个基本表时,不允许添加,修改和删除数据

3、视图的本质

视图是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用“视图名称”即可获取结果集,可以将该结果集当做表来使用.

4、创建视图

1
create view 视图名称  as  SQL语句;

5、使用视图

1
select  *  from  视图名称;

6、更新视图

1
alter view 视图名称 AS SQL语句;

7、删除视图

1
drop view 视图名称;

二、触发器

1、触发器概念

监视某种情况,并触发某种操作。

2、触发器创建语法四要素

  • 监视地点(table)

  • 监视事件(insert/update/delete)

  • 触发时间(after/before)

  • 触发事件(insert/update/delete)

3、创建语法

1
2
3
4
5
6
7
8
create trigger triggerName  after / before  insert / update / delete
      on 表名  for  each row  #这句话是固定的
begin
      #需要执行的sql语句
end
注意 1 :after / before只能选一个 ,after 表示后置触发, before 表示前置触发
注意 2 :insert / update / delete只能选一个
特别的:NEW表示即将插入的数据行,OLD表示即将删除的数据行

4、触发器的使用   

触发器无法由用户直接调用,而知由于对表的insert/update/delete操作被动引发的。

5、删除触发器

1
drop trigger 触发器名称;

三、存储过程

1、存储过程概念

类似于函数(方法),简单的说存储过程是为了完成某个数据库中的特定功能而编写的语句集合, 
该语句集包括SQL语句(对数据的增删改查)、条件语句和循环语句等。

2、查看现有的存储过程

1
show procedure status;

3、删除存储过程

1
drop procedure 存储过程名称;

4、调用存储过程

1
call 存储过程名称(参数入 / 出类型 参数名 数据类型);

5、创建存储过程

  • 封装
1
2
3
4
create procedure p1 ()
         begin
              select  *  from  account; 
          end
  • 参数
1
2
3
4
5
6
7
8
9
10
11
create procedure p2( in  int ,out n varchar( 50 ))
begin
  select name into n  from  account where  id  =  i;
end
 
- -  调用
set  @name  = null;
CALL p2( 1 ,@name);
select @name;
注意:mysql中有三种出入参数类型,分别为: 1 in  入参类型  2 、out 出参类型  3 、inout 出入参类型
注意:into关键字可以将前面字段的查询结果执行给into后面的变量.
  • 控制
1
2
3
4
5
6
7
8
create procedure p3( in  int , in  c char( 1 ))
begin
     if  = 'd'  then
          select  *  from  account where money >x;
     else
          select  *  from  account where money <x;    
     end  if ;
end
  • 循环:

例-计算1-100累加的和,并且返回计算结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
create procedure p4(inout n  int )
begin
       DECLARE  sum  int  default  0 - -  设置总和变量,并且指定初始值 0
       declare i  int - -  声明变量
       set  =  0 ;     - -  通过 set 为变量设置值
     while  i< = n DO   - -  开始循环
             set  sum  =  sum  + i;
             set  =  i + 1 ;
       end  while - -  结束循环
    select  sum - -  提供结果         
      set  =  sum ; - - 将计算结果提供给 输出变量 n;
end;
 
- -  调用:
set  @n  =  100 ;
call p4(@n);
select @n;

6、存储过程优点

  • 存储过程增强了SQL语言灵活性。存储过程可以使用控制语句编写,可以完成复杂的判断和较复杂的运算,有很强的灵活性;

  • 减少网络流量,降低了网络负载。存储过程在服务器端创建成功后,只需要调用该存储过程即可,而传统的做法是每次都将大量的SQL语句通过网络发送至数据库服务器端然后再执行

  • 存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译。一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。

7、存储过程缺点

  • 扩展功能不方便

  • 不便于系统后期维护

四、函数

1、MySQL提供的内建函数

 View Code

2、自定义函数

1
2
3
4
5
6
7
CREATE FUNCTION fun1(i1  int ,i2  int )
RETURNS  INT  / / 设置返回类型
BEGIN
     DECLARE  sum  int  default  0 ;
     set  sum  =  i1 + i2;
     RETURN( sum );  / / 返回结果
END

3、调用自定义函数

1
2
3
4
5
#直接调用自定义函数
select fun1( 1 , 5 );
 
#在sql语句中使用自定义函数
select fun1(参数 1 ,参数 2 ),name  from  表名

4、删除自定义函数

1
DROP FUNCTION fun_name;

5、函数与存储过程的区别

函数存储过程
一般用于计算数据完成特定任务
声明为 FUNCTION声明为 PROCEDURE
需要描述返回类型,且PL/SQL块中至少有一个有效的RETURN语句无返回类型,可通过IN、OUT、INOUT参数返回多个值
不能独立运行,必须作为表达式的一部分可作为一个独立的PL/SQL语句运行
在 DML 和 DQL 中可调用函数在 DML 和 DQL 中不可调用过程

 

函数接收参数,并返回一个值。

存储过程接收参数,并创造一个返回值,还可以执行sql语句,并把结果返回。

五、事务

1、事务概念

一组SQL语句批量执行,要么全部执行成功,要么全部执行失败

2、事务的作用

为了解决如今多用户、多程序、多线程情况下对同一个表可能同时有很多人在用,为保持数据的一致性,所以有了事务的概念。

3、事务的特性

  • 原子性(Atom):对于其数据修改,要么全都执行,要么全都不执行。

  • 一致性(Consistent):数据库原来有什么样的约束,事务执行之后还需要存在这样的约束,所有规则都必须应用于事务的修改,以保持所有数据的完整性。

  • 隔离性(Isolate):一个事务不能知道另外一个事务的执行情况(中间状态)

  • 持久性(Durable):即使出现致命的系统故障也将一直保持。

  • 注意: 

    • 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。

    • 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。

    • 事务用来管理 insert/update/delete 语句


4、事务控制语句

  • BEGIN 或 START TRANSACTION;显式地开启一个事务;

  • COMMIT;也可以使用COMMIT WORK,不过二者是等价的。COMMIT会提交事务,并使已对数据库进行的所有修改称为永久性的;

  • ROLLBACK;有可以使用ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;

  • SAVEPOINT : 保存点,可以把一个事物分割成几部分.在执行ROLLBACK时可以指定在什么位置上进行回滚操作.

  • 注意: SET AUTOCOMMIT=0禁止自动提交和SET AUTOCOMMIT=1开启自动提交.

六、数据库锁

1、锁的基本概念

当并发事务同时访问一个资源时,有可能导致数据不一致,因此需要一种机制来将数据访问顺序化,以保证数据库数据的一致性。

2、锁的基本类型

    • 多个事务同时读取一个对象的时候,是不会有冲突的。同时读和写,或者同时写才会产生冲突。 
      因此为了提高数据库的并发性能,通常会定义两种锁:共享锁和排它锁。

    • 共享锁(Shared Lock,也叫S锁) 
      共享锁(S)表示对数据进行读操作。因此多个事务可以同时为一个对象加共享锁。 
      (如果试衣间的门还没被锁上,顾客都能够同时进去参观)

    • 排他锁(Exclusive Lock,也叫X锁) 
      排他锁(X)表示对数据进行写操作。如果一个事务对 对象加了排他锁,其他事务就不能再给它加任何锁了。 
      (某个顾客把试衣间从里面反锁了,其他顾客想要使用这个试衣间,就只有等待锁从里面给打开了)

3、实际开发中常见的两种锁

    • 悲观锁 
      行为悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block(阻塞)直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制. 
      注意:要使用悲观锁,我们必须关闭mysql数据库的自动提交属性.因为MySQL默认使用autocommit模式,也就是说,当你执行一个更新操作后,MySQL会立刻将结果进行提交。关闭自动提交命令为:set autocommit=0; 
      注意:在使用悲观锁时,如果表中没有指定主键,则会进行锁表操作. 
      注意: 悲观锁的确保了数据的安全性,在数据被操作的时候锁定数据不被访问,但是这样会带来很大的性能问题。 
      因此悲观锁在实际开发中使用是相对比较少的。  

    • 乐观锁(需要自行实现) 
      行为乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。 

    • 实现的两种方式: 

      • 使用数据版本(Version)记录机制实现,这是乐观锁最常用的一种实现方式。即为数据增加一个版本标识,一般是通过为数据库表增加一个数字类型的 “version” 字段来实现。当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一。当我们提交更新的时候,判断数据库表对应记录 的当前版本信息与第一次取出来的version值进行比对,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据。

      • 同样是在需要乐观锁控制的table中增加一个字段,名称无所谓,字段类型使用时间戳 (datatime), 和上面的version类似,也是在更新提交的时候检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比,如果一致则OK,否则就是版本冲突。

4、悲观锁类乐观锁的优缺点

  • 乐观锁适用于写入比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量

  • 但如果经常产生冲突,上层应用会不断的进行重试操作,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适

锁的用法示例
1
2
3
4
5
6
7
8
9
-  终端:
     begin;
     select xx  from  xx  for  update;  #必须加
     commit;
-  pymysql
     cursor.execute( 'select * from xx for update' )
-  django   #事务
     with trancation.automic():
         models.User.objects. all ().for_update()

七、数据库备份

1、mysqldump命令实现备份

mysqldump 命令将数据库中的数据备份成一个文本文件。表的结构和表中的数据将存储在生成的文本文件中。 
mysqldump命令的工作原理很简单。它先查出需要备份的表的结构,再在文本文件中生成一个CREATE语句。 
然后,将表中的所有记录转换成一条INSERT语句。然后通过这些语句,就能够创建表并插入数据。

2、使用mysqldump实现逻辑备份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#语法:
# mysqldump -h 服务器 -u用户名 -p密码 数据库名 > 备份文件.sql
 
#示例:
#单库备份
mysqldump  - uroot  - p123456 db1 > c: / db1.sql
mysqldump  - uroot  - p123456 db1 table1 table2 > c: / db1 - table1 - table2.sql
 
#多库备份
mysqldump  - uroot  - p123456  - - databases db1 db2 mysql db3 > c: / db1_db2_mysql_db3.sql
 
#备份所有库
mysqldump  - uroot  - p123456  - - all - databases > c: / all .sql
 
注意:可能MySQL5. 7 的用户在使用mysqldump备份时会报错 mysqldump: unkown option  '--no-beep' ,处理办法如下:
1.  删除my.ini [client]下的 no - beep 参数;
2.  在 mysqldump 后加 - - no - defaults参数,即:mysqldump  - - no - defualts  - h主机IP  - u用户名  - p密码 数据库 > xxx.sql  

3、恢复逻辑备份

1
2
3
4
5
#在mysql命令下,用source命令导入备份文件:
mysql>  USE 数据库名;
mysql>  source 备份文件.sql;
 
注意:只能在cmd界面下执行source命令,不能在mysql工具里面执行source命令,会报错,因为cmd是直接调用mysql.exe来执行命令的。  

4、Mysqldump命令补充

复制代码

  1 --all-databases  , -A  2 导出全部数据库。  3 mysqldump  -uroot -p --all-databases  4 --all-tablespaces  , -Y  5 导出全部表空间。  6 mysqldump  -uroot -p --all-databases --all-tablespaces  7 --no-tablespaces  , -y  8 不导出任何表空间信息。  9 mysqldump  -uroot -p --all-databases --no-tablespaces 10 --add-drop-database 11 每个数据库创建之前添加drop数据库语句。 12 mysqldump  -uroot -p --all-databases --add-drop-database 13 --add-drop-table 14 每个数据表创建之前添加drop数据表语句。(默认为打开状态,使用--skip-add-drop-table取消选项) 15 mysqldump  -uroot -p --all-databases  (默认添加drop语句) 16 mysqldump  -uroot -p --all-databases –skip-add-drop-table  (取消drop语句) 17 --add-locks 18 在每个表导出之前增加LOCK TABLES并且之后UNLOCK  TABLE。(默认为打开状态,使用--skip-add-locks取消选项) 19 mysqldump  -uroot -p --all-databases  (默认添加LOCK语句) 20 mysqldump  -uroot -p --all-databases –skip-add-locks   (取消LOCK语句) 21 --allow-keywords 22 允许创建是关键词的列名字。这由表名前缀于每个列名做到。 23 mysqldump  -uroot -p --all-databases --allow-keywords 24 --apply-slave-statements 25 在'CHANGE MASTER'前添加'STOP SLAVE',并且在导出的最后添加'START SLAVE'。 26 mysqldump  -uroot -p --all-databases --apply-slave-statements 27 --character-sets-dir 28 字符集文件的目录 29 mysqldump  -uroot -p --all-databases  --character-sets-dir=/usr/local/mysql/share/mysql/charsets 30 --comments 31 附加注释信息。默认为打开,可以用--skip-comments取消 32 mysqldump  -uroot -p --all-databases  (默认记录注释) 33 mysqldump  -uroot -p --all-databases --skip-comments   (取消注释) 34 --compatible 35 导出的数据将和其它数据库或旧版本的MySQL 相兼容。值可以为ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options等, 36 要使用几个值,用逗号将它们隔开。它并不保证能完全兼容,而是尽量兼容。 37 mysqldump  -uroot -p --all-databases --compatible=ansi 38 --compact 39 导出更少的输出信息(用于调试)。去掉注释和头尾等结构。可以使用选项:--skip-add-drop-table  --skip-add-locks --skip-comments --skip-disable-keys 40 mysqldump  -uroot -p --all-databases --compact 41 --complete-insert,  -c 42 使用完整的insert语句(包含列名称)。这么做能提高插入效率,但是可能会受到max_allowed_packet参数的影响而导致插入失败。 43 mysqldump  -uroot -p --all-databases --complete-insert 44 --compress, -C 45 在客户端和服务器之间启用压缩传递所有信息 46 mysqldump  -uroot -p --all-databases --compress 47 --create-options,  -a 48 在CREATE TABLE语句中包括所有MySQL特性选项。(默认为打开状态) 49 mysqldump  -uroot -p --all-databases 50 --databases,  -B 51 导出几个数据库。参数后面所有名字参量都被看作数据库名。 52 mysqldump  -uroot -p --databases test mysql 53 --debug 54 输出debug信息,用于调试。默认值为:d:t,/tmp/mysqldump.trace 55 mysqldump  -uroot -p --all-databases --debug 56 mysqldump  -uroot -p --all-databases --debug=” d:t,/tmp/debug.trace” 57 --debug-check 58 检查内存和打开文件使用说明并退出。 59 mysqldump  -uroot -p --all-databases --debug-check 60 --debug-info 61 输出调试信息并退出 62 mysqldump  -uroot -p --all-databases --debug-info 63 --default-character-set 64 设置默认字符集,默认值为utf8 65 mysqldump  -uroot -p --all-databases --default-character-set=utf8 66 --delayed-insert 67 采用延时插入方式(INSERT DELAYED)导出数据 68 mysqldump  -uroot -p --all-databases --delayed-insert 69 --delete-master-logs 70 master备份后删除日志. 这个参数将自动激活--master-data。 71 mysqldump  -uroot -p --all-databases --delete-master-logs 72 --disable-keys 73 对于每个表,用/*!40000 ALTER TABLE tbl_name DISABLE KEYS */;和/*!40000 ALTER TABLE tbl_name ENABLE KEYS */;语句引用INSERT语句。这样可以更快地导入dump出来的文件,因为它是在插入所有行后创建索引的。该选项只适合MyISAM表,默认为打开状态。 74 mysqldump  -uroot -p --all-databases 75 --dump-slave 76 该选项将主的binlog位置和文件名追加到导出数据的文件中(show slave status)。设置为1时,将会以CHANGE MASTER命令输出到数据文件;设置为2时,会在change前加上注释。该选项将会打开--lock-all-tables,除非--single-transaction被指定。该选项会自动关闭--lock-tables选项。默认值为0。 77 mysqldump  -uroot -p --all-databases --dump-slave=1 78 mysqldump  -uroot -p --all-databases --dump-slave=2 79 --master-data 80 该选项将当前服务器的binlog的位置和文件名追加到输出文件中(show master status)。如果为1,将会输出CHANGE MASTER 命令;如果为2,输出的CHANGE  MASTER命令前添加注释信息。该选项将打开--lock-all-tables 选项,除非--single-transaction也被指定(在这种情况下,全局读锁在开始导出时获得很短的时间;其他内容参考下面的--single-transaction选项)。该选项自动关闭--lock-tables选项。 81 mysqldump  -uroot -p --host=localhost --all-databases --master-data=1; 82 mysqldump  -uroot -p --host=localhost --all-databases --master-data=2; 83 --events, -E 84 导出事件。 85 mysqldump  -uroot -p --all-databases --events 86 --extended-insert,  -e 87 使用具有多个VALUES列的INSERT语法。这样使导出文件更小,并加速导入时的速度。默认为打开状态,使用--skip-extended-insert取消选项。 88 mysqldump  -uroot -p --all-databases 89 mysqldump  -uroot -p --all-databases--skip-extended-insert   (取消选项) 90 --fields-terminated-by 91 导出文件中忽略给定字段。与--tab选项一起使用,不能用于--databases和--all-databases选项 92 mysqldump  -uroot -p test test --tab=”/home/mysql” --fields-terminated-by=”#” 93 --fields-enclosed-by 94 输出文件中的各个字段用给定字符包裹。与--tab选项一起使用,不能用于--databases和--all-databases选项 95 mysqldump  -uroot -p test test --tab=”/home/mysql” --fields-enclosed-by=”#” 96 --fields-optionally-enclosed-by 97 输出文件中的各个字段用给定字符选择性包裹。与--tab选项一起使用,不能用于--databases和--all-databases选项 98 mysqldump  -uroot -p test test --tab=”/home/mysql”  --fields-enclosed-by=”#” --fields-optionally-enclosed-by  =”#” 99 --fields-escaped-by100 输出文件中的各个字段忽略给定字符。与--tab选项一起使用,不能用于--databases和--all-databases选项101 mysqldump  -uroot -p mysql user --tab=”/home/mysql” --fields-escaped-by=”#”102 --flush-logs103 开始导出之前刷新日志。104 请注意:假如一次导出多个数据库(使用选项--databases或者--all-databases),将会逐个数据库刷新日志。除使用--lock-all-tables或者--master-data外。在这种情况下,日志将会被刷新一次,相应的所以表同时被锁定。因此,如果打算同时导出和刷新日志应该使用--lock-all-tables 或者--master-data 和--flush-logs。105 mysqldump  -uroot -p --all-databases --flush-logs106 --flush-privileges107 在导出mysql数据库之后,发出一条FLUSH  PRIVILEGES 语句。为了正确恢复,该选项应该用于导出mysql数据库和依赖mysql数据库数据的任何时候。108 mysqldump  -uroot -p --all-databases --flush-privileges109 --force110 在导出过程中忽略出现的SQL错误。111 mysqldump  -uroot -p --all-databases --force112 --help113 显示帮助信息并退出。114 mysqldump  --help115 --hex-blob116 使用十六进制格式导出二进制字符串字段。如果有二进制数据就必须使用该选项。影响到的字段类型有BINARY、VARBINARY、BLOB。117 mysqldump  -uroot -p --all-databases --hex-blob118 --host, -h119 需要导出的主机信息120 mysqldump  -uroot -p --host=localhost --all-databases121 --ignore-table122 不导出指定表。指定忽略多个表时,需要重复多次,每次一个表。每个表必须同时指定数据库和表名。例如:--ignore-table=database.table1 --ignore-table=database.table2 ……123 mysqldump  -uroot -p --host=localhost --all-databases --ignore-table=mysql.user124 --include-master-host-port125 在--dump-slave产生的'CHANGE  MASTER TO..'语句中增加'MASTER_HOST=<host>,MASTER_PORT=<port>' 126 mysqldump  -uroot -p --host=localhost --all-databases --include-master-host-port127 --insert-ignore128 在插入行时使用INSERT IGNORE语句.129 mysqldump  -uroot -p --host=localhost --all-databases --insert-ignore130 --lines-terminated-by131 输出文件的每行用给定字符串划分。与--tab选项一起使用,不能用于--databases和--all-databases选项。132 mysqldump  -uroot -p --host=localhost test test --tab=”/tmp/mysql”  --lines-terminated-by=”##”133 --lock-all-tables,  -x134 提交请求锁定所有数据库中的所有表,以保证数据的一致性。这是一个全局读锁,并且自动关闭--single-transaction 和--lock-tables 选项。135 mysqldump  -uroot -p --host=localhost --all-databases --lock-all-tables136 --lock-tables,  -l137 开始导出前,锁定所有表。用READ  LOCAL锁定表以允许MyISAM表并行插入。对于支持事务的表例如InnoDB和BDB,--single-transaction是一个更好的选择,因为它根本不需要锁定表。138 请注意当导出多个数据库时,--lock-tables分别为每个数据库锁定表。因此,该选项不能保证导出文件中的表在数据库之间的逻辑一致性。不同数据库表的导出状态可以完全不同。139 mysqldump  -uroot -p --host=localhost --all-databases --lock-tables140 --log-error141 附加警告和错误信息到给定文件142 mysqldump  -uroot -p --host=localhost --all-databases  --log-error=/tmp/mysqldump_error_log.err143 --max_allowed_packet144 服务器发送和接受的最大包长度。145 mysqldump  -uroot -p --host=localhost --all-databases --max_allowed_packet=10240146 --net_buffer_length147 TCP/IP和socket连接的缓存大小。148 mysqldump  -uroot -p --host=localhost --all-databases --net_buffer_length=1024149 --no-autocommit150 使用autocommit/commit 语句包裹表。151 mysqldump  -uroot -p --host=localhost --all-databases --no-autocommit152 --no-create-db,  -n153 只导出数据,而不添加CREATE DATABASE 语句。154 mysqldump  -uroot -p --host=localhost --all-databases --no-create-db155 --no-create-info,  -t156 只导出数据,而不添加CREATE TABLE 语句。157 mysqldump  -uroot -p --host=localhost --all-databases --no-create-info158 --no-data, -d159 不导出任何数据,只导出数据库表结构。160 mysqldump  -uroot -p --host=localhost --all-databases --no-data161 --no-set-names,  -N162 等同于--skip-set-charset163 mysqldump  -uroot -p --host=localhost --all-databases --no-set-names164 --opt165 等同于--add-drop-table,  --add-locks, --create-options, --quick, --extended-insert, --lock-tables,  --set-charset, --disable-keys 该选项默认开启,  可以用--skip-opt禁用.166 mysqldump  -uroot -p --host=localhost --all-databases --opt167 --order-by-primary168 如果存在主键,或者第一个唯一键,对每个表的记录进行排序。在导出MyISAM表到InnoDB表时有效,但会使得导出工作花费很长时间。169 mysqldump  -uroot -p --host=localhost --all-databases --order-by-primary170 --password, -p171 连接数据库密码172 --pipe(windows系统可用)173 使用命名管道连接mysql174 mysqldump  -uroot -p --host=localhost --all-databases --pipe175 --port, -P176 连接数据库端口号177 --protocol178 使用的连接协议,包括:tcp, socket, pipe, memory.179 mysqldump  -uroot -p --host=localhost --all-databases --protocol=tcp180 --quick, -q181 不缓冲查询,直接导出到标准输出。默认为打开状态,使用--skip-quick取消该选项。182 mysqldump  -uroot -p --host=localhost --all-databases183 mysqldump  -uroot -p --host=localhost --all-databases --skip-quick184 --quote-names,-Q185 使用(`)引起表和列名。默认为打开状态,使用--skip-quote-names取消该选项。186 mysqldump  -uroot -p --host=localhost --all-databases187 mysqldump  -uroot -p --host=localhost --all-databases --skip-quote-names188 --replace189 使用REPLACE INTO 取代INSERT INTO.190 mysqldump  -uroot -p --host=localhost --all-databases --replace191 --result-file,  -r192 直接输出到指定文件中。该选项应该用在使用回车换行对(\\r\\n)换行的系统上(例如:DOS,Windows)。该选项确保只有一行被使用。193 mysqldump  -uroot -p --host=localhost --all-databases --result-file=/tmp/mysqldump_result_file.txt194 --routines, -R195 导出存储过程以及自定义函数。196 mysqldump  -uroot -p --host=localhost --all-databases --routines197 --set-charset198 添加'SET NAMES  default_character_set'到输出文件。默认为打开状态,使用--skip-set-charset关闭选项。199 mysqldump  -uroot -p --host=localhost --all-databases200 mysqldump  -uroot -p --host=localhost --all-databases --skip-set-charset201 --single-transaction202 该选项在导出数据之前提交一个BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于多版本存储引擎,仅InnoDB。本选项和--lock-tables 选项是互斥的,因为LOCK  TABLES 会使任何挂起的事务隐含提交。要想导出大表的话,应结合使用--quick 选项。203 mysqldump  -uroot -p --host=localhost --all-databases --single-transaction204 --dump-date205 将导出时间添加到输出文件中。默认为打开状态,使用--skip-dump-date关闭选项。206 mysqldump  -uroot -p --host=localhost --all-databases207 mysqldump  -uroot -p --host=localhost --all-databases --skip-dump-date208 --skip-opt209 禁用–opt选项.210 mysqldump  -uroot -p --host=localhost --all-databases --skip-opt211 --socket,-S212 指定连接mysql的socket文件位置,默认路径/tmp/mysql.sock213 mysqldump  -uroot -p --host=localhost --all-databases --socket=/tmp/mysqld.sock214 --tab,-T215 为每个表在给定路径创建tab分割的文本文件。注意:仅仅用于mysqldump和mysqld服务器运行在相同机器上。注意使用--tab不能指定--databases参数216 mysqldump  -uroot -p --host=localhost test test --tab="/home/mysql"217 --tables218 覆盖--databases (-B)参数,指定需要导出的表名,在后面的版本会使用table取代tables。219 mysqldump  -uroot -p --host=localhost --databases test --tables test220 --triggers221 导出触发器。该选项默认启用,用--skip-triggers禁用它。222 mysqldump  -uroot -p --host=localhost --all-databases --triggers223 --tz-utc224 在导出顶部设置时区TIME_ZONE='+00:00' ,以保证在不同时区导出的TIMESTAMP 数据或者数据被移动其他时区时的正确性。225 mysqldump  -uroot -p --host=localhost --all-databases --tz-utc226 --user, -u227 指定连接的用户名。228 --verbose, --v229 输出多种平台信息。230 --version, -V231 输出mysqldump版本信息并退出232 --where, -w233 只转储给定的WHERE条件选择的记录。请注意如果条件包含命令解释符专用空格或字符,一定要将条件引用起来。234 mysqldump  -uroot -p --host=localhost --all-databases --where=” user=’root’”235 --xml, -X236 导出XML格式.237 mysqldump  -uroot -p --host=localhost --all-databases --xml238 --plugin_dir239 客户端插件的目录,用于兼容不同的插件版本。240 mysqldump  -uroot -p --host=localhost --all-databases --plugin_dir=”/usr/local/lib/plugin”241 --default_auth242 客户端插件默认使用权限。243 mysqldump  -uroot -p --host=localhost --all-databases --default-auth=”/usr/local/lib/plugin/<PLUGIN>”  

复制代码

 

八、事件

1、事件

  • 事件(event)是MySQL在相应的时刻调用的过程式数据库对象。一个事件可调用一次,也可周期性的启动,它由一个特定的线程来管理的,也就是所谓的“事件调度器”。

  • 事件和触发器类似,都是在某些事情发生的时候启动。当数据库上启动一条语句的时候,触发器就启动了,而事件是根据调度事件来启动的。由于他们彼此相似,所以事件也称为临时性触发器。

  • 事件取代了原先只能由操作系统的计划任务来执行的工作,而且MySQL的事件调度器可以精确到每秒钟执行一个任务,而操作系统的计划任务(如:Linux下的CRON或Windows下的任务计划)只能精确到每分钟执行一次。

2、事件的优缺点

    • 优点 

      • 一些对数据定时性操作不再依赖外部程序,而直接使用数据库本身提供的功能。

      • 可以实现每秒钟执行一个任务,这在一些对实时性要求较高的环境下就非常实用了。

    • 缺点 

      • 定时触发,不可以调用。

3、事件的创建

  • 一条create event语句创建一个事件。每个事件由两个主要部分组成,第一部分是事件调度(event schedule),表示事件何时启动以及按什么频率启动,第二部分是事件动作(event action),这是事件启动时执行的代码,事件的动作包含一条SQL语句,它可能是一个简单地insert或者update语句,也可以使一个存储过程或者 begin…end语句块,这两种情况允许我们执行多条SQL。一个事件可以是活动(打开)的或停止(关闭)的,活动意味着事件调度器检查事件动作是否必须调用,停止意味着事件的声明存储在目录中,但调度器不会检查它是否应该调用。在一个事件创建之后,它立即变为活动的,一个活动的事件可以执行一次或者多次。

  • 创建语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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} 

 View Code

  • 开启关闭事件调度器

    • MySQL事件调度器event_scheduler负责调用事件,它默认是关闭的。这个调度器不断地监视一个事件是否要调用, 要创建事件,必须打开调度器。 

              查看调度器命令: 

1
mysql> show variables like  '%event_scheduler%' ;

    • 开启事件调度器(以下任一方式均可) 

SET GLOBAL event_scheduler = ON; 

SET @@global.event_scheduler = ON; 

SET GLOBAL event_scheduler = 1; 

SET @@global.event_scheduler = 1; 

1
event_scheduler  =  1  #或者ON

    • 查看调度器线程  

1
mysql> show processlist;

    • 关闭事件调度器(以下任一方式均可) 

SET GLOBAL event_scheduler = OFF; 
SET @@global.event_scheduler = OFF; 
SET GLOBAL event_scheduler = 0; 
SET @@global.event_scheduler = 0; 
通过配置文件my.cnf,在[mysqld]下增加:

1
event_scheduler  =  0  #或者OFF,DISABLED

    • 查看调度器线程

1
mysql> show processlist;

    • 例:创建一个表记录每次事件调度的名字和事件戳

1
2
3
#创建测试表
     mysql> drop table  if  exists events_list;
     mysql> create table events_list(event_name varchar( 20 not  null, event_started timestamp  not  null);
  • 例:创建一个表记录每次事件调度的名字和事件戳

1
2
3
4
5
6
7
#创建事件1(立即启动事件)
     create event event_now 
     on schedule 
     at now() 
     do insert into events_list values( 'event_now' , now()); 
#查看事件执行结果
     mysql> select  *  from  events_list; 
  • 例:创建一个表记录每次事件调度的名字和事件戳

1
2
3
4
5
6
7
#创建事件2(每分钟启动事件)
     create event test.event_minute 
     on schedule 
     every   1  minute  
     do insert into events_list values( 'event_now' , now()); 
#查看事件执行结果
     mysql> select  *  from  events_list;  
  • 例:创建一个表记录每次事件调度的名字和事件戳

1
2
3
4
5
#创建事件3(每秒钟启动事件)
     CREATE event event_now 
     ON SCHEDULE 
     EVERY  1  SECOND
     DO INSERT INTO event_test VALUES( 1 ); 
  • 例:创建一个表记录每次事件调度的名字和事件戳

1
2
3
4
# 创建事件4(每秒钟调用存储过程)
    CREATE DEFINER = `root`@`localhost` EVENT `eventUpdateStatus`
    ON SCHEDULE EVERY  1  SECOND
    STARTS  '2017-11-21 00:12:44'  ON COMPLETION PRESERVE ENABLE DO call updateStatus()
  • 注意  

默认创建事件存储在当前库中,也可显示指定事件创建在哪个库中 
通过show events只能查看当前库中创建的事件 
事件执行完即释放,如立即执行事件,执行完后,事件便自动删除,多次调用事件或等待执行事件可以查看到。 
如果两个事件需要在同一时刻调用,mysql会确定调用他们的顺序,如果要指定顺序,需要确保一个事件至少在另一个事件1秒后执行 
对于递归调度的事件,结束日期不能在开始日期之前。 
select可以包含在一个事件中,然而他的结果消失了,就好像没执行过。   

4、事件的查看

  • 查看当前所在库的事件 

1
mysql> show events;
  • 查看所有事件

1
mysql> select  *  from  mysql.event;

5、事件的修改

  • 一条alter event语句可以修改事件的定义和属性。我们可以让一个事件成为停止的或者再次让它活动,也可以修改一个事件的名字或者整个调度。然而当一个使用 ON COMPLETION NOT PRESERVE 属性定义的事件最后一次执行后,事件直接就不存在了,不能修改。

  • 语法

1
2
3
4
5
6
7
8
9
ALTER
     [DEFINER  =  { user | CURRENT_USER }]
     EVENT event_name
     [ON SCHEDULE schedule]
     [ON COMPLETION [NOT] PRESERVE]
     [RENAME TO new_event_name]
     [ENABLE | DISABLE | DISABLE ON SLAVE]
     [COMMENT  'comment' ]
     [DO event_body] 
  • 例:修改上面例子3.3.3 每分钟启动事件为每30秒启动

1
2
3
4
alter event test.event_minute
on schedule 
every   30  second  
do insert into events_list values( 'event_now' , now());
  • 修改上面例子事件名字为event_second

1
2
alter event test.event_minute 
rename to test.event_second;
  • 修改上面例子事件为不活动和再次活动

1
2
alter event test.event_second disable;
alter event test.event_second enable;    

6、事件的删除

  • 如果一个事件不再需要,我们可以使用一条drop event 语句删除它。使用这条语句我们不需要等到最后一次事件调用。

  • 语法

1
DROP EVENT [IF EXISTS] event_name
  • 例 

1
drop event  if  exists event_second;


转自:

https://www.cnblogs.com/hanbowen/p/9569130.html