mysql备份与恢复 ,事务,变量, 触发器

数据备份与恢复

生成sql脚本数据
导出数据

介绍、

在控制台中是
执行mysqldump命令
可以用来生产指定数据库脚本文件

生成的脚本文件。包含表的结构(create),数据
(insert)
,但是  数据库不能保存

要自己创建一个数据库

语法

Mysqldump  
-u 用户名
–p密码
数据库名>生成的脚本路径

执行sql 脚本,恢复数据

介绍

前提:必须创建数据

执行sql 脚本需要登录mysql ,然后指定数据库
,最后执行sql脚本即可

语法

Source  
sql的脚本文件

事务安全

为什么需要事务

当A给B转账时,A账户减少100元,然后断电了

解决方案:A减少钱,但是不立即修改数据库,B收到钱的同时修改数据库

什么是事务

事务:transaction ,一系列要发生的连续的操作

事务的特点:连续的操作要么全部成功,要么全部失败

事务安全
:一种保护 连续的操作 同时满足(实现) 的一种机制

事务安全的意义:
保证数据操作的完整性。

事务操作

事务操作分2种:

手动事务

自动事务(默认的)

手动事务:操作流程

1开启事务

告诉系统一下所有的操作不要直接写入数据库的表中

Start transaction;

2进行事务操作: 一系列的操作

1李四账户的减少

2张三账户增加

Update tb_user
set balance =balance -100 where id=1;

Update tb_user
set balance =+100 where id=2;

3关闭事务

成功:(同步)选择性的将日志文件中的操作结果保存到数据表中  commit

失败:清空日志文件
(所有的操作都放弃)

1提交事务 (同步):commit

Commit;

2回滚事务:清空日志文件:rollback

Rollback;

自动事务

在mysql:默认的都是自动事务处理的,用户操作后立刻马上同步到数据表中

自动事务:
系统通过autocommit 变量控制

查看自动变量

Show variables like ‘autocommit’;

修改自动变量

Set autocommit=0/off;

事务的原理

事务开启之后 start transaction   所有的操作都会保存在事务的临时日志文件中

在commit 命令之后才会将数据同步到数据表中,其他任何情况都会被清空(如断开连接, rollback,断电)

回滚点

在某个成功的操作之后,后续的操作可能会失败,我们只需要回滚一部分而不是回滚所有,这里我们需要设置一个位置,这个位置就是回滚点

设置回滚点

Sacepoint
回滚点名称

回滚到某个点

Rollback to 回滚点名称

事务特性

事务有4大特性(ACID)

A
:atomic 原子性,事务是一个整体不可以再划分,要么都成功,要么都失败

C
:consistency 一致性
,事务操作的前后,数据表中的数据没有变化

事务开始, 事务操作 ,事务结束(commit)

I:Isolation 隔离性,事务操作之间 相互隔离 ,互补影响

D: durability 持久性,数据一旦提交,永久改变数据表中的数据

锁机制

锁机制:innodb 默认是行锁,但是如果在事务中操作过程中,没有使用到索引(主键默认是索引)那么系统会自动搜索全表数据,自动升级为表锁;

行锁:只有当前行被锁住,别的用户態操作

表锁:整张表表被锁住,别的用户不能操作。

Start transaction ;

update tb_user set balance =balance +100
where id =1;

由于balance不是主键

所以表锁

其他用户不能访问
否则只能等待

变量

变量分2中:系统变量和自定义变量

系统变量

系统已经定义好的变量:大部分的时候用户不需要使用系统变量,系统变量是用来控制变量服务器的表现

比如:autocommit
,auto_increment

查看系统变量

Show variables;

查看具体的变量值

任何一个有数据返回的内容都是select 查看

Select @@变量名 //2个@

Select @@ autocommit

修改系统变量

修改系统变量分为2中方式

回话级别和全局级别

会话级别

临时修改,当前客户端当次有效

Set 变量名:=值

Set @@变量名 :=值

