數據庫進階了解
一.數據庫的備份
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
數據庫進階了解