草庐IT

数据库的备份和恢复命令,使用视图,索引,事务

超甜的小布丁 2023-03-28 原文

备份和恢复命令

备份库

直接在cmd窗口中直接输入,结束不需要输入;

mysqldump -h端口号 -u用户名 -p密码 数据库名>备份地址

恢复库

在cmd窗口中进行
1、连接数据库
mysql -u用户名 -p密码
2、创建数据库
create database 库名
3、切换到可用数据库
use 库名
4、进行恢复
source 备份文件地址

授权:

新用户信息增改

1.创建用户:
# 指定ip:192.118.1.1的用户登录
create user '用户名'@'192.118.1.1' identified by '密码';
# 指定ip:192.118.1.开头的用户登录
create user '用户名'@'192.118.1.%' identified by '密码';
# 指定任何ip的用户登录
create user '用户名'@'%' identified by '密码';
2.删除用户
drop user '用户名'@'IP地址';
3.修改用户
rename user '用户名'@'IP地址' to '新用户名'@'IP地址';
4.修改密码
set password for '用户名'@'IP地址'=Password('新密码');

用户权限管理

#查看用户权限
show grants for '用户名'@'IP地址'
1、授权
#授权用户仅对某文件有查询、插入和更新的操作
grant select,insert,update on 文件名 to '用户名'@'IP地址';
#授权所有的权限,除了grant这个命令,这个命令是root才有的。用户对db1下的t1文件有任意操作
grant all privileges  on db1.t1 to '用户名'@'IP地址';
#授权用户可以对db1数据库中的所有文件执行任何操作
grant all privileges  on db1.* to '用户名'@'IP地址';
#授权用户可以对所有数据库中文件有任何操作
grant all privileges  on *.*  to '用户名'@'IP地址';
 
2、取消权限
# 取消用户对db1的t1文件的任意操作
revoke all on db1.t1 from '用户名'@'IP地址';  
# 取消来自远程服务器的mjj用户对数据库db1的所有表的所有权限
revoke all on db1.* from '用户名'@'IP地址';  
# 取消来自远程服务器的mjj用户所有数据库的所有的表的权限
revoke all privileges on *.* from '用户名'@'IP地址';

为什么使用视图

多表的联合查询,最多也才3张表,如果面临更多的表,为了简化连表操作,可以使用MySQL中的视图

好处

1、简化sql语句

2、提高了sql的重用性

3、保护基表的数据,提高了安全性

创建视图

create view 视图名
as
查询语句;

修改视图

方式一

create or replace view 视图名
as
查询语句;

方式二

alter view 视图名
as
查询语句

删除视图

drop view 视图1,视图2,...;

查看视图

desc 视图名;
show create view 视图名;

视图和表的对比

 关键字是否占用物理空间使用
视图 view 占用较小,只保存sql逻辑 一般用于查询
table 保存实际的数据 增删改查

什么是索引

==索引用于快速找出在某个列中有一特定值的行,避免全表扫描==

MySQL索引,默认是B+树索引

查询表中的索引

show index from 表名

索引的优缺点

优点:

1、所有的MySQL列类型(字段)都可以被索引,也就是可以给任意字段设置索引

2、大大加快数据的查询速度

缺点:

1、创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加

2、索引也需要占空间,如果有大量的索引,索引文件可能会比数据文件更快达到上限值

3、当对表中的数据进行增、删、改时,索引也需要动态的维护,降低了数据的维护速度

索引的分类

单列索引(普通索引、唯一索引、主键索引)、组合索引、全文索引、空间索引

创建索引

普通索引(b+树索引)

alter table table_name add index index_name(column_name) using btree;
create unique index index_name on table_name(column_name);

组合索引

唯一索引

全文索引

 

什么是事务

事务是作为单个逻辑单元执行的一系列操作

多个操作作为一个整体向系统提交,要么执行、要么都不执行,事务是一个不可分割的工作工作逻辑单元

四大特性(ACID)

原子性(A -- Atomicity):原子是参与化学反应中最小的粒子,不能再分割了,也就是说事务就是最小的,不能再分割了,如果把事务都分割了,就会出现问题

一致性(C -- Consistency):在事务执行前数据库的数据处于正确的状态,而事务执行完成后数据库的数据还是处于正确的状态,即数据完整性约束没有被破坏

隔离性(I -- Isolation):事务与事务之间互不干扰

持久性(D -- Durability):通过事务进行操作后的数据,是永久保存的

