數據庫MySQL之 視圖、觸發器、存儲過程、函數、事務、數據庫鎖、數據庫備份、事件

瀏覽目錄

  • 視圖html

  • 觸發器python

  • 存儲過程mysql

  • 函數sql

  • 事務數據庫

  • 數據庫鎖django

  • 數據庫備份windows

  • 事件緩存

1、視圖

一、視圖概念

視圖是一個虛擬表,其內容由查詢定義。同真實的表同樣,視圖包含一系列帶有名稱的列和行數據.安全

二、視圖特色

  • 視圖的列能夠來自不一樣的表,是表的抽象和邏輯意義上創建的新關係服務器

  • 視圖是由基本表(實表)產生的表(虛表)

  • 視圖的創建和刪除不影響基本表

  • 對視圖內容的更新(添加、刪除和修改)直接影響基本表

  • 當視圖來自多個基本表時,不容許添加,修改和刪除數據

三、視圖的本質

視圖是根據SQL語句獲取動態的數據集,併爲其命名,用戶使用時只需使用「視圖名稱」便可獲取結果集,能夠將該結果集當作表來使用.

四、建立視圖

1
create view 視圖名稱  as  SQL語句;

五、使用視圖

1
select  *  from  視圖名稱;

六、更新視圖

1
alter view 視圖名稱 AS SQL語句;

七、刪除視圖

1
drop view 視圖名稱;

2、觸發器

一、觸發器概念

監視某種狀況,並觸發某種操做。

二、觸發器建立語法四要素

  • 監視地點(table)

  • 監視事件(insert/update/delete)

  • 觸發時間(after/before)

  • 觸發事件(insert/update/delete)

三、建立語法

1
2
3
4
5
6
7
8
create trigger triggerName  after / before  insert / update / delete
      on 表名  for  each row  #這句話是固定的
begin
      #須要執行的sql語句
end
注意 1 :after / before只能選一個 ,after 表示後置觸發, before 表示前置觸發
注意 2 :insert / update / delete只能選一個
特別的:NEW表示即將插入的數據行,OLD表示即將刪除的數據行

四、觸發器的使用   

觸發器沒法由用戶直接調用,而知因爲對錶的insert/update/delete操做被動引起的。

五、刪除觸發器

1
drop trigger 觸發器名稱;

3、存儲過程

一、存儲過程概念

相似於函數(方法),簡單的說存儲過程是爲了完成某個數據庫中的特定功能而編寫的語句集合, 
該語句集包括SQL語句(對數據的增刪改查)、條件語句和循環語句等。

二、查看現有的存儲過程

1
show procedure status;

三、刪除存儲過程

1
drop procedure 存儲過程名稱;

四、調用存儲過程

1
call 存儲過程名稱(參數入 / 出類型 參數名 數據類型);

五、建立存儲過程

  • 封裝

1
2
3
4
create procedure p1 ()
         begin
              select  *  from  account; 
          end
  • 參數

1
2
3
4
5
6
7
8
9
10
11
create procedure p2( in  int ,out n varchar( 50 ))
begin
  select name into n  from  account where  id  =  i;
end
 
- -  調用
set  @name  = null;
CALL p2( 1 ,@name);
select @name;
注意:mysql中有三種出入參數類型,分別爲: 1 in  入參類型  2 、out 出參類型  3 、inout 出入參類型
注意:into關鍵字能夠將前面字段的查詢結果執行給into後面的變量.
  • 控制

1
2
3
4
5
6
7
8
create procedure p3( in  int , in  c char( 1 ))
begin
     if  = 'd'  then
          select  *  from  account where money >x;
     else
          select  *  from  account where money <x;    
     end  if ;
end
  • 循環:

例-計算1-100累加的和,而且返回計算結果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
create procedure p4(inout n  int )
begin
       DECLARE  sum  int  default  0 - -  設置總和變量,而且指定初始值 0
       declare i  int - -  聲明變量
       set  =  0 ;     - -  經過 set 爲變量設置值
     while  i< = n DO   - -  開始循環
             set  sum  =  sum  + i;
             set  =  i + 1 ;
       end  while - -  結束循環
    select  sum - -  提供結果         
      set  =  sum ; - - 將計算結果提供給 輸出變量 n;
end;
 
- -  調用:
set  @n  =  100 ;
call p4(@n);
select @n;

六、存儲過程優勢

  • 存儲過程加強了SQL語言靈活性。存儲過程可使用控制語句編寫,能夠完成複雜的判斷和較複雜的運算,有很強的靈活性;

  • 減小網絡流量,下降了網絡負載。存儲過程在服務器端建立成功後,只須要調用該存儲過程便可,而傳統的作法是每次都將大量的SQL語句經過網絡發送至數據庫服務器端而後再執行

  • 存儲過程只在創造時進行編譯,之後每次執行存儲過程都不需再從新編譯。通常SQL語句每執行一次就編譯一次,因此使用存儲過程可提升數據庫執行速度。

