• 数据库进阶了解


    一.数据库的备份

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

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

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

        关键参数:

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

          2.-A或者--all-databases
            例如:C:WINDOWSsystem32>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 p3G;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

  • 相关阅读:
    加入强调语气,使用<strong>和<em>标签
    了解<hx>标签,为你的网页添加标题
    开始学习<p>标签,添加段落
    <body>标签,网页上显示的内容放在这里
    语义化,让你的网页更好的被搜索引擎理解
    深入源码分析SpringMVC底层原理(二)
    设计模式是什么鬼(解释器)
    Java并发面试题
    漫画 | Spring AOP的底层原理是什么?
    漫画|你还记得原生的JDBC怎么连接数据库吗?
  • 原文地址:https://www.cnblogs.com/q767498226/p/10306744.html
Copyright © 2020-2023  润新知