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

瀏覽目錄

  • 視圖

  • 觸發器

  • 存儲過程

  • 函數

  • 事務

  • 數據庫鎖

  • 數據庫備份

  • 事件

一、視圖

1、視圖概念

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

2、視圖特點

  • 視圖的列可以來自不同的表,是表的抽象和邏輯意義上建立的新關係

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

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

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

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

3、視圖的本質

視圖是根據SQL語句獲取動態的數據集,併爲其命名,用戶使用時只需使用“視圖名稱”即可獲取結果集,可以將該結果集當做表來使用.

4、創建視圖

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

5、使用視圖

1
select * from 視圖名稱;

6、更新視圖

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

7、刪除視圖

1
drop view 視圖名稱;

二、觸發器

1、觸發器概念

監視某種情況,並觸發某種操作。

2、觸發器創建語法四要素

  • 監視地點(table)

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

  • 觸發時間(after/before)

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

3、創建語法

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表示即將刪除的數據行

4、觸發器的使用   

觸發器無法由用戶直接調用,而知由於對錶的insert/update/delete操作被動引發的。

5、刪除觸發器

1
drop trigger 觸發器名稱;

三、存儲過程

1、存儲過程概念

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

2、查看現有的存儲過程

1
show procedure status;

3、刪除存儲過程

1
drop procedure 存儲過程名稱;

4、調用存儲過程

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

5、創建存儲過程

  • 封裝

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中有三種出入參數類型,分別爲:1in 入參類型 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;

6、存儲過程優點

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

  • 減少網絡流量,降低了網絡負載。存儲過程在服務器端創建成功後,只需要調用該存儲過程即可,而傳統的做法是每次都將大量的SQL語句通過網絡發送至數據庫服務器端然後再執行

  • 存儲過程只在創造時進行編譯,以後每次執行存儲過程都不需再重新編譯。一般SQL語句每執行一次就編譯一次,所以使用存儲過程可提高數據庫執行速度。

7、存儲過程缺點

  • 擴展功能不方便

  • 不便於系統後期維護

四、函數

1、MySQL提供的內建函數

 View Code

2、自定義函數

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

3、調用自定義函數

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

4、刪除自定義函數

1
DROP FUNCTION fun_name;

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

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

 

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

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

五、事務

1、事務概念

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

2、事務的作用

爲了解決如今多用戶、多程序、多線程情況下對同一個表可能同時有很多人在用,爲保持數據的一致性,所以有了事務的概念。

3、事務的特性

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

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

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

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

  • 注意: 

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

    • 事務處理可以用來維護數據庫的完整性,保證成批的 SQL 語句要麼全部執行,要麼全部不執行。

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


4、事務控制語句

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

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

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

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

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

六、數據庫鎖

1、鎖的基本概念

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

2、鎖的基本類型

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

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

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

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

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

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

    • 實現的兩種方式: 

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

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

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

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

  • 但如果經常產生衝突,上層應用會不斷的進行重試操作,這樣反倒是降低了性能,所以這種情況下用悲觀鎖就比較合適

鎖的用法示例

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()

七、數據庫備份

1、mysqldump命令實現備份

mysqldump 命令將數據庫中的數據備份成一個文本文件。表的結構和表中的數據將存儲在生成的文本文件中。 
mysqldump命令的工作原理很簡單。它先查出需要備份的表的結構,再在文本文件中生成一個CREATE語句。 
然後,將表中的所有記錄轉換成一條INSERT語句。然後通過這些語句,就能夠創建表並插入數據。

2、使用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  

3、恢復邏輯備份

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

4、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、mysql323、mysql40、postgresql、oracle、mssql、db2、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>”  

複製代碼

 

八、事件

1、事件

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

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

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

2、事件的優缺點

    • 優點 

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

      • 可以實現每秒鐘執行一個任務,這在一些對實時性要求較高的環境下就非常實用了。

    • 缺點 

      • 定時觸發,不可以調用。

3、事件的創建

  • 一條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(20not 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可以包含在一個事件中,然而他的結果消失了,就好像沒執行過。   

4、事件的查看

  • 查看當前所在庫的事件 

1
mysql> show events;
  • 查看所有事件

1
mysql> select * from mysql.event;

5、事件的修改

  • 一條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;    

6、事件的刪除

  • 如果一個事件不再需要,我們可以使用一條drop event 語句刪除它。使用這條語句我們不需要等到最後一次事件調用。

  • 語法

1
DROP EVENT [IF EXISTS] event_name
  • 例 

1
drop event if exists event_second;


轉自:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章