七、存儲過程缺點

  • 擴展功能不方便

  • 不便於系統後期維護

4、函數

一、MySQL提供的內建函數

 View Code

二、自定義函數

1
2
3
4
5
6
7
CREATE FUNCTION fun1(i1  int ,i2  int )
RETURNS  INT  / / 設置返回類型
BEGIN
     DECLARE  sum  int  default  0 ;
     set  sum  =  i1 + i2;
     RETURN( sum );  / / 返回結果
END

三、調用自定義函數

1
2
3
4
5
#直接調用自定義函數
select fun1( 1 , 5 );
 
#在sql語句中使用自定義函數
select fun1(參數 1 ,參數 2 ),name  from  表名

四、刪除自定義函數

1
DROP FUNCTION fun_name;

五、函數與存儲過程的區別

函數 存儲過程
通常用於計算數據 完成特定任務
聲明爲 FUNCTION 聲明爲 PROCEDURE
須要描述返回類型,且PL/SQL塊中至少有一個有效的RETURN語句 無返回類型,可經過IN、OUT、INOUT參數返回多個值
不能獨立運行,必須做爲表達式的一部分 可做爲一個獨立的PL/SQL語句運行
在 DML 和 DQL 中可調用函數 在 DML 和 DQL 中不可調用過程

 

函數接收參數,並返回一個值。

存儲過程接收參數,並創造一個返回值,還能夠執行sql語句,並把結果返回。

5、事務

一、事務概念

一組SQL語句批量執行,要麼所有執行成功,要麼所有執行失敗

二、事務的做用

爲了解決現在多用戶、多程序、多線程狀況下對同一個表可能同時有不少人在用,爲保持數據的一致性,因此有了事務的概念。

三、事務的特性

  • 原子性(Atom):對於其數據修改,要麼全都執行,要麼全都不執行。

  • 一致性(Consistent):數據庫原來有什麼樣的約束,事務執行以後還須要存在這樣的約束,全部規則都必須應用於事務的修改,以保持全部數據的完整性。

  • 隔離性(Isolate):一個事務不能知道另一個事務的執行狀況(中間狀態)

  • 持久性(Durable):即便出現致命的系統故障也將一直保持。

  • 注意: 

    • 在 MySQL 中只有使用了 Innodb 數據庫引擎的數據庫或表才支持事務。

    • 事務處理能夠用來維護數據庫的完整性,保證成批的 SQL 語句要麼所有執行,要麼所有不執行。

    • 事務用來管理 insert/update/delete 語句


四、事務控制語句

  • BEGIN 或 START TRANSACTION;顯式地開啓一個事務;

  • COMMIT;也可使用COMMIT WORK,不過兩者是等價的。COMMIT會提交事務,並使已對數據庫進行的全部修改稱爲永久性的;

  • ROLLBACK;有可使用ROLLBACK WORK,不過兩者是等價的。回滾會結束用戶的事務,並撤銷正在進行的全部未提交的修改;

  • SAVEPOINT : 保存點,能夠把一個事物分割成幾部分.在執行ROLLBACK時能夠指定在什麼位置上進行回滾操做.

  • 注意: SET AUTOCOMMIT=0禁止自動提交和SET AUTOCOMMIT=1開啓自動提交.

6、數據庫鎖

一、鎖的基本概念

當併發事務同時訪問一個資源時,有可能致使數據不一致,所以須要一種機制來將數據訪問順序化,以保證數據庫數據的一致性。

二、鎖的基本類型

    • 多個事務同時讀取一個對象的時候,是不會有衝突的。同時讀和寫,或者同時寫纔會產生衝突。 
      所以爲了提升數據庫的併發性能,一般會定義兩種鎖:共享鎖和排它鎖。

    • 共享鎖(Shared Lock,也叫S鎖) 
      共享鎖(S)表示對數據進行讀操做。所以多個事務能夠同時爲一個對象加共享鎖。 
      (若是試衣間的門還沒被鎖上,顧客都可以同時進去參觀)

    • 排他鎖(Exclusive Lock,也叫X鎖) 
      排他鎖(X)表示對數據進行寫操做。若是一個事務對 對象加了排他鎖,其餘事務就不能再給它加任何鎖了。 
      (某個顧客把試衣間從裏面反鎖了,其餘顧客想要使用這個試衣間,就只有等待鎖從裏面給打開了)