全局级别

一次修改,永久生效(对所有的客户端生效)

Set global 变量名=值

Set global autocommit=0

注意如果别的客户端已经连接上服务器。那么本次修改无效需要重启才能生效

自定义变量

定义变量

用户自定义的变量使用一个@ 和系统变量区分开

Set @ 变量名 =值

Set @name =’zs’;

查看变量

Select @变量名

Select  @name ;

变量赋值

在mysql 中‘=’会被默认当做比较符
(很多地方) mysql 为了区分赋值和比较的概念

重新定义了一个新的赋值符号:=

Set @变量名 := 值

方案一 边赋值边查看结果

Select @变量名 :=字段名 from 数据源

Select @变量名 :=字段名, 字段名 from 数据源

select @name:=name ,name from tb_user;

方案二 只赋值不看结果

要求很严格 数据记录最多只允许有一条

Mysql
不支持数组

Select
字段列表 from 表名 into 变量列表

select name,balance from tb_user where id=1
into @name,@balance ;

自定义变量都是当前会话级别的,
仅当次连接当客户端有效

所以自定义
不区分数据库

触发器

触发器需要2张表

什么是触发器

触发器:trigger,事先为某张表绑定一坨代码,当表中的某些数据变化后系统自动触发这一坨代码的执行

触发器 :

事件类型:增删改,3中类型 insert
update delete

触发时间:前后:before
和after

触发对象:表中的每一行(记录)

一张表中:最多能有6触发器

创建触发器

在mysql 高级结构中,没有大括号

#基本语法

临时修改语句结束符

Delimiter 自定义结束符号

Create trigger 触发器名称 触发时间 数据类型 on 表名 for each
row

Begin

触发内容

End

自定义结束符号

语句结束符号
回复

Delimiter;

create table  tb_product(

id
int primary key auto_increment,

name
varchar(60),

inventory
int

);

create table tb_order(

id
int primary key auto_increment,

quantity
int

)

insert into tb_product values(null,‘zs’,100);

insert into tb_product
values(null,‘ls’,100);

delimiter $$

create trigger tb_order_tiigger after
insert on tb_order for each row

begin

update
tb_product set inventory =inventory-1 where id=1;

end

$$

delimiter ;

查看触发器

查看所有触发器

Show triggers [like ‘pattern ’]

Show triggers\G

查看触发器创建语句

Show create trigger 触发器的名称

show create trigger tb_order_tiigger\G;

所有的触发器都会保存到系统表中:

Information_schema.triggers

select *from information_schema.triggers\G

触发器使用

触发器不需要手动调用
而是在某种情况下自动触发(insert)

insert into 
tb_order values (null,1,2);

修改触发器(删除)

触发器不能修改,只能先删除,后新增

Drop trigger 触发器的名称

drop trigger tb_order_trigger;

触发器记录

不管触发器是否触发了,只要当某种操作准备执行,系统会将当前要操作的记录的当前状态和
操作之后的状态分别记录下来,以供触发器使用,其中操作之前的状态保存old中,操作之后的状态保存到new中

Old 代表的是旧记录。插入操作 old 可能没有

New 代表的是新纪录。删除操作new可能没有

Old和new本身代表的就是基本本身:任何一条记录除了数据,还有字段名称

使用方式:

old.字段名称

new.字段名称

delimiter $$

create trigger tb_order_trigger after
insert on tb_order for each row

begin

update
tb_product set inventory =inventory-new.quantity where id=new.pid;

end

$$

delimiter ;

注意:

(1)如果触发器内部只有一条SQL语句需要执行,可以省略大括号(begin和end)

(2)触发器可以很好的协调表内部的数据处理顺序和关系,但是从业务开发的角度出发,触发器会增加数据库维护的难度,所以减少使用触发器。

(3)通过业务去解决问题。企业中触发器用的很少。

猜你喜欢

转载自blog.csdn.net/simple_start/article/details/89109414
今日推荐