mysql学习之路_事物_存储过程_备份
数据备份与还原
备份:将当前已有的数据保留。
还原:将已经保留的数据恢复到对应表中
为什么要做数据备份
1,防止数据丢失,被盗,误操作
2,保护数据记录
数据备份还原方式有多种:数据表备份
单表数据备份
Sql备份
增量备份
数据表备份:
数据不需要sql来备份,直接进入到数据库文件夹复制对应结构以及数据文件,以后还原的时候,直接将备份的内容放入即可
数据表备份有前提条件:根据不同的存储引擎有不同的区别。
存储引擎:mysql进行数据存储的方式主要有两种:innodb,myisam(免费)
Innodb:只有表结构,数据存储到ibdatal文件夹中
Myisam:表,数据和索引单独存储
Myisam:Fim是结构,myd是数据,myi是索引
这种备份通常适用于myisam存储引擎直接复制三个文件夹即可,放到对应的数据库可以使用,innodb可以复制但是不能使用。
单表数据备份
每次只能备份一张表,只能备份数据(表结构不能备份)
通常使用:将表中的数据进行到出到文件
备份:从表中选出一部分数据保存到外部文件中。
Select */字段列表 into outfile 文件路径 from 数据源;--前提是外部文件不存在
Select * into outfile “d:new.txt” from myfirst;
高级备份:自己制定字段和行的处理方式:
Select */字段列表 into outfile 文件路径 fields 字段处理 lines行处理 from 数据源。
Fileds :字段处理
Enclosed by :字段使用什么内容包裹,默认是:空字符串
Terminate by:字段以什么结束,默认是“\t”“tab”键
Escaped by: 特殊字符用什么方式处理,默认是“\\”使用反斜杠转译
Lines :行处理
Start by:每行以什么开始默认是空字符串
Terminate by: 每行以什么结束,默认是“\r\n” 换行符
------------指定备份处理方式
Select * into outfile “D:new.txt”
Fields enclosed by “ ”--字段处理
Lines starting by “ ”--行处理
From my_class;
数据还原:将一个外部的数据重新恢复到表中(如果表结构不存在)
Load data infile 文件路径 into
Table 表名[字段列表]
Fileds 字段处理
Lines 行处理
怎么备份怎么还原。
例:
Load data infile “d:new.txt”
Into table my_class
Fields encosed by” ”
Lines starting by ‘start ’;
Sql备份:
备份sql语句:系统会对表结构以及数据进行数据处理,变成对应的sql语句然后进行备份;还原度时候执行SQL指令即可(主要是针对表结构)
备份:
Mysql 没有提供指令需要利用mysql提供的软件mysqlDump.exe
Mysqldump.exe也是一种客户端,需要操作服务器,必须连接认证。
Mysqldump / mysqldump.exe -u -p 数据库名字[数据表名字1数据表名字2]>外部文件目录(建议使用.sql结尾)
Sql还原数据
两种方式还原,
1,使用mysql.exe客户端还原:mysql.exe / mysql -u -p 数据库名字 <备份文件目录
2,Sql指令还原sql备份 source备份文件所在路径
Sql备份优缺点
1,优点,可以备份结构,尽管结果不管过程
2,确定,会浪费空间(额外增加sql指令)
增量备份(大项目用增量备份)
不是针对数据或者sql指令进行备份:是针对mysql服务器日志文件备份。
增量备份:指定时间开始进行备份,备份数据不会重复,而且所有的操作都会备份。
回顾
外键:关联关系(表与表之间,表中字段指向另外一张表的主键)
条件:字段类型一致,存储引擎必须是innodb
约束:子表约束,不能插入父表不存在的记录
父表约束,三种约束模式。
(district ,cascade,setnull)
On delete set null on update cascade;
联合查询:union 多表合并和单表不同查询条件,联合查询使用order by:select语句使用括号:还必须配合:limit
子查询:查询语句中有查询语句,
分类:按位置:from子查询,where子查询,exists子查询
按返回结果:表量子查询,列子查询,行子查询,表长查询。
视图:view
节省SQL语句:安全级别
本质:虚拟表,有结构,无数据
视图数据操作:多表只能改,单表可以增加(有限制)
视图算法:undifined 未定义
Temptable 临时表
Merge 合并
文件备份与还原
文件备份:存储引擎(myisam)
单表数据备份:只能备份数据
Sql备份:备份sql指令(mysqldump.exe客户端)
增量备份:备份系统日志文件。
事物:
一系列要发生的联续的操作
事物安全:
一种保护连贯操作同时满足实现的机制
事物安全的意义:保证数据操作的完整性。
事物操作:分为两种:自动事物(默认的),手动事物。
手动事物:
操作流程
1,开启事物:告诉系统所有操作系统(写)不要写入到数据表,先存放到事物日志。
Start transaction;
2,进行事物操作:一系列操作
3,关闭事物:选择性将日志文件中操作的结果同步到数据表(同步保存)或者说字节清空事物日志。
Commit :提交事物,同步数据表(操作成功)
Rollback :回滚事物,直接清空日志表(操作失败)。
事物原理
事物开启之后,所有操作会保存到事务日志,事务日志只有得到commit命令才会同步到数据表。
其他任何情况都会清空(rollback,断电,断开连接)。
回滚点
在某个成功完成之后,有可能成功,也有可能失败,但是不管成功还是失败,前面的操作已经成功,在当前成功的位置设置一个点,可以供后续失败操作返回该位置,而不是返回所有操作。这个点称之为回滚点
语法:sava point 回滚点名字;
回到回滚点语法:rollback to 回滚点名字
自动事物处理:
在mysql中默认的是自动事物处理,用户操作完全会立即同步到数据表
自动事物:系统通过autocommit控制:show variables like ‘autocommit’;
关闭自动提交事物:set autocommit=off/0;
自动关闭之后,需要手动选择处理:commit,rollback。
注:通常使用自动事物
事物特性
ACID四大特性
A:Atonic原子性;事物的整个操作是一个整体,不可分割要么全部成功要么全部失败。
C:Consistency一致性:事物操作前后,书记表中数据没有变化。
I: Isolation 隔离性,事物操作是相互隔离不受影响的
D:Durability 永久性,数据一旦提交不可改变。
锁机制
Innodb默认是行锁,但是事物如果是在操作过程中,如果没有使用到索引,那么系统会自动全表检索,自动升级为表锁。
行锁:只有当前行被锁住,别的用户不能操作
表锁:整张表被锁住,别的用户不能操作
变量:
变量分为两种,系统变量和自定义变量
系统变量:
系统定义好的,大部分用户更本不需要使用系统变量,系统变量是用来控制服务器表现的:如autoCommit 等atuo_increament_increment
查看系统变量show variables;查看所有系统变量,查看具体变量值,任何一个有数据返回的内容都是由select 查看。
Select@@变量名
修改系统变量
修改系统变量分为两种方式:会话级别和全局级别
会话级别:临时修改,当次连接有效 set 变量名=值
全局级别:一次修改,永久生效(所有客户端生效)set global 变量名=值
例:set global autocommit=0;
如果对方(其他)客户端已经连上服务器,那么当次修改无效,要退出重新登录才会有效
自定义变量:
定义变量
系统为了区分系统变量,规定用户自定义变量,必须使用一个@符号 set@变量名=值
用户定义变量类似于系统变量查看 Select @变量名;
在sql中“=”会默认的当做比较符号处理。Mysql为了区分比较和赋值的概念:重新定义一个新的赋值符号“:=”
mysql允许从数据表中获取数据然后赋值给变量(两种方式)
1,变赋值变查看结果
Select @变量名:=字段名 from 数据源;--从字段取赋值变量名如果使用=会变成比较
2,只有赋值,不看结果:要求很严格,数据记录最多允许获取一条:mysql不支持数组
select 字段列表 from表名 into 变量列表
注:所有自变量都是会话级别;当前客户端当次连接有效
所有自定义变量不区分数据库(会话级别)
触发器
Trigger 实现为某张表绑定一段代码,当表中的某些内容发生改变的时候(增删改)
系统会自动触发代码执行。
触发器:事件类型,触发对象,触发时间
事件类型:三种(增删改)insert ,delete,update
触发时间:前后,before ,after
触发对象:表中每一条记录(行)
一张表只能有一种触发时间的一种类型的触发器,最多一张表能有6个触发器
创建触发器
在mysql高级结构中,没有大括号,都是用对应的字母符号代替 --临时修改语句结束符
触发器的基本语法
Delimiter 自定义符号:后续代码碰到自定义符号结束
Create trigger 触发器名字 触发时间(事件),触发事件(类型), on 表名 for each row
Begin --代表大括号:开始
--里面是触发器内容:每行必须使用语句结束符;分号
End --代表大括号:结束
自定义符号
Delimiter; --将临时符号修改过来
查看触发器:
Show trigger [like ‘patten’];
查看触发器创建语句
Show create trigger 触发器名字
所有的触发器都会保存在一张表中
information_Schema.trigger
使用触发器
触发器:不需要手动触发,而是当某种情况发生时会自动触发
修改触发器&&删除触发器
Drop trigger 触发器名字;
触发器记录;
不管触发器是与否触发,只要当某种操作准备执行:系统就会将当前操作的记录的当前状态和即将执行之后新的状态分别保留下来,供触发器使用。
其中要操作的当前状态保存到old中,操作之后的可能形态保存到new,删除的时候没有new的,插入的时候没有old。
Old与new都是代表记录本身,任何一条记录除了有数据,还有字段名字。
使用方式:old字段/new 字段名(new代表假设发生之后的结果)
如果触发器内部只有一条要执行的sql指令,可以省略大括号(begin与end)
Create trigger 触发器名字 触发时间 时间类型 on 表名 for each row 一条sql指令;
触发器:可以很好的协调内部的数据处理顺序和关系,但是从php角度出发,触发器会增加数据库维护难度,所以较少使用触发器。
代码执行结构
三种,顺序结构,分支结构,循环结构。
分支结构:
事先准备多个代码块按照条件选择性执行某段代码。
在mysql中只有if分支
If 判断条件 then
-- 满足条件执行的代码
Else
-- 不满足
End if
循环结构:
某段代码在指定条件执行重复执行
While (循环)
While 条件判断 do
--满足条件执行代码
--变更循环条件
End while;
循环控制:在循环内部判断和控制
Mysql没有对应continue 与break
Iterate:迭代 类似于continue,后面的代码不执行,循环重新来过
Leave:离开类似于break,循环结束
循环名字:while条件do
--循环体
--控制
Leave/iterate 循环名字
End while;
函数
将一段代码块分装到一个结构中,在需要执行代码块的时候,调用结构执行即可;
函数分为两类:系统函数和自定义函数
系统函数
系统定义好的函数直接调用即可任何函数都有函数返回值因此函数的调用是通过select 调用,mysql中字符串是基本操作单位名称(字符)
subString :字符串截取(字符为单位)
例
Select subString(@name ,1,1)
Set @name=”您好”;
截取位置从1开始:mysql中字符串下表从1开始截取单位为字符
Char-length:字符串长度
Length:字节长度
Instr:判断字符串是否在某个具体的字符串存在
Lpad:左填充。将字符串按照某个指定的填充方式填充到指定长度(字符)
Insert:替换,找到目标位置,指定长度字符串替换成目标字符串
Strcmp:compare,字符串比较
自定义函数
函数:函数名,参数列表(形参与实参)
返回值,函数体(作用域)
创建函数:create function 函数名(形参列表)return 数据类型 --规定返回的数据类型
Begin
---函数体
--返回值:return类型(指定数据类型)
End
自定义函数与系统函数调试方式是一样的
Select 函数名([实参列表])
查看函数
查看所有函数:show function status\G
查看函数创建语句:show create function 函数名
删除函数
Drop
Function
函数名
函数参数
参数:定义时叫形参,调用时叫实参(实参可以使数值,可以使变量)
形参:指定数据类型
Function 函数名称(形参名字 字段类型) returns 数据类型
注:任何变量要修改必须是使用set关键字
作用域:
Mysql 中作用域与js的作用域一样全局变量可以向任何地方使用,局部变量只能在函数内部使用
全局变量:使用set关键字定义,使用@符号标志
局部变量:使用declare关键字声明没有@符号。
所有局部变量声明,必须是在函数体开始之前
存储过程
存储过程:过程procedure是一种用来处理数据的方式(增删改)
存储过程是一种没有返回值的函数
创建过程
Create produce 过程名字(参数列表)
Begin
--过程体
End
查看过程:关键字procedure
Show procedure statue [like ‘pattern’];
查看过程创建语句:show create procedure 过程名;
调用过程:过程没有返回值,select语句不能访问
过程有一个专门的调用关键字:call
Call 过程名。
修改过程&删除过程
过程只能删除不能修改
Drop procedure 过程名;
Out与intout 是一种引用类型,内部修改会影响到外部。
过程参数
函数的参数需要类型指定,过程比函数跟严格
过程需要自己的类型限定(三种)
In:数据只能是从外部传入内部使用(值传递)可以使数值,可以是变量。
Out:只允许过程内部使用(不用外部数据)给外部使用(引用传递:外部数据会被清空才进入到内部):只能是变量。
Inout:外部可以在内部使用,颞部修改可以给外部使用,典型的引用传递;只能传变量。
基本使用
Create procedure 过程名 (in 形参名字,数据类型,out 形参名字 数据类型,inout 形参名字 数据类型)
注:调用过程名,inout,out必须是变量
存储过程对于变量的操作(返回)是滞后的,是在存储过程调用结束的时候,才会将内部修改的值赋值给外部传入的变量。
Mysql基础学习到此结束谢谢大家