1. 程式人生 > >數據庫進階了解

數據庫進階了解

res Python一 rev 聲明 log HERE action () docker

一.數據庫的備份

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

數據庫進階了解