注意:在实际开发中,经常会打破隔离性,当多个事务共同操作同一张表的时候,一旦打破了隔离性,就会出现安全问题

存储引擎

存储引擎:RDBMS中,决定了数据如何存储,如何获取,如何控制事务,如何控制外键等一系列功能的一套程序

**常用引擎:**InnoDB,MyIsam

InnoDB与MyIsam的区别

  1. InnoDB支持事务,支持外键;而MyIsam不支持事务,不支持外键
  2. InnoDB由于受到事务和外键的影响,所以对数据的存储以及查询效率偏低;MyIsam相反偏高
  3. InnoDB在存储时,表文件是2个:frm,ibd;而MyIsam是3个文件,分别存储frm,MYD,MYI
  4. InnoDB是MYSQL 5.5之后的默认存储引擎;而MyIsam是5.5之前的默认存储引擎

事务操作

方式一

开启事务start transaction;

提交事务commit;

==注意==:当事务开启之后,只有执行了commit,数据才会真的改变,如果没有执行commit,数据还原

回滚事务rollback;

方式二

修改默认的提交方式,默认是自动提交,我们要改成手动提交

show variables like '%autocommit%'

set @@autocommit=0(默认为1,自动提交;0,手动提交)

隔离级别

隔离级别读数据一致性及允许的并发副作用备注
读未提交(Read uncommitted) 最低级别,只能保证不读取物理上损坏的数据,事务可以看到其他事务没有被提交的数据(脏数据)  
读已提交(Read commited) 语句级,事务可以看到其他事务已经提交的数据 Oracle数据库默认
可重复读(Repeatable read) 事务级,事务中两次查询的结果相同 MySql数据库默认
可串行读(序列化Serializable) 最高级别,事务级。顺序执行  

隔离等级越高,数据库事务并发执行能力越差,能处理的操作越少。因此在实际项目开发中为了考虑并发性能一般使用读已提交隔离级别,他能避免丢失更新和脏读,尽管不可重复读和幻读不能避免,但可以在可能出现的场合使用悲观锁乐观锁来解决这些问题。

什么是幻读、不可重复度、脏读

1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据,读取到未提交的数据。

2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。

3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读

隔离级别与更新丢失的情况

  • 第一类更新丢失
    • 事务A撤销时,把已经提交的事务B的更新数据覆盖了
  • 第二类更新丢失
    • 事务A覆盖事务B已经提交的数据,造成事务B所做的操作丢失
隔离级别脏读不可重复读幻读第一类丢失更新第二类丢失更新
Read uncommitted ×
Read commited × ×
Repeatable read × × × ×
Serializable × × × × ×

设置隔离级别

set session transaction isolation level 隔离级别

查看隔离级别(当前客户端)

select @@tx_isolation

乐观锁

==默认存在==,什么都不做,就是乐观锁。总是乐观的认为,在维护这个数据的时候,没有其他人来维护。

insert update delete 在执行SQL的同时,才给数据加上了乐观锁。

可能会导致的问题

age:12
A用户:update table set age=32 where id=1
B用户:update table set age=12 where id=1
A用户:select * from table where id=1
这个时候,A用户查看的数据为B修改过的,自己的修改已经被覆盖

悲观锁

总是担心,在自己修改数据的时候,有其他人,将这个数据修改,所以在修改数据之前,提前锁住数据

==默认没有开启,需要自己开启==

开启命令

#在查询语句后加for update就可以开启(悲观排他锁)
select * from book for update

优缺点

优点:准确性高,更加安全

缺点:效率太低,一旦一个用户执行悲观锁,那么其他用户都无法查看这个表的数据,也无法进行修改,除非执行悲观锁的用户commit

行锁

只会锁住一行数据

select * from book where id=1 for update

表锁

会锁住整个的一个表

select * from book for update

排他锁

A用户在给表加排他锁以后,那么其他用户都无法对表进行操作、查看、加锁

//表级排他锁
lock table book write
//解锁
unlock table

共享锁

所有的用户都可以对表进行加锁,但是,所有的用户都无法对表进行操作,包括上锁的用户

//表级共享锁
lock table book read
//解锁
unlock table

死锁

两个线程自己各自持有自己数据的锁,但互相都想锁住被对方锁住的数据,就产生了死锁

系统检索到死锁,会自动释放一个锁

有关数据库的备份和恢复命令,使用视图,索引,事务的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  5. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  6. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  7. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  8. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  9. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  10. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

随机推荐