数据库进阶了解

一.数据库的备份

1.物理备份:直接复制数据库文件

2.逻辑备份:备份所有执行的sql语句

  备份语法: mysqldump -h 服务器 -u 用户名 -p密码  数据库名 > 备份文件.sql

    关键参数:

      1.-B指定多个库,增加建库语句和use 语句,恢复的时候自动建库.

      2.-A或者--all-databases
        例如:C:\WINDOWS\system32>mysqldump -u root -p密码 -B -A> f:\数据库备份练习\all.sql

  恢复语法:mysql -h 服务器 -u 用户名 -p密码  数据库名 < 备份文件.sql

3.导出表

二.创建用户,指定权限

1.创建用户

  create user "用户名"@"ip地址" identified by "密码";

2.删除用户

  drop user "用户名"@"ip地址" ;

3.修改用户

  rename user "用户名"@"ip地址" to "新用户名"@"ip地址";

4.修改密码

  set password for "用户名"@"ip地址" = password("新密码");

5.用户授权

  grant 操作(insert,select等) on 库名[.表名] to "用户名"@"ip地址";

  grant all privileges on 库名[.表名] to "用户名"@"ip地址";

6.撤销授权

  revoke all on 库名[.表名] from "用户名"@"ip地址";

三.视图

1.创建视图

  create view 视图名 as sql语句;

2.使用视图

  视图就是一张根据as后面的sql语句新建的表,跟表的操作一样,但是修改视图数据,真实的数据也会被修改.

3.删除视图

  drop view 视图名;

四.触发器(new表示即将插入的数据行,old表示即将删除的数据行)

1.创建触发器

  create trigger 触发器名 before/after insert/update/delete on 表名 for each row

delimiter //     # 临时修改结束符

create trigger tri_after_insert_cmd after insert on cmd for each row           

begin          

if new.success = ‘no‘ then           # 如果 ...然后....

INSERT INTO errlog(err_cmd, err_time) VALUES(NEW.cmd, NEW.sub_time) ;         

END IF ;     # 结束if语句

END//      #只有遇到//这个完成的sql才算结束

delimiter ;        #然后将mysql的结束符改回为分号

触发的创建

2.使用触发器

  触发器是定制对某张表的数据进行操作时前后的行为,达到一定条件就会触发的操作.

3.删除触发器

  drop trigger 触发器名;

五.储存过程

1.创建存储过程(无参)

  delimiter //

  create procedure 过程名()

  begin

  sql语法;

  end //

  delimiter ;

delimiter //
create procedure p1()
BEGIN
    select * from blog;
    INSERT into blog(name,sub_time) values("xxx",now());
END //
delimiter ;

存储过程的创建

2.创建存储过程(有参)

  in 仅用于传参

  out 仅用于返回值

  inout 传参和返回值都可以

delimiter //
create procedure p2(
    in n1 int,  #n1参数是需要传入的,也就是接收外部数据的,并且这个数据必须是int类型
    in n2 int
)
BEGIN
    select * from blog where id > n1;  #直接应用变量
END //
delimiter ;

存储过程的创建(有参)

3.存储过程的调用

  在mysql中调用:

    call 过程名()

    call 过程名(值1,值2)

#查看存储过程的一些信息:show create procedure p3; #查看视图啊、触发器啊都这么看,还可以用\G,show create procedure p3\G;\G的意思是你直接查看表结构可能横向上显示不完,\G是让表给你竖向显示,一row是一行的字段
delimiter //
create procedure p3(
    in n1 int,
    out res int
)
BEGIN
    select * from blog where id > n1;
    set res = 1;  #我在这里设置一个res=1,如果上面的所有sql语句全部正常执行了,那么这一句肯定也就执行了,那么此时res=1,如果我最开始传入的时候,给res的值设置的是0,
#那么你想,最后我接收到的返回值如果是0,那么说明你中间肯定有一些sql语句执行失败了
#注意写法:out的那个参数,可以用set来设置,set设置之后表示这个res可以作为返回值,并且不需要像python一样写一个return,你直接set之后的值,就是这个存储过程的返回值
END //
delimiter ;

#在mysql中调用
set @res=0; #这是MySQL中定义变量名的固定写法(set @变量名=值),可以自己规定好,0代表假(执行失败),1代表真(执行成功),如果这个被改为1了,说明存储过程中的sql语句执行成功了
call p3(3,@res);#注意:不要这样写:call p3(3,1),这样out的参数值你写死了,没法确定后面这个1是不是成功了,也就是说随后这个out的值可能改成0了,也就是失败了,但是这样你就判断不了了,你后面查看的这个res就成1了,所以这个参数应该是一个变量名昂,定义变量名就是上一句,如果你直接传一个常量数字,会报错的,写法不对。
select @res; #看一下这个结果,就知道这些sql语句是不是执行成功了,大家明白了吗~~~

#在python中基于pymysql调用,在python中只需要知道存储过程的名字就行了
cursor.callproc(‘p3‘,(3,0)) #0相当于set @res=0,为什么这里这个out参数可以写常数0啊,因为你用的pymysql,人家会帮你搞定,pymysql其实会帮你写成这样:第一个参数变量名:@_p3_0=3,第二个:@_p3_1=0,也就是pymysql会自动帮你对应上一个变量名,pymysql只是想让你写的时候更方便
#沿着网络将存储过程名和参数发给了mysql服务端,比咱们发一堆的sql语句肯定要快对了,mysql帮你调用存储过程
print(cursor.fetchall()) #查询select的查询结果

cursor.execute(‘select @_p3_0,@_p3_1;‘) #@_p3_0代表第一个参数,@_p3_1代表第二个参数,即返回值
print(cursor.fetchall())
#别忘了关掉:
cursor.close()
conn.close()
#注意昂:存储过程在哪个库里面建的,就只能在哪个库里面用

out的返回值

  在pymysql

    cursor.callproc("过程名")

    cursor.callproc("过程名",(值1,值2))

4.删除存储过程

  drop procedure 过程名;

六.事务

1.事务的四大特性

  原子性  一致性  隔离性  持久性

2.创建事务

  start transaction;

  sql语句1;

  sql语句2;

  rollback;  # 回滚,回滚到初识状态

  commit;  #提交,一旦提交九永久保存

3.配合存储过程的事务使用

  declare exit handler for sqlexception  声明 遇到错误就执行begin和end中的sql语句

  begin

  end

delimiter //
create PROCEDURE p5()
BEGIN
DECLARE exit handler for sqlexception
BEGIN
rollback;
END;

START TRANSACTION;
update user set balance=900 where name=‘wsb‘; #买支付100元
update user set balance=1010 where name=‘chao‘; #中介拿走10元
#update user2 set balance=1090 where name=‘ysb‘; #卖家拿到90元
update user set balance=1090 where name=‘ysb‘; #卖家拿到90元
COMMIT;

END //
delimiter ;

事务的使用

七.数据库集群

  就是利用多台数据库服务器,构成一个虚拟的单一的数据库,向客户端提供数据服务

八.数据库读写分离

  为了确保数据库产品的稳定,很多数据库拥有双机热备功能,也就是第一台数据库服务器提供增删改业务,第二台数据库服务器主要进行读的操作.

九.主从复制

  用来建立一个和主数据库完全一样的数据库,主数据库服务器出现故障后,可以切换到从数据库继续操作

十.高可用

  在有限的故障条件下,提供一定级别的稳定服务.  

  常见的  heartbeat + drbd

       keepalive + lvs

       ks8 + docker

原文地址:https://www.cnblogs.com/q767498226/p/10306744.html

时间: 2024-10-16 03:06:17

数据库进阶了解的相关文章

关系型数据库进阶(二)全局概览

上篇文章 关系型数据库进阶(一)数据库基础,我们已经了解了数据库基础,现在我们需要回来看看数据库的全貌了. 数据库是一个易于访问和修改的信息集合.不过简单的一堆文件也能达到这个效果.事实上,像SQLite这样最简单的数据库也只是一堆文件而已,但SQLite是精心设计的一堆文件,因为它允许你: 1  使用事务来确保数据的安全和一致性 2  快速处理百万条以上的数据 3  数据库一般可以用如下图形来理解: 本篇文章,我不会特别关注如何组织数据库或者如何命名各种进程,因为我选择了自己的方式来描述这些概

SQL Server数据库进阶之表分区实战演练

一.课程介绍 1.1.需求背景 假设,你有一个销售记录表,记录着每个销售情况,那么你就可以把这个销售记录表按时间分成几个小表,例如说5个小表吧.2009年以前的记录使用一个表,2010年的记录使用一个表,2011年的记录使用一个表,2012年的记录使用一个表,2012年以后的记录使用一个表.那么,你想查询哪个年份的记录,就可以去相对应的表里查询,由于每个表中的记录数少了,查询起来时间自然也会减少.但将一个大表分成几个小表的处理方式,会给程序员增加编程上的难度.以添加记录为例,以上5个表是独立的5

python 全栈 数据库(二)MySQL数据库进阶

MySQL 进阶 左右连表: join 上下连表: union #自动去重 (当两张表里的数据,有重复的才会自动去重) union all #不去重 例如: select sid,sname from sname union select tid,tname from teacher select sid,sname from student UNION ALL select sid,sname from student 1.视图 (不常用,开发过程中不长用,在开发语句中写,不要在数据库中写)

MongoDB数据库进阶 --- 增删查改...

在之前的文章中,我已经介绍了什么事MongoDB以及怎么在windows下安装MongoDB等等基本知识. 所以这篇进阶的博客就主要介绍以下如何进行数据库的基本操作 --- 增删查改. 数据库相关 显示所有数据库: show dbs 其中admin和local都是默认存在的数据库. 查看当前数据库: db 即当前默认就是test数据库,但是为什么在 show dbs 的时候没有呢?  这是因为test数据库中没有任何数据,所以不会显示,后面会介绍插入数据,插入数据后就会显示了. 创建数据库: u

数据库进阶之路(五) - MySQL行锁深入研究

由于业务逻辑的需要,必须对数据表的一行或多行加入行锁,举个最简单的例子,图书借阅系统:假设id=1的这本书库存为1,但是有2个人同时来借这本书,此处的逻辑为: SELECT restnum FROM book WHERE id =1 ; --如果restnum大于0,执行update UPDATE book SET restnum=restnum-1 WHERE id=1; 问题来了,当2个人同时借的时候,有可能第一个人执行select语句的时候,第二个人插了进来,在第一个人没来得及更新book

MySQL数据库进阶操作

视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. 临时表搜索: SELECT * FROM ( SELECT nid, NAME FROM tb1 WHERE nid > 2 ) AS A WHERE A. NAME > 'alex'; 1.创建视图 --格式:CREATE VIEW 视图名称 AS SQL语句 CREATE VIEW v1 AS SELET nid, name FR

数据库进阶3

索引 1.普通索引(index) 2.唯一索引(unique) 1.使用规则 1.一个表中可以有多个unique字段 2.unique字段的值不允许重复,但可以为空值 3.unique的key标志是UNI 2.创建唯一索引 1.创建表时创建 1.方式一 create table t1( id int(3) zerofill, name char(20) unique ); 2.方式二 create table t2( id int, name char(20), age tinyint, uni

关系型数据库进阶(三)连接运算及查询实例

上篇文字,我们知道如何获取数据了,那现在就把它们联接起来! 我要展现的是3个个常用联接运算符:合并联接(Merge join),哈希联接(Hash Join)和嵌套循环联接(Nested Loop Join).但是在此之前,我需要引入新词汇了:内关系和外关系(inner relation and outer relation). 一个关系可以是: 一个表 一个索引 上一个运算的中间结果(比如上一个联接运算的结果). 当你联接两个关系时,联接算法对两个关系的处理是不同的.在本文剩余部分,我将假定:

python数据库进阶

第1节 MySQL基础 一,说明 1,认识MySQL与创建用户 MySQL是最流行的关系型数据库管理系统之一,由瑞典MySQL AB公司开发,目前属于Oracle公司.MySQL是一种关联数据管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性.?- 关系型数据库:采用关系模型来组织数据的数据库- 关系:一张二维表,每个关系都有一个关系名,就是表名- 模型:行和列(二维),具体指字段跟字段信息 2,关系型数据库和非关系型数据库的区别 关系型