三、實際開發中常見的兩種鎖

    • 悲觀鎖 
      行爲悲觀,每次去拿數據的時候都認爲別人會修改,因此每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會block(阻塞)直到它拿到鎖。傳統的關係型數據庫裏邊就用到了不少這種鎖機制. 
      注意:要使用悲觀鎖,咱們必須關閉mysql數據庫的自動提交屬性.由於MySQL默認使用autocommit模式,也就是說,當你執行一個更新操做後,MySQL會馬上將結果進行提交。關閉自動提交命令爲:set autocommit=0; 
      注意:在使用悲觀鎖時,若是表中沒有指定主鍵,則會進行鎖表操做. 
      注意: 悲觀鎖的確保了數據的安全性,在數據被操做的時候鎖定數據不被訪問,可是這樣會帶來很大的性能問題。 
      所以悲觀鎖在實際開發中使用是相對比較少的。  

    • 樂觀鎖(須要自行實現) 
      行爲樂觀,每次去拿數據的時候都認爲別人不會修改,因此不會上鎖,可是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可使用版本號等機制。 

    • 實現的兩種方式: 

      • 使用數據版本(Version)記錄機制實現,這是樂觀鎖最經常使用的一種實現方式。即爲數據增長一個版本標識,通常是經過爲數據庫表增長一個數字類型的 「version」 字段來實現。當讀取數據時,將version字段的值一同讀出,數據每更新一次,對此version值加一。當咱們提交更新的時候,判斷數據庫表對應記錄 的當前版本信息與第一次取出來的version值進行比對,若是數據庫表當前版本號與第一次取出來的version值相等,則予以更新,不然認爲是過時數據。

      • 一樣是在須要樂觀鎖控制的table中增長一個字段,名稱無所謂,字段類型使用時間戳 (datatime), 和上面的version相似,也是在更新提交的時候檢查當前數據庫中數據的時間戳和本身更新前取到的時間戳進行對比,若是一致則OK,不然就是版本衝突。

四、悲觀鎖類樂觀鎖的優缺點

  • 樂觀鎖適用於寫入比較少的狀況下,即衝突真的不多發生的時候,這樣能夠省去了鎖的開銷,加大了系統的整個吞吐量

  • 但若是常常產生衝突,上層應用會不斷的進行重試操做,這樣反卻是下降了性能,因此這種狀況下用悲觀鎖就比較合適

鎖的用法示例

1
2
3
4
5
6
7
8
9
-  終端:
     begin;
     select xx  from  xx  for  update;  #必須加
     commit;
-  pymysql
     cursor.execute( 'select * from xx for update' )
-  django   #事務
     with trancation.automic():
         models.User.objects. all ().for_update()

7、數據庫備份

一、mysqldump命令實現備份

mysqldump 命令將數據庫中的數據備份成一個文本文件。表的結構和表中的數據將存儲在生成的文本文件中。 
mysqldump命令的工做原理很簡單。它先查出須要備份的表的結構,再在文本文件中生成一個CREATE語句。 
而後,將表中的全部記錄轉換成一條INSERT語句。而後經過這些語句,就可以建立表並插入數據。

二、使用mysqldump實現邏輯備份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#語法:
# mysqldump -h 服務器 -u用戶名 -p密碼 數據庫名 > 備份文件.sql
 
#示例:
#單庫備份
mysqldump  - uroot  - p123456 db1 > c: / db1.sql
mysqldump  - uroot  - p123456 db1 table1 table2 > c: / db1 - table1 - table2.sql
 
#多庫備份
mysqldump  - uroot  - p123456  - - databases db1 db2 mysql db3 > c: / db1_db2_mysql_db3.sql
 
#備份全部庫
mysqldump  - uroot  - p123456  - - all - databases > c: / all .sql
 
注意:可能MySQL5. 7 的用戶在使用mysqldump備份時會報錯 mysqldump: unkown option  '--no-beep' ,處理辦法以下:
1.  刪除my.ini [client]下的 no - beep 參數;
2.  在 mysqldump 後加 - - no - defaults參數,即:mysqldump  - - no - defualts  - h主機IP  - u用戶名  - p密碼 數據庫 > xxx.sql  

三、恢復邏輯備份

1
2
3
4
5
#在mysql命令下,用source命令導入備份文件:
mysql>  USE 數據庫名;
mysql>  source 備份文件.sql;
 
注意:只能在cmd界面下執行source命令,不能在mysql工具裏面執行source命令,會報錯,由於cmd是直接調用mysql.exe來執行命令的。  

四、Mysqldump命令補充

複製代碼

  1 --all-databases  , -A  2 導出所有數據庫。  3 mysqldump  -uroot -p --all-databases  4 --all-tablespaces  , -Y  5 導出所有表空間。  6 mysqldump  -uroot -p --all-databases --all-tablespaces  7 --no-tablespaces  , -y  8 不導出任何表空間信息。  9 mysqldump  -uroot -p --all-databases --no-tablespaces 10 --add-drop-database 11 每一個數據庫建立以前添加drop數據庫語句。 12 mysqldump  -uroot -p --all-databases --add-drop-database 13 --add-drop-table 14 每一個數據表建立以前添加drop數據表語句。(默認爲打開狀態,使用--skip-add-drop-table取消選項) 15 mysqldump  -uroot -p --all-databases  (默認添加drop語句) 16 mysqldump  -uroot -p --all-databases –skip-add-drop-table  (取消drop語句) 17 --add-locks 18 在每一個表導出以前增長LOCK TABLES而且以後UNLOCK  TABLE。(默認爲打開狀態,使用--skip-add-locks取消選項) 19 mysqldump  -uroot -p --all-databases  (默認添加LOCK語句) 20 mysqldump  -uroot -p --all-databases –skip-add-locks   (取消LOCK語句) 21 --allow-keywords 22 容許建立是關鍵詞的列名字。這由表名前綴於每一個列名作到。 23 mysqldump  -uroot -p --all-databases --allow-keywords 24 --apply-slave-statements 25 在'CHANGE MASTER'前添加'STOP SLAVE',而且在導出的最後添加'START SLAVE'。 26 mysqldump  -uroot -p --all-databases --apply-slave-statements 27 --character-sets-dir 28 字符集文件的目錄 29 mysqldump  -uroot -p --all-databases  --character-sets-dir=/usr/local/mysql/share/mysql/charsets 30 --comments 31 附加註釋信息。默認爲打開,能夠用--skip-comments取消 32 mysqldump  -uroot -p --all-databases  (默認記錄註釋) 33 mysqldump  -uroot -p --all-databases --skip-comments   (取消註釋) 34 --compatible 35 導出的數據將和其它數據庫或舊版本的MySQL 相兼容。值能夠爲ansi、mysql32三、mysql40、postgresql、oracle、mssql、db二、maxdb、no_key_options、no_tables_options、no_field_options等, 36 要使用幾個值,用逗號將它們隔開。它並不保證能徹底兼容,而是儘可能兼容。 37 mysqldump  -uroot -p --all-databases --compatible=ansi 38 --compact 39 導出更少的輸出信息(用於調試)。去掉註釋和頭尾等結構。可使用選項:--skip-add-drop-table  --skip-add-locks --skip-comments --skip-disable-keys 40 mysqldump  -uroot -p --all-databases --compact 41 --complete-insert,  -c 42 使用完整的insert語句(包含列名稱)。這麼作能提升插入效率,可是可能會受到max_allowed_packet參數的影響而致使插入失敗。 43 mysqldump  -uroot -p --all-databases --complete-insert 44 --compress, -C 45 在客戶端和服務器之間啓用壓縮傳遞全部信息 46 mysqldump  -uroot -p --all-databases --compress 47 --create-options,  -a 48 在CREATE TABLE語句中包括全部MySQL特性選項。(默認爲打開狀態) 49 mysqldump  -uroot -p --all-databases 50 --databases,  -B 51 導出幾個數據庫。參數後面全部名字參量都被看做數據庫名。 52 mysqldump  -uroot -p --databases test mysql 53 --debug 54 輸出debug信息,用於調試。默認值爲:d:t,/tmp/mysqldump.trace 55 mysqldump  -uroot -p --all-databases --debug 56 mysqldump  -uroot -p --all-databases --debug=」 d:t,/tmp/debug.trace」 57 --debug-check 58 檢查內存和打開文件使用說明並退出。 59 mysqldump  -uroot -p --all-databases --debug-check 60 --debug-info 61 輸出調試信息並退出 62 mysqldump  -uroot -p --all-databases --debug-info 63 --default-character-set 64 設置默認字符集,默認值爲utf8 65 mysqldump  -uroot -p --all-databases --default-character-set=utf8 66 --delayed-insert 67 採用延時插入方式(INSERT DELAYED)導出數據 68 mysqldump  -uroot -p --all-databases --delayed-insert 69 --delete-master-logs 70 master備份後刪除日誌. 這個參數將自動激活--master-data。 71 mysqldump  -uroot -p --all-databases --delete-master-logs 72 --disable-keys 73 對於每一個表,用/*!40000 ALTER TABLE tbl_name DISABLE KEYS */;和/*!40000 ALTER TABLE tbl_name ENABLE KEYS */;語句引用INSERT語句。這樣能夠更快地導入dump出來的文件,由於它是在插入全部行後建立索引的。該選項只適合MyISAM表,默認爲打開狀態。 74 mysqldump  -uroot -p --all-databases 75 --dump-slave 76 該選項將主的binlog位置和文件名追加到導出數據的文件中(show slave status)。設置爲1時,將會以CHANGE MASTER命令輸出到數據文件;設置爲2時,會在change前加上註釋。該選項將會打開--lock-all-tables,除非--single-transaction被指定。該選項會自動關閉--lock-tables選項。默認值爲0。 77 mysqldump  -uroot -p --all-databases --dump-slave=1 78 mysqldump  -uroot -p --all-databases --dump-slave=2 79 --master-data 80 該選項將當前服務器的binlog的位置和文件名追加到輸出文件中(show master status)。若是爲1,將會輸出CHANGE MASTER 命令;若是爲2,輸出的CHANGE  MASTER命令前添加註釋信息。該選項將打開--lock-all-tables 選項,除非--single-transaction也被指定(在這種狀況下,全局讀鎖在開始導出時得到很短的時間;其餘內容參考下面的--single-transaction選項)。該選項自動關閉--lock-tables選項。 81 mysqldump  -uroot -p --host=localhost --all-databases --master-data=1; 82 mysqldump  -uroot -p --host=localhost --all-databases --master-data=2; 83 --events, -E 84 導出事件。 85 mysqldump  -uroot -p --all-databases --events 86 --extended-insert,  -e 87 使用具備多個VALUES列的INSERT語法。這樣使導出文件更小,並加速導入時的速度。默認爲打開狀態,使用--skip-extended-insert取消選項。 88 mysqldump  -uroot -p --all-databases 89 mysqldump  -uroot -p --all-databases--skip-extended-insert   (取消選項) 90 --fields-terminated-by 91 導出文件中忽略給定字段。與--tab選項一塊兒使用,不能用於--databases和--all-databases選項 92 mysqldump  -uroot -p test test --tab=」/home/mysql」 --fields-terminated-by=」#」 93 --fields-enclosed-by 94 輸出文件中的各個字段用給定字符包裹。與--tab選項一塊兒使用,不能用於--databases和--all-databases選項 95 mysqldump  -uroot -p test test --tab=」/home/mysql」 --fields-enclosed-by=」#」 96 --fields-optionally-enclosed-by 97 輸出文件中的各個字段用給定字符選擇性包裹。與--tab選項一塊兒使用,不能用於--databases和--all-databases選項 98 mysqldump  -uroot -p test test --tab=」/home/mysql」  --fields-enclosed-by=」#」 --fields-optionally-enclosed-by  =」#」 99 --fields-escaped-by100 輸出文件中的各個字段忽略給定字符。與--tab選項一塊兒使用,不能用於--databases和--all-databases選項101 mysqldump  -uroot -p mysql user --tab=」/home/mysql」 --fields-escaped-by=」#」102 --flush-logs103 開始導出以前刷新日誌。104 請注意:假如一次導出多個數據庫(使用選項--databases或者--all-databases),將會逐個數據庫刷新日誌。除使用--lock-all-tables或者--master-data外。在這種狀況下,日誌將會被刷新一次,相應的因此表同時被鎖定。所以,若是打算同時導出和刷新日誌應該使用--lock-all-tables 或者--master-data 和--flush-logs。105 mysqldump  -uroot -p --all-databases --flush-logs106 --flush-privileges107 在導出mysql數據庫以後,發出一條FLUSH  PRIVILEGES 語句。爲了正確恢復,該選項應該用於導出mysql數據庫和依賴mysql數據庫數據的任什麼時候候。108 mysqldump  -uroot -p --all-databases --flush-privileges109 --force110 在導出過程當中忽略出現的SQL錯誤。111 mysqldump  -uroot -p --all-databases --force112 --help113 顯示幫助信息並退出。114 mysqldump  --help115 --hex-blob116 使用十六進制格式導出二進制字符串字段。若是有二進制數據就必須使用該選項。影響到的字段類型有BINARY、VARBINARY、BLOB。117 mysqldump  -uroot -p --all-databases --hex-blob118 --host, -h119 須要導出的主機信息120 mysqldump  -uroot -p --host=localhost --all-databases121 --ignore-table122 不導出指定表。指定忽略多個表時,須要重複屢次,每次一個表。每一個表必須同時指定數據庫和表名。例如:--ignore-table=database.table1 --ignore-table=database.table2 ……123 mysqldump  -uroot -p --host=localhost --all-databases --ignore-table=mysql.user124 --include-master-host-port125 在--dump-slave產生的'CHANGE  MASTER TO..'語句中增長'MASTER_HOST=<host>,MASTER_PORT=<port>' 126 mysqldump  -uroot -p --host=localhost --all-databases --include-master-host-port127 --insert-ignore128 在插入行時使用INSERT IGNORE語句.129 mysqldump  -uroot -p --host=localhost --all-databases --insert-ignore130 --lines-terminated-by131 輸出文件的每行用給定字符串劃分。與--tab選項一塊兒使用,不能用於--databases和--all-databases選項。132 mysqldump  -uroot -p --host=localhost test test --tab=」/tmp/mysql」  --lines-terminated-by=」##」133 --lock-all-tables,  -x134 提交請求鎖定全部數據庫中的全部表,以保證數據的一致性。這是一個全局讀鎖,而且自動關閉--single-transaction 和--lock-tables 選項。135 mysqldump  -uroot -p --host=localhost --all-databases --lock-all-tables136 --lock-tables,  -l137 開始導出前,鎖定全部表。用READ  LOCAL鎖定表以容許MyISAM表並行插入。對於支持事務的表例如InnoDB和BDB,--single-transaction是一個更好的選擇,由於它根本不須要鎖定表。138 請注意當導出多個數據庫時,--lock-tables分別爲每一個數據庫鎖定表。所以,該選項不能保證導出文件中的表在數據庫之間的邏輯一致性。不一樣數據庫表的導出狀態能夠徹底不一樣。139 mysqldump  -uroot -p --host=localhost --all-databases --lock-tables140 --log-error141 附加警告和錯誤信息到給定文件142 mysqldump  -uroot -p --host=localhost --all-databases  --log-error=/tmp/mysqldump_error_log.err143 --max_allowed_packet144 服務器發送和接受的最大包長度。145 mysqldump  -uroot -p --host=localhost --all-databases --max_allowed_packet=10240146 --net_buffer_length147 TCP/IP和socket鏈接的緩存大小。148 mysqldump  -uroot -p --host=localhost --all-databases --net_buffer_length=1024149 --no-autocommit150 使用autocommit/commit 語句包裹表。151 mysqldump  -uroot -p --host=localhost --all-databases --no-autocommit152 --no-create-db,  -n153 只導出數據,而不添加CREATE DATABASE 語句。154 mysqldump  -uroot -p --host=localhost --all-databases --no-create-db155 --no-create-info,  -t156 只導出數據,而不添加CREATE TABLE 語句。157 mysqldump  -uroot -p --host=localhost --all-databases --no-create-info158 --no-data, -d159 不導出任何數據,只導出數據庫表結構。160 mysqldump  -uroot -p --host=localhost --all-databases --no-data161 --no-set-names,  -N162 等同於--skip-set-charset163 mysqldump  -uroot -p --host=localhost --all-databases --no-set-names164 --opt165 等同於--add-drop-table,  --add-locks, --create-options, --quick, --extended-insert, --lock-tables,  --set-charset, --disable-keys 該選項默認開啓,  能夠用--skip-opt禁用.166 mysqldump  -uroot -p --host=localhost --all-databases --opt167 --order-by-primary168 若是存在主鍵,或者第一個惟一鍵,對每一個表的記錄進行排序。在導出MyISAM表到InnoDB表時有效,但會使得導出工做花費很長時間。169 mysqldump  -uroot -p --host=localhost --all-databases --order-by-primary170 --password, -p171 鏈接數據庫密碼172 --pipe(windows系統可用)173 使用命名管道鏈接mysql174 mysqldump  -uroot -p --host=localhost --all-databases --pipe175 --port, -P176 鏈接數據庫端口號177 --protocol178 使用的鏈接協議,包括:tcp, socket, pipe, memory.179 mysqldump  -uroot -p --host=localhost --all-databases --protocol=tcp180 --quick, -q181 不緩衝查詢,直接導出到標準輸出。默認爲打開狀態,使用--skip-quick取消該選項。182 mysqldump  -uroot -p --host=localhost --all-databases183 mysqldump  -uroot -p --host=localhost --all-databases --skip-quick184 --quote-names,-Q185 使用(`)引發表和列名。默認爲打開狀態,使用--skip-quote-names取消該選項。186 mysqldump  -uroot -p --host=localhost --all-databases187 mysqldump  -uroot -p --host=localhost --all-databases --skip-quote-names188 --replace189 使用REPLACE INTO 取代INSERT INTO.190 mysqldump  -uroot -p --host=localhost --all-databases --replace191 --result-file,  -r192 直接輸出到指定文件中。該選項應該用在使用回車換行對(\\r\\n)換行的系統上(例如:DOS,Windows)。該選項確保只有一行被使用。193 mysqldump  -uroot -p --host=localhost --all-databases --result-file=/tmp/mysqldump_result_file.txt194 --routines, -R195 導出存儲過程以及自定義函數。196 mysqldump  -uroot -p --host=localhost --all-databases --routines197 --set-charset198 添加'SET NAMES  default_character_set'到輸出文件。默認爲打開狀態,使用--skip-set-charset關閉選項。199 mysqldump  -uroot -p --host=localhost --all-databases200 mysqldump  -uroot -p --host=localhost --all-databases --skip-set-charset201 --single-transaction202 該選項在導出數據以前提交一個BEGIN SQL語句,BEGIN 不會阻塞任何應用程序且能保證導出時數據庫的一致性狀態。它只適用於多版本存儲引擎,僅InnoDB。本選項和--lock-tables 選項是互斥的,由於LOCK  TABLES 會使任何掛起的事務隱含提交。要想導出大表的話,應結合使用--quick 選項。203 mysqldump  -uroot -p --host=localhost --all-databases --single-transaction204 --dump-date205 將導出時間添加到輸出文件中。默認爲打開狀態,使用--skip-dump-date關閉選項。206 mysqldump  -uroot -p --host=localhost --all-databases207 mysqldump  -uroot -p --host=localhost --all-databases --skip-dump-date208 --skip-opt209 禁用–opt選項.210 mysqldump  -uroot -p --host=localhost --all-databases --skip-opt211 --socket,-S212 指定鏈接mysql的socket文件位置,默認路徑/tmp/mysql.sock213 mysqldump  -uroot -p --host=localhost --all-databases --socket=/tmp/mysqld.sock214 --tab,-T215 爲每一個表在給定路徑建立tab分割的文本文件。注意:僅僅用於mysqldump和mysqld服務器運行在相同機器上。注意使用--tab不能指定--databases參數216 mysqldump  -uroot -p --host=localhost test test --tab="/home/mysql"217 --tables218 覆蓋--databases (-B)參數,指定須要導出的表名,在後面的版本會使用table取代tables。219 mysqldump  -uroot -p --host=localhost --databases test --tables test220 --triggers221 導出觸發器。該選項默認啓用,用--skip-triggers禁用它。222 mysqldump  -uroot -p --host=localhost --all-databases --triggers223 --tz-utc224 在導出頂部設置時區TIME_ZONE='+00:00' ,以保證在不一樣時區導出的TIMESTAMP 數據或者數據被移動其餘時區時的正確性。225 mysqldump  -uroot -p --host=localhost --all-databases --tz-utc226 --user, -u227 指定鏈接的用戶名。228 --verbose, --v229 輸出多種平臺信息。230 --version, -V231 輸出mysqldump版本信息並退出232 --where, -w233 只轉儲給定的WHERE條件選擇的記錄。請注意若是條件包含命令解釋符專用空格或字符,必定要將條件引用起來。234 mysqldump  -uroot -p --host=localhost --all-databases --where=」 user=’root’」235 --xml, -X236 導出XML格式.237 mysqldump  -uroot -p --host=localhost --all-databases --xml238 --plugin_dir239 客戶端插件的目錄,用於兼容不一樣的插件版本。240 mysqldump  -uroot -p --host=localhost --all-databases --plugin_dir=」/usr/local/lib/plugin」241 --default_auth242 客戶端插件默認使用權限。243 mysqldump  -uroot -p --host=localhost --all-databases --default-auth=」/usr/local/lib/plugin/<PLUGIN>」  

複製代碼

 

8、事件

一、事件

  • 事件(event)是MySQL在相應的時刻調用的過程式數據庫對象。一個事件可調用一次,也可週期性的啓動,它由一個特定的線程來管理的,也就是所謂的「事件調度器」。

  • 事件和觸發器相似,都是在某些事情發生的時候啓動。當數據庫上啓動一條語句的時候,觸發器就啓動了,而事件是根據調度事件來啓動的。因爲他們彼此類似,因此事件也稱爲臨時性觸發器。

  • 事件取代了原先只能由操做系統的計劃任務來執行的工做,並且MySQL的事件調度器能夠精確到每秒鐘執行一個任務,而操做系統的計劃任務(如:Linux下的CRON或Windows下的任務計劃)只能精確到每分鐘執行一次。

二、事件的優缺點

    • 優勢 

      • 一些對數據定時性操做再也不依賴外部程序,而直接使用數據庫自己提供的功能。

      • 能夠實現每秒鐘執行一個任務,這在一些對實時性要求較高的環境下就很是實用了。

    • 缺點 

      • 定時觸發,不能夠調用。

三、事件的建立

  • 一條create event語句建立一個事件。每一個事件由兩個主要部分組成,第一部分是事件調度(event schedule),表示事件什麼時候啓動以及按什麼頻率啓動,第二部分是事件動做(event action),這是事件啓動時執行的代碼,事件的動做包含一條SQL語句,它多是一個簡單地insert或者update語句,也可使一個存儲過程或者 begin…end語句塊,這兩種狀況容許咱們執行多條SQL。一個事件能夠是活動(打開)的或中止(關閉)的,活動意味着事件調度器檢查事件動做是否必須調用,中止意味着事件的聲明存儲在目錄中,但調度器不會檢查它是否應該調用。在一個事件建立以後,它當即變爲活動的,一個活動的事件能夠執行一次或者屢次。

  • 建立語法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CREATE
     [DEFINER  =  { user | CURRENT_USER }]
     EVENT
     [IF NOT EXISTS]
     event_name
     ON SCHEDULE schedule
     [ON COMPLETION [NOT] PRESERVE]
     [ENABLE | DISABLE | DISABLE ON SLAVE]
     [COMMENT  'comment' ]
     DO event_body;
 
schedule:
     AT timestamp [ +  INTERVAL interval] ...
   | EVERY interval
     [STARTS timestamp [ +  INTERVAL interval] ...]
     [ENDS timestamp [ +  INTERVAL interval] ...]
 
interval:
     quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
               WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
               DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND} 

 View Code

  • 開啓關閉事件調度器

    • MySQL事件調度器event_scheduler負責調用事件,它默認是關閉的。這個調度器不斷地監視一個事件是否要調用, 要建立事件,必須打開調度器。 

              查看調度器命令: 

1
mysql> show variables like  '%event_scheduler%' ;

    • 開啓事件調度器(如下任一方式都可) 

SET GLOBAL event_scheduler = ON; 

SET @@global.event_scheduler = ON; 

SET GLOBAL event_scheduler = 1; 

SET @@global.event_scheduler = 1; 

1
event_scheduler  =  1  #或者ON

    • 查看調度器線程  

1
mysql> show processlist;

    • 關閉事件調度器(如下任一方式都可) 

SET GLOBAL event_scheduler = OFF; 
SET @@global.event_scheduler = OFF; 
SET GLOBAL event_scheduler = 0; 
SET @@global.event_scheduler = 0; 
經過配置文件my.cnf,在[mysqld]下增長:

1
event_scheduler  =  0  #或者OFF,DISABLED

    • 查看調度器線程

1
mysql> show processlist;

    • 例:建立一個表記錄每次事件調度的名字和事件戳

1
2
3
#建立測試表
     mysql> drop table  if  exists events_list;
     mysql> create table events_list(event_name varchar( 20 not  null, event_started timestamp  not  null);
  • 例:建立一個表記錄每次事件調度的名字和事件戳

1
2
3
4
5
6
7
#建立事件1(當即啓動事件)
     create event event_now 
     on schedule 
     at now() 
     do insert into events_list values( 'event_now' , now()); 
#查看事件執行結果
     mysql> select  *  from  events_list; 
  • 例:建立一個表記錄每次事件調度的名字和事件戳

1
2
3
4
5
6
7
#建立事件2(每分鐘啓動事件)
     create event test.event_minute 
     on schedule 
     every   1  minute  
     do insert into events_list values( 'event_now' , now()); 
#查看事件執行結果
     mysql> select  *  from  events_list;  
  • 例:建立一個表記錄每次事件調度的名字和事件戳

1
2
3
4
5
#建立事件3(每秒鐘啓動事件)
     CREATE event event_now 
     ON SCHEDULE 
     EVERY  1  SECOND
     DO INSERT INTO event_test VALUES( 1 ); 
  • 例:建立一個表記錄每次事件調度的名字和事件戳

1
2
3
4
# 建立事件4(每秒鐘調用存儲過程)
    CREATE DEFINER = `root`@`localhost` EVENT `eventUpdateStatus`
    ON SCHEDULE EVERY  1  SECOND
    STARTS  '2017-11-21 00:12:44'  ON COMPLETION PRESERVE ENABLE DO call updateStatus()
  • 注意  

默認建立事件存儲在當前庫中,也可顯示指定事件建立在哪一個庫中 
經過show events只能查看當前庫中建立的事件 
事件執行完即釋放,如當即執行事件,執行完後,事件便自動刪除,屢次調用事件或等待執行事件能夠查看到。 
若是兩個事件須要在同一時刻調用,mysql會肯定調用他們的順序,若是要指定順序,須要確保一個事件至少在另外一個事件1秒後執行 
對於遞歸調度的事件,結束日期不能在開始日期以前。 
select能夠包含在一個事件中,然而他的結果消失了,就好像沒執行過。   

四、事件的查看

  • 查看當前所在庫的事件 

1
mysql> show events;
  • 查看全部事件

1
mysql> select  *  from  mysql.event;

五、事件的修改

  • 一條alter event語句能夠修改事件的定義和屬性。咱們可讓一個事件成爲中止的或者再次讓它活動,也能夠修改一個事件的名字或者整個調度。然而當一個使用 ON COMPLETION NOT PRESERVE 屬性定義的事件最後一次執行後,事件直接就不存在了,不能修改。

  • 語法

1
2
3
4
5
6
7
8
9
ALTER
     [DEFINER  =  { user | CURRENT_USER }]
     EVENT event_name
     [ON SCHEDULE schedule]
     [ON COMPLETION [NOT] PRESERVE]
     [RENAME TO new_event_name]
     [ENABLE | DISABLE | DISABLE ON SLAVE]
     [COMMENT  'comment' ]
     [DO event_body] 
  • 例:修改上面例子3.3.3 每分鐘啓動事件爲每30秒啓動

1
2
3
4
alter event test.event_minute
on schedule 
every   30  second  
do insert into events_list values( 'event_now' , now());
  • 修改上面例子事件名字爲event_second

1
2
alter event test.event_minute 
rename to test.event_second;
  • 修改上面例子事件爲不活動和再次活動

1
2
alter event test.event_second disable;
alter event test.event_second enable;    

六、事件的刪除

  • 若是一個事件再也不須要,咱們可使用一條drop event 語句刪除它。使用這條語句咱們不須要等到最後一次事件調用。

  • 語法

1
DROP EVENT [IF EXISTS] event_name
  • 例 

1
drop event  if  exists event_second;


轉自:

https://www.cnblogs.com/hanbowen/p/9569130.html

相關文章
相關標籤/搜索