您的位置:首页 > 数据库 > MySQL

06、MySQL视图及数据备份还原

2017-07-18 20:48 429 查看
视图及数据备份与还原
 

视图

概念:

是一种有结构(有行有列)但是没有结果(不真实存放数据)的虚拟表。

来源:结构来源不是自己定义,数据来源也不是来源于虚拟表本身,而是从对应的基表中产生。
 

视图的创建:

基本语法:

create view 视图名字 as select 语句(对于这条select语句,可以是普通查询,可以是连接查询,可以是联合查询,可以是子查询)

分类:

单表视图:

基表只有单张表

多表视图:

基表是两张及两张以上的表

注:值得注意的是,基表为多表的时候,查询内容的字段名是不能重复的。我们可以对其别名命名。

 

视图的查看:

我们一般查看视图的结构
视图也是一张表,表的查看方式都适用于表的查看

视图查看的时候还有一个关键子的区别:view 查看表的时候,应该是叫视图
我们可以使用view

Show create view 视图名字;

视图一旦创建,系统就会在对应的文件夹之下创建一个结构文件:frm文件;

 

视图的使用:

使用视图表的主要是为了将视图作为一张数表来查看。
视图虽然不保存数据,视图数据的查看实际上就是从数据表中将数据取出来查看的。
视图的执行其实本质就是就是执行封装的select语句

视图的修改

视图本身不可修改,但是视图的来源是可以修改,所以说视图的修改实际上修改了视图的数来源
基本语法:alter view 视图名字 as 新的select 语句

 

视图的删除

基本语法: drop view 视图名字;
理论上可以随意删除视图,因为视图没有存储任何的数据,但是我们不建议这样做,因为删除了别人创建的视图,别人重新创建数据的时候,有可能要重新整合select语句

 

视图的意义:

视图可以节省sql语句:将一条复杂的查询语句使用视图进行保存:以后可以直接对视图进行操作
数据的安全:视图的操作主要是针对数据的查询的,如果对数据进行操作,不会影响基表的数据,这样来看 数据实际上是相对安全的。
视图往往是在大型的项目使用的而且是多系统使用的。而且视图里面只会有及表中的部分数据,有些关于信息安全的部分我们是不会让他出现的。可以对外提供有效的数据,隐藏无用的数据,这样可以在很大程度上保证了数据的安全性
视图可以对外提供友好型,不同的视图提供不同的数据,对外好像是专门的设计。
视图可以更好的进行权限控制。我们基表的数据基本上是要尽量隐藏。

 

视图的操作:

视图的确是可以写数据写入的操作的,但是有很多的限制,所有的操作都是操作视图

视图数据的新增:

多表视图不能插入数据,因为多表视图的数据来源是来自多张表的部分字段,我们要向视图中插入数据的时候,就会向对应的字段中插入数据,但是我们不能单独对基表中的某些字段进行写入操作,所以写入操作会失败。
可以向单表视图中插入数据,但是视图中包含的字段必须包含基表中所有不为空(没有默认值)字段。如果说视图中不包含基表中不为空的字段,那么我们在插入数据的时候,就会发现,实际上就对该字段没有提供数据,基表使用默认的数null,但是基表中的数据不能为空,这就产生了矛盾,导致创建的失败。
视图是可以向视图插入数据的,我们向视图插入数据的时候,会相应的在基表中插入数据。实际应用中,我们不会给客户提供这种权限,那么我们为什么能够向视图中插入数据呢?因为我们操作数据库的时候,我们是root用户,拥有操作数据库的最高权限。

视图数据的删除:

单表视图是可以删除数据的。而且如果拥有数据库的最高权限,也会对基表产生影响。
多表数据是不能删除数据的。我们此处指的不能删数据是连接视图不能删,但是含有笛卡儿积的数据是可以删除的。

视图数据的更新

视图是可以对数据进行更新的,但是,相应的我们也必须拥有最高权限。

更新的限制:

With check option;
如果对视图进行更新操作的时候。我们对某个字段有限制的时候,那么在操作的过程当中,系统会对该操作进行验证。
验证的方式及结果是什么呢?
要保证更新之后,数据依然可以被视图查询出来。





问题:这说明了一个问题,因为视图中的数据一开始就是年龄大于30岁的,
如果我们将数据改为小于30岁的数据,那么视图将查询不到这条数据

由此可见,此项的数据操就必定会失败。也就是说我们更改的数据必
图能够查到的数据。



注意:如上图所示,数据的操作成功,但是没有生效,这说明了一个什么问题呢,实际上,原视图中并没有id = 6 的这条数据,我们进行操作的时候,只会判断,数据操作是否符合视图的限制条件,如果符合条件age>30就会提示操作成功,但是我们可以很清楚的知道,视图中本身是没有这条记录的,这就意味着,视图没有操作这条记录的权限。很显然操作会无效,不管是针对视图还是基表。
 

视图的算法:

概念:

系统对视图以及外部查询视图的select语句的一种解析方式。

分类:

Undedefine:未定义的算法(默认的),这个不是一种实际使用的算法,这种算法是一种不服责任的算法,这种算法的含义就是,由系统决定使用下面两种算法中的一种
Temptable:临时表算法,系统先执行视图的select语句,然后再执行外部的查询视图语句
Merge:合并算法,系统应该先将视图对应的select语句与外部查询视图的语句进行合并,然后再执行合并之后的语句(效率较高),当我们没有定义算法的时候,系统一般是经过第一种算法之后选择该种算法,我们将之称为一种常态。

算法的指定:

在创建视图的时候:create algorithm=算法 view 视图名字 as select 语句;
 
需求:应用视图查询每个班级中最高的学生记录
初步的计划(没指定算法 ):Create view heightest_stu as select * from my_student order by height;
Select * from heightes_stu group by c_id;



那么由此可见:我们上述的语句实际上是等于下面这条语句的
Select * from my_student group by c_id order by height desc;
这样的结果就说明,我们没有指定算法的时候,实际上使用的是第一种算法:由系统选择其他的两种算法之一:合并算法,而要达到我们的需求的话,我们就必须使用临时表算法:



这样我们会发现,我们已经得到我们所需要的结果了。

视图算法的选用:

如果视图的select语句会包含一个查询子句(五子句),而且视图外部的select语句的优先级大于视图内部的select语句中代码的优先级,那么我们就应该去指定算法。
 

数据库的备份

存储引擎:mysql进行数据存储的方式,主要是两种:innodb,myisam(免费)

Myisam和inoodb的对比"
Innodb:只有表结构,数据全部存储到ibdata1文件中
Myisam(方便迁移):表,数据和索引全部分开。
创建myisam表

create table my_myisam(

id int(2))charset utf8 engine = myisam;



这种文件的备份,适合用于myisam数据库引擎,我们直接复制三个文件就行了。

相对来说,innodb 的文件复制就会很麻烦。我们复制了文件之后,在复制之后的文件夹之下,我们依然能搜索到相应的数据库,问题是搜索里面的记录的时候,系统会找不到相应的数据库,而myisam下的数据表三个文件之间是相互不牵连的。复制之后放在相应的数据库之下就可以直接使用。
 

备份数据的意义:

防止数据的丢失:被盗,误操作
保护数据的记录

备份和还原数据的方式:

数据表备份,单表数据备份,sql备份,增量备份
 

数据表的备份与还原

不需要通过sql来备份,直接进入到对应的文件夹复制对应的表结构以及数据文件,以后还原的时候,直接将备份的内容放进去即可,但是我们很少使用这样的方式进行备份

单表数据备份:

概念:每次只能内分一张表,而且只能备份数据,不能备份结构,通常我们讲述据导出数据文件的时候,我们可以使用这种方式备份数据
Select * /字段列表 into outfile 文件所在路径 from 数据源;
前提是外部文件不存在。

高级的数据表备份:

Select */字段列表 into outfile '输出文件位置'fields 字段处理 lines 行处理 from 数据源;

Fields 字段处理:
Enclosed by :字段使用什么内容包裹,就使用什么字符进行包裹,默认系统是使用的是空的字符串进行处理

Terminated : 字段以什么结束 ,默认是\t 或者 tab键

Escaped by : 特殊符号用什么处理,默认是'\\',使用反斜杠进行转译

Lines 行处理
Starting by : 每行以什么开始,默认是空字符串

Terminated by : 每行以什么结束:默认是"\r\n",换行符



 

单表数据还原:

将一个在外部保存的数据重新恢复到表中(如果表的结构不存在,那么数据的还原是失败的);

所以说我们恢复数据的时候,就必须有表的结构文件。
Load data file 文件所在路径 into table 表名(字段列表)files 字段处理 lines 行处理;
说明:上面的备份方式说明了一个问题,就是我们怎么备份的数据就必须是怎么还原的,不然数据恢复的结果不会是我们想要的结果。
根据我们之前备份的数据,我们使用下列语句进行还原:



 

sql备份与还原:

mysqldump作为重要的MySQL备份工具,功能相当强大。备份参数、恢复策略,需要仔细研究。
备份数据库:
备份单个数据库或单个数据库中的指定表:
mysqldump [OPTIONS] database [tb1] [tb2]…
备份多个数据库:
mysqldump [OPTIONS] –databases [OPTIONS] DB1 [DB2 DB3...]
备份所有数据库:
mysqldump [OPTIONS] –all-databases [OPTIONS]
备份的是sql语句,系统会对表的结构以及数据进行处理,辩证对应的sql语句,然后进行备份,还原的时候只要执行sql语句就可以了(主要是针对表的结构)
备份:msql没有提供备份的指令,需要利用没sql提供的软件mysqldump.exe
Mysqldump也是一个客户端的程序,需要操作服务器,必须连接认证
备份操作:
单表备份:Mysqldump.exe –hPup 数据库名字 [数据表名字1 [数据表名字2]...] > 外部文件目录(建议使用.msql 结尾);
既然是另外的程序进行的话,我们就不能在数据库里面进行操作。如果没有指定表的名字的话,那么我们备份的就是整个数据库。
整个数据库的备份:Mysqldump.exe –hPup 数据库名字>外部的备份文件。
还原操作:
单表的还原:

整个数据库的还原:
方案一: 使用mysql.exe 进行还原

Mysql.exe –hPup 数据库名字 < 备份文件目录;

方案二:当我们还原之后的数据库又不小心删除了之后,在没有重新进入数据库的条件下,我们就可以使用下面的方式进行快捷的还原:

Source 备份目录及文件名;

 

Sql备份的优缺点"

优点:可以备份数据库的结构

缺点:会浪费空间(会增加额外的sql指令)
 

增量备份

不是针对数据或者sql指令进行备份,是针对nysql服务器的日志文件进行备份
增量备份:按照指定时间段内开始进行备份,备份数据不会重复,而且所有的操作都会备份。
目前大型的项目我们经常使用的就是增量备份,但是对于小型的项目来说,使用增量备份就会就会造成大量的资源浪费(人力资源)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: