数据备份与恢复
生成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)通过业务去解决问题。企业中触发器用的很少。