数据库进阶了解

一.数据库的备份

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

猜你喜欢

转载自www.cnblogs.com/q767498226/p/10306744.html