MySQL之基礎功能


一.視圖

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

視圖有如下特點:
  1. 視圖的列可以來自不同的表,是表的抽象和邏輯意義上建立的新關系。
  2. 視圖是由基本表(實表)產生的表(虛表)。
  3. 視圖的建立和刪除不影響基本表。
  4. 對視圖內容的更新(添加、刪除和修改)直接影響基本表。
  5. 當視圖來自多個基本表時,不允許添加和刪除數據。

 1.創建視圖

1
create view 視圖名稱  as sql 查詢語句  

 2.使用視圖

1
select * from 視圖名稱;

 3.更新視圖

1
alter view 視圖名稱 AS SQL查詢語句

 4. 刪除視圖

1
drop view 視圖名稱;

2.觸發器-trigger

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

觸發器創建語法四要素:1.監視地點(table)

           2.監視事件(insert/update/delete)

             3.觸發時間(after/before)

           4.觸發事件(insert/update/delete)

1.創建觸發器語法

1
2
3
4
5
6
7
create trigger triggerName  after /before  insert / update / delete
      on 表名 for each row #這句話是固定的
  begin
      #需要執行的sql語句
  end
注意1: after /before: 只能選一個 , after 表示 后置觸發, before 表示前置觸發
注意2: insert / update / delete :只能選一個

 

創建兩張表

#商品表

create table goods(

  id int primary key auto_increment,

  name varchar(20),

  num int

);

#訂單表

create table order_table(

    oid int primary key auto_increment,

    gid int,

    much int

);

添加3條商品數據

1
insert into goods( name ,num) values ( '商品1' ,10),( '商品2' ,10),( '商品3' ,10);

如果我們在沒使用觸發器之前:假設我們現在賣了3個商品1,我們需要做兩件事

1.往訂單表插入一條記錄

1
insert into order_table(gid,much) values (1,3);

2.更新商品表商品1的剩余數量

1
update goods set num=num-3 where id=1;

 

現在,我們來創建一個觸發器:

1
2
3
4
5
create trigger tg1 after insert on  order_table
for each row
begin    
   update goods set num = num -3 where id = 1;
end

這時候我們只要執行:

1
insert into order_table(gid,much) values (1,3);

 

會發現商品1的數量變為7了,說明在我們插入一條訂單的時候,

觸發器自動幫我們做了更新操作。

但現在會有一個問題,因為我們觸發器里面num和id都是寫死的,所以不管我們買哪個商品,最終更新的都是商品1的數量。比如:我們往訂單表再插入一條記錄:

1
insert into order_table(gid,much) values (2,3);

 

執行完后會發現商品1的數量變4了,而商品2的數量沒變,這樣顯然不是我們想要的結果。我們需要改改我們之前創建的觸發器。

 

我們如何在觸發器引用行的值,也就是說我們要得到我們新插入的訂單記錄中的gid或much的值。

對於insert而言,新插入的行用new來表示,行中的每一列的值用new.列名來表示。

所以現在我們可以這樣來改我們的觸發器:

1
2
3
4
5
create trigger tg2 after insert on order_table
for each row
begin
  update goods set num = num-new.much  where id = new.gid;
end

第二個觸發器創建完畢,我們先把第一個觸發器刪掉

1
drop trigger tg1;

再來測試一下,插入一條訂單記錄:

1
insert into order_table(gid,much) values (2,3)

執行完發現商品2的數量變為7了,現在就對了。

現在還存在兩種情況:

1.當用戶撤銷一個訂單的時候,我們這邊直接刪除一個訂單,我們是不是需要把對應的商品數量再加回去呢?

 對於delete而言:原本有一行,后來被刪除,想引用被刪除的這一行,用old來表示舊表中的值,old.列名可以引用原(舊)表中的值。

那我們的觸發器就該這樣寫:

1
2
3
4
5
create trigger tg3 afert delete  on order_table
for each row
bigin
     update goods set num = num + old.much where id = old.gid; -- (注意這邊的變化)
end

2.當用戶修改一個訂單的數量時,我們觸發器修改怎么寫?

1
2
3
4
5
create trigger tg4 after update on order_table
for each row
begin
     update goods set num = num+old.much-new.much where id = old.gid;
end

 

3.存儲過程

 MySQL數據庫在5.0版本后開始支持存儲過程,那么什么是存儲過程呢?怎么創建、查看和刪除存儲過程呢?存儲過程有什么優點?

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

 1. 查看現有的存儲過程

1
show procedure status;

 2 .刪除存儲過程

1
drop procedure 存儲過程名稱;

   3. 調用 存儲過程

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

 4.創建存儲過程

1.體會封裝
1
2
3
4
5
#1.體會封裝
create procedure p1 ()
begin
     select * from account;  
end
2.SQL 體會參數
1
2
3
4
5
6
7
8
9
create procedure p2( in i 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 ;

注意1: mysql中有三種出入參數類型:分別為:1. in 入參類型  2.out 出參類型   3. inout 出入參類型 

注意2: into 關鍵字 可以 將前面字段的查詢結果 執行 給 into 后面的變量.

-- 創建存儲過程 in 入參
create procedure p_in (IN num int )
begin
    select num;
    set num=100;
    select num;
end;

-- 調用
set @num=1;
call p_in(@num);
select @num;
-- 總結: IN 參數只是將變量在存儲過程內部做了修改,並沒有影響到外部,@num仍為1。
in參數

 

out出參示例
inout出入參示例

3.SQL 體會控制

1
2
3
4
5
6
7
8
9
#3.SQL 體會控制
  create procedure p3( in x int , in c char (1))
  begin
     if c = 'd' then
          select * from account where money >x;
    else
          select * from account where money <x;     
   end if;
end

 4.體會循環:計算1-100累加的和,並且返回計算結果.

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

存儲過程優點
        1、存儲過程增強了SQL語言靈活性。

      存儲過程可以使用控制語句編寫,可以完成復雜的判斷和較復雜的運算,有很強的靈活性;
        2、減少網絡流量,降低了網絡負載。

      存儲過程在服務器端創建成功后,只需要調用該存儲過程即可,而傳統的做法是每次都將大量的SQL語句通過網絡發送至數據庫服務器端然后再執行
        3、存儲過程只在創造時進行編譯,以后每次執行存儲過程都不需再重新編譯。

      一般SQL語句每執行一次就編譯一次,所以使用存儲過程可提高數據庫執行速度。
存儲過程缺點:     

   1、擴展功能不方便

   2、不便於系統后期維護

4.函數 

 MySQL提供的內建函數:

 

一、數學函數
    ROUND(x,y)
        返回參數x的四舍五入的有y位小數的值
        
    RAND()
        返回0到1內的隨機值,可以通過提供一個參數(種子)使RAND()隨機數生成器生成一個指定的值。

二、聚合函數(常用於GROUP BY從句的SELECT查詢中)
    AVG(col)返回指定列的平均值
    COUNT(col)返回指定列中非NULL值的個數
    MIN(col)返回指定列的最小值
    MAX(col)返回指定列的最大值
    SUM(col)返回指定列的所有值之和
    GROUP_CONCAT(col) 返回由屬於一組的列值連接組合而成的結果    
    
三、字符串函數

    CHAR_LENGTH(str)
        返回值為字符串str 的長度,長度的單位為字符。一個多字節字符算作一個單字符。
    CONCAT(str1,str2,...)
        字符串拼接
        如有任何一個參數為NULL ,則返回值為 NULL。
    CONCAT_WS(separator,str1,str2,...)
        字符串拼接(自定義連接符)
        CONCAT_WS()不會忽略任何空字符串。 (然而會忽略所有的 NULL)。

    FORMAT(X,D)
        將數字X 的格式寫為'#,###,###.##',以四舍五入的方式保留小數點后 D 位, 並將結果以字符串的形式返回。若  D 為 0, 則返回結果不帶有小數點,或不含小數部分。
        例如:
            SELECT FORMAT(12332.1,4); 結果為: '12,332.1000'
    
    INSERT(str,pos,len,newstr)
        在str的指定位置插入字符串
            pos:要替換位置其實位置
            len:替換的長度
            newstr:新字符串
        例如:
            SELECT INSERT('abcd',1,2,'tt'); 結果為: 'ttcd'
            SELECT INSERT('abcd',1,4,'tt'); 結果為: 'tt'
        特別的:
            如果pos超過原字符串長度,則返回原字符串
            如果len超過原字符串長度,則由新字符串完全替換
    
    INSTR(str,substr)
        返回字符串 str 中子字符串的第一個出現位置。

    LEFT(str,len)
        返回字符串str 從開始的len位置的子序列字符。
        例如:
            SELECT INSTR('abc','c'); 結果為: 3
            SELECT INSTR('abc','d'); 結果為: 0
            
    LOWER(str)
        變小寫

    UPPER(str)
        變大寫
   
    REVERSE(str)
        返回字符串 str ,順序和字符順序相反。
        例如:
            SELECT REVERSE('1234567') 結果為:7654321
            
    SUBSTRING(str,pos) , SUBSTRING(str FROM pos) SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len)
        不帶有len 參數的格式從字符串str返回一個子字符串,起始於位置 pos。帶有len參數的格式從字符串str返回一個長度同len字符相同的子字符串,起始於位置 pos。 使用 FROM的格式為標准 SQL 語法。也可能對pos使用一個負值。假若這樣,則子字符串的位置起始於字符串結尾的pos 字符,而不是字符串的開頭位置。在以下格式的函數中可以對pos 使用一個負值。

        mysql> SELECT SUBSTRING('Quadratically',5); -- 從第5位開始截取
            -> 'ratically'

        mysql> SELECT SUBSTRING('foobarbar' FROM 4); -- 從第4位開始截取
            -> 'barbar'

        mysql> SELECT SUBSTRING('Quadratically',5,6); --從第5位開始截取,截取6個長度
            -> 'ratica'

        mysql> SELECT SUBSTRING('Sakila', -3);    -- 從倒數第3位開始截取
            -> 'ila'

        mysql> SELECT SUBSTRING('Sakila', -5, 3); -- 從倒數第5位開始截取,截取3個長度
            -> 'aki'
            
四、日期和時間函數
    CURDATE()或CURRENT_DATE() 返回當前的日期
    CURTIME()或CURRENT_TIME() 返回當前的時間
    DAYOFWEEK(date)   返回date所代表的一星期中的第幾天(1~7)
    DAYOFMONTH(date)  返回date是一個月的第幾天(1~31)
    DAYOFYEAR(date)   返回date是一年的第幾天(1~366)
    DAYNAME(date)   返回date的星期名,如:SELECT DAYNAME(CURRENT_DATE);
    FROM_UNIXTIME(ts,fmt)  根據指定的fmt格式,格式化UNIX時間戳ts
    HOUR(time)   返回time的小時值(0~23)
    MINUTE(time)   返回time的分鍾值(0~59)
    MONTH(date)   返回date的月份值(1~12)
    MONTHNAME(date)   返回date的月份名,如:SELECT MONTHNAME(CURRENT_DATE);
    NOW()    返回當前的日期和時間
    QUARTER(date)   返回date在一年中的季度(1~4),如SELECT QUARTER(CURRENT_DATE);
    WEEK(date)   返回日期date為一年中第幾周(0~53)
    YEAR(date)   返回日期date的年份(1000~9999)
    
    重點:
    DATE_FORMAT(date,format) 根據format字符串格式化date值

       mysql> SELECT DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y');
        -> 'Sunday October 2009'
       mysql> SELECT DATE_FORMAT('2007-10-04 22:23:00', '%H:%i:%s');
        -> '22:23:00'
       mysql> SELECT DATE_FORMAT('1900-10-04 22:23:00',
        ->                 '%D %y %a %d %m %b %j');
        -> '4th 00 Thu 04 10 Oct 277'
       mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00',
        ->                 '%H %k %I %r %T %S %w');
        -> '22 22 10 10:23:00 PM 22:23:00 00 6'
       mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V');
        -> '1998 52'
       mysql> SELECT DATE_FORMAT('2006-06-00', '%d');
        -> '00'
        
五、加密函數
    MD5()    
        計算字符串str的MD5校驗和
        例如:
            SELECT MD5('1234') 結果為:81dc9bdb52d04dc20036dbd8313ed055
    PASSWORD(str)   
        返回字符串str的加密版本,這個加密過程是不可逆轉的
        例如:
            SELECT PASSWORD('1234') 結果為:*A4B6157319038724E3560894F7F932C8886EBFCF
        
六、控制流函數            
    CASE WHEN[test1] THEN [result1]...ELSE [default] END
        如果testN是真,則返回resultN,否則返回default
    CASE [test] WHEN[val1] THEN [result]...ELSE [default]END  
        如果test和valN相等,則返回resultN,否則返回default

    IF(test,t,f)   
        如果test是真,返回t;否則返回f

    IFNULL(arg1,arg2) 
        如果arg1不是空,返回arg1,否則返回arg2
        例如:
            SELECT IFNULL('bbb','abc'); 結果為: bbb
            SELECT IFNULL(null,'abc');  結果為: abc

    NULLIF(arg1,arg2) 
        如果arg1=arg2返回NULL;否則返回arg1
        例如:
            SELECT NULLIF('bbb','bbb');結果為: null
            SELECT NULLIF('aaa','bbb');結果為: aaa
mysql的內建函數

 

 

1、自定義函數

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

2.調用自定義函數

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

3.刪除自定義函數

1
DROP FUNCTION fun_name;

 4.函數與存儲過程的區別:

 

5.事物處理

 一、 什么是事務

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

二、為什么出現這種技術

  為什么要使用事務這個技術呢? 現在的很多軟件都是多用戶,多程序,多線程的,對同一個表可能同時有很多人在用,為保持數據的一致性,所以提出了事務的概念。這樣很抽象,舉個例子: 

A 給B 要划錢,A 的賬戶-1000元, B 的賬戶就要+1000元,這兩個update 語句必須作為一個整體來執行,不然A 扣錢了,B 沒有加錢這種情況很難處理。

三、事物的特性 

  80年代中國人結婚四大件:手表、自行車、縫紉機、收音機(三轉一響)。要把事務娶回家同樣需要四大件,所以事務很刻薄(ACID),四大件清單:原子性(Atom)、一致性(Consistent)、隔離性(Isolate)、持久性(Durable)。ACID就是數據庫事務正確執行的四個特性的縮寫。

  • 原子性:要么不談,要談就要結婚!

    對於其數據修改,要么全都執行,要么全都不執行。

  • 一致性:戀愛時,什么方式愛我;結婚后還得什么方式愛我;

    數據庫原來有什么樣的約束,事務執行之后還需要存在這樣的約束,所有規則都必須應用於事務的修改,以保持所有數據的完整性。

  • 隔離性:鬧完洞房后,是倆人的私事。

    一個事務不能知道另外一個事務的執行情況(中間狀態)

  • 持久性:一旦領了結婚證,無法后悔。

    即使出現致命的系統故障也將一直保持。不要告訴我系統說commit成功了,回頭電話告訴我,服務器機房斷電了,我的事務涉及到的數據修改可能沒有進入數據庫。

另外需要注意:

  • 在 MySQL 中只有使用了 Innodb 數據庫引擎的數據庫或表才支持事務。
  • 事務處理可以用來維護數據庫的完整性,保證成批的 SQL 語句要么全部執行,要么全部不執行。
  • 事務用來管理 insert,update,delete 語句
四、事務控制語句:
  • BEGIN 或 START TRANSACTION;顯式地開啟一個事務;

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

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

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

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

五、例子: 魯班轉賬給后羿

1.創建表 

1
2
3
4
5
create table account(
     id int (50) not null auto_increment primary key ,
     name VARCHAR (50) not null ,
     money DOUBLE (10,2) not NULL
);

2.插入數據

1
insert into account (id, name ,money) values (1, '魯班' ,250),(2, '后羿' ,5000);

3.執行轉賬

1
2
3
4
5
6
7
8
9
10
start transaction ; -- 開啟事物
  --  執行sql語句操作
  update account set money = money - 500 where id =1;  
  update account set money = money+500 where id = 2;
 
commit -- 手動提交事物
rollback ; -- 回滾事物
 
--  查看結果
select * from account;

 4.保存點使用

1
2
3
4
5
6
7
8
9
START TRANSACTION ;
 
insert into account ( name ,money) values ( '李元芳' ,1000);
 
SAVEPOINT s1; -- 設置保存點
 
insert into account ( name ,money) values ( '張桂枝' ,1500);
 
ROLLBACK to s1; -- 事物回滾到保存點<br>COMMIT; --提交事物

 

 

6.數據鎖

需求: 有一個賬戶,兩個人在同一時間要對此賬戶操作,A要對賬戶充值100塊,B要從賬戶中取出100塊.操作前都要先看一下賬戶的 余額然后再操作.

-- 窗口1 用戶進行充值

-- 充值前 先查看余額
set @m=0;

SELECT money into @m from account where id = 1;

select @m;

-- 看到余額后 充值100 塊
update account set money = @m + 100 where id = 1;

SELECT * from account;

--------------------------------------------------------------
-- 窗口2 用戶進行取款

-- 取款前 先查看余額
set @m=0;

SELECT money into @m from account where id = 1;

select @m;

-- 看到余額后 取款100 塊
update account set money = @m - 100 where id = 1;

SELECT * from account;
示例

 

1. 鎖的基本概念

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

2. 鎖的基本類型

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

  2.1 共享鎖(Shared Lock,也叫S鎖)

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

  2.2 排他鎖(Exclusive Lock,也叫X)

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

 

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

  3.1悲觀鎖 顧名思義,就是很悲觀,每次去拿數據的時候都認為別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會block(阻塞)直到它拿到鎖。傳統的關系型數據庫里邊就用到了很多這種鎖機制.

注意:要使用悲觀鎖,我們必須關閉mysql數據庫的自動提交屬性.因為MySQL默認使用autocommit模式,也就是說,當你執行一個更新操作后,MySQL會立刻將結果進行提交。關閉自動提交命令為:set autocommit=0;

設置完autocommit后,我們就可以執行我們的正常業務了。具體如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- 0.開始事務
start transaction ;
 
-- 1.查詢賬戶余額
set @m = 0; -- 賬戶余額
select money into @m from account where id = 1 for update ;
select @m;
 
-- 2.修改賬戶余額
update account set money = @m -100 where id = 1;
 
select * FROM account where id = 1;
-- 3. 提交事務
commit ;

在另外的查詢頁面執行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- 0.開始事務
start transaction ;
 
-- 1.查詢賬戶余額
set @m = 0; -- 賬戶余額
select money into @m from account where id = 1 for update ;
select @m;
 
-- 2.修改賬戶余額
update account set money = @m +100 where id = 1;
 
select * FROM account where id = 1;
-- 3. 提交事務
commit ;

會發現當前查詢會進入到等待狀態,不會顯示出數據,當上面的sql執行完畢提交事物后,當前sql才會顯示結果.

注意1:在使用悲觀鎖時,如果表中沒有指定主鍵,則會進行鎖表操作.

注意2: 悲觀鎖的確保了數據的安全性,在數據被操作的時候鎖定數據不被訪問,但是這樣會帶來很大的性能問題。因此悲觀鎖在實際開發中使用是相對比較少的。  

   3.2 樂觀鎖, 顧名思義,就是很樂觀,每次去拿數據的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可以使用版本號等機制。 

使用樂觀鎖的兩種方式:

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

 代碼示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
-- 1.查詢賬戶余額
set @m = 0; -- 賬戶余額
select money into @m from account where id = 1 ;
select @m;
-- 2.查詢版本號
set @version = 0; -- 版本號
select version into @version from account where id = 1 ;
select @version;
 
-- 3.修改賬戶余額
update account set money = @m -100,version=version+1 where id = 1 and version = @version;
 
select * FROM account where id = 1;

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

 

悲觀鎖與樂觀鎖的優缺點:

  兩種鎖各有其有點缺點,不能單純的講哪個更好.

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

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

 7.數據庫備份

  mysqldump 命令將數據庫中的數據備份成一個文本文件。表的結構和表中的數據將存儲在生成的文本文件中。

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

1.使用mysqldump實現邏輯備份

1
2
3
4
5
6
7
8
9
10
11
12
13
#語法:
# 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
--all-databases  , -A
導出全部數據庫。
mysqldump  -uroot -p --all-databases
--all-tablespaces  , -Y
導出全部表空間。
mysqldump  -uroot -p --all-databases --all-tablespaces
--no-tablespaces  , -y
不導出任何表空間信息。
mysqldump  -uroot -p --all-databases --no-tablespaces
--add-drop-database
每個數據庫創建之前添加drop數據庫語句。
mysqldump  -uroot -p --all-databases --add-drop-database
--add-drop-table
每個數據表創建之前添加drop數據表語句。(默認為打開狀態,使用--skip-add-drop-table取消選項)
mysqldump  -uroot -p --all-databases  (默認添加drop語句)
mysqldump  -uroot -p --all-databases –skip-add-drop-table  (取消drop語句)
--add-locks
在每個表導出之前增加LOCK TABLES並且之后UNLOCK  TABLE。(默認為打開狀態,使用--skip-add-locks取消選項)
mysqldump  -uroot -p --all-databases  (默認添加LOCK語句)
mysqldump  -uroot -p --all-databases –skip-add-locks   (取消LOCK語句)
--allow-keywords
允許創建是關鍵詞的列名字。這由表名前綴於每個列名做到。
mysqldump  -uroot -p --all-databases --allow-keywords
--apply-slave-statements'CHANGE MASTER'前添加'STOP SLAVE',並且在導出的最后添加'START SLAVE'。
mysqldump  -uroot -p --all-databases --apply-slave-statements
--character-sets-dir
字符集文件的目錄
mysqldump  -uroot -p --all-databases  --character-sets-dir=/usr/local/mysql/share/mysql/charsets
--comments
附加注釋信息。默認為打開,可以用--skip-comments取消
mysqldump  -uroot -p --all-databases  (默認記錄注釋)
mysqldump  -uroot -p --all-databases --skip-comments   (取消注釋)
--compatible
導出的數據將和其它數據庫或舊版本的MySQL 相兼容。值可以為ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options等,
要使用幾個值,用逗號將它們隔開。它並不保證能完全兼容,而是盡量兼容。
mysqldump  -uroot -p --all-databases --compatible=ansi
--compact
導出更少的輸出信息(用於調試)。去掉注釋和頭尾等結構。可以使用選項:--skip-add-drop-table  --skip-add-locks --skip-comments --skip-disable-keys
mysqldump  -uroot -p --all-databases --compact
--complete-insert,  -c
使用完整的insert語句(包含列名稱)。這么做能提高插入效率,但是可能會受到max_allowed_packet參數的影響而導致插入失敗。
mysqldump  -uroot -p --all-databases --complete-insert
--compress, -C
在客戶端和服務器之間啟用壓縮傳遞所有信息
mysqldump  -uroot -p --all-databases --compress
--create-options,  -a
在CREATE TABLE語句中包括所有MySQL特性選項。(默認為打開狀態)
mysqldump  -uroot -p --all-databases
--databases,  -B
導出幾個數據庫。參數后面所有名字參量都被看作數據庫名。
mysqldump  -uroot -p --databases test mysql
--debug
輸出debug信息,用於調試。默認值為:d:t,/tmp/mysqldump.trace
mysqldump  -uroot -p --all-databases --debug
mysqldump  -uroot -p --all-databases --debug=” d:t,/tmp/debug.trace”
--debug-check
檢查內存和打開文件使用說明並退出。
mysqldump  -uroot -p --all-databases --debug-check
--debug-info
輸出調試信息並退出
mysqldump  -uroot -p --all-databases --debug-info
--default-character-set
設置默認字符集,默認值為utf8
mysqldump  -uroot -p --all-databases --default-character-set=utf8
--delayed-insert
采用延時插入方式(INSERT DELAYED)導出數據
mysqldump  -uroot -p --all-databases --delayed-insert
--delete-master-logs
master備份后刪除日志. 這個參數將自動激活--master-data。
mysqldump  -uroot -p --all-databases --delete-master-logs
--disable-keys
對於每個表,用/*!40000 ALTER TABLE tbl_name DISABLE KEYS */;和/*!40000 ALTER TABLE tbl_name ENABLE KEYS */;語句引用INSERT語句。這樣可以更快地導入dump出來的文件,因為它是在插入所有行后創建索引的。該選項只適合MyISAM表,默認為打開狀態。
mysqldump  -uroot -p --all-databases 
--dump-slave
該選項將主的binlog位置和文件名追加到導出數據的文件中(show slave status)。設置為1時,將會以CHANGE MASTER命令輸出到數據文件;設置為2時,會在change前加上注釋。該選項將會打開--lock-all-tables,除非--single-transaction被指定。該選項會自動關閉--lock-tables選項。默認值為0。
mysqldump  -uroot -p --all-databases --dump-slave=1
mysqldump  -uroot -p --all-databases --dump-slave=2
--master-data
該選項將當前服務器的binlog的位置和文件名追加到輸出文件中(show master status)。如果為1,將會輸出CHANGE MASTER 命令;如果為2,輸出的CHANGE  MASTER命令前添加注釋信息。該選項將打開--lock-all-tables 選項,除非--single-transaction也被指定(在這種情況下,全局讀鎖在開始導出時獲得很短的時間;其他內容參考下面的--single-transaction選項)。該選項自動關閉--lock-tables選項。
mysqldump  -uroot -p --host=localhost --all-databases --master-data=1;
mysqldump  -uroot -p --host=localhost --all-databases --master-data=2;
--events, -E
導出事件。
mysqldump  -uroot -p --all-databases --events
--extended-insert,  -e
使用具有多個VALUES列的INSERT語法。這樣使導出文件更小,並加速導入時的速度。默認為打開狀態,使用--skip-extended-insert取消選項。
mysqldump  -uroot -p --all-databases
mysqldump  -uroot -p --all-databases--skip-extended-insert   (取消選項)
--fields-terminated-by
導出文件中忽略給定字段。與--tab選項一起使用,不能用於--databases和--all-databases選項
mysqldump  -uroot -p test test --tab=”/home/mysql” --fields-terminated-by=”#”
--fields-enclosed-by
輸出文件中的各個字段用給定字符包裹。與--tab選項一起使用,不能用於--databases和--all-databases選項
mysqldump  -uroot -p test test --tab=”/home/mysql” --fields-enclosed-by=”#”
--fields-optionally-enclosed-by
輸出文件中的各個字段用給定字符選擇性包裹。與--tab選項一起使用,不能用於--databases和--all-databases選項
mysqldump  -uroot -p test test --tab=”/home/mysql”  --fields-enclosed-by=”#” --fields-optionally-enclosed-by  =”#”
--fields-escaped-by
輸出文件中的各個字段忽略給定字符。與--tab選項一起使用,不能用於--databases和--all-databases選項
mysqldump  -uroot -p mysql user --tab=”/home/mysql” --fields-escaped-by=”#”
--flush-logs
開始導出之前刷新日志。
請注意:假如一次導出多個數據庫(使用選項--databases或者--all-databases),將會逐個數據庫刷新日志。除使用--lock-all-tables或者--master-data外。在這種情況下,日志將會被刷新一次,相應的所以表同時被鎖定。因此,如果打算同時導出和刷新日志應該使用--lock-all-tables 或者--master-data 和--flush-logs。
mysqldump  -uroot -p --all-databases --flush-logs
--flush-privileges
在導出mysql數據庫之后,發出一條FLUSH  PRIVILEGES 語句。為了正確恢復,該選項應該用於導出mysql數據庫和依賴mysql數據庫數據的任何時候。
mysqldump  -uroot -p --all-databases --flush-privileges
--force
在導出過程中忽略出現的SQL錯誤。
mysqldump  -uroot -p --all-databases --force
--help
顯示幫助信息並退出。
mysqldump  --help
--hex-blob
使用十六進制格式導出二進制字符串字段。如果有二進制數據就必須使用該選項。影響到的字段類型有BINARY、VARBINARY、BLOB。
mysqldump  -uroot -p --all-databases --hex-blob
--host, -h
需要導出的主機信息
mysqldump  -uroot -p --host=localhost --all-databases
--ignore-table
不導出指定表。指定忽略多個表時,需要重復多次,每次一個表。每個表必須同時指定數據庫和表名。例如:--ignore-table=database.table1 --ignore-table=database.table2 ……
mysqldump  -uroot -p --host=localhost --all-databases --ignore-table=mysql.user
--include-master-host-port--dump-slave產生的'CHANGE  MASTER TO..'語句中增加'MASTER_HOST=<host>,MASTER_PORT=<port>'  
mysqldump  -uroot -p --host=localhost --all-databases --include-master-host-port
--insert-ignore
在插入行時使用INSERT IGNORE語句.
mysqldump  -uroot -p --host=localhost --all-databases --insert-ignore
--lines-terminated-by
輸出文件的每行用給定字符串划分。與--tab選項一起使用,不能用於--databases和--all-databases選項。
mysqldump  -uroot -p --host=localhost test test --tab=”/tmp/mysql”  --lines-terminated-by=”##”
--lock-all-tables,  -x
提交請求鎖定所有數據庫中的所有表,以保證數據的一致性。這是一個全局讀鎖,並且自動關閉--single-transaction 和--lock-tables 選項。
mysqldump  -uroot -p --host=localhost --all-databases --lock-all-tables
--lock-tables,  -l
開始導出前,鎖定所有表。用READ  LOCAL鎖定表以允許MyISAM表並行插入。對於支持事務的表例如InnoDB和BDB,--single-transaction是一個更好的選擇,因為它根本不需要鎖定表。
請注意當導出多個數據庫時,--lock-tables分別為每個數據庫鎖定表。因此,該選項不能保證導出文件中的表在數據庫之間的邏輯一致性。不同數據庫表的導出狀態可以完全不同。
mysqldump  -uroot -p --host=localhost --all-databases --lock-tables
--log-error
附加警告和錯誤信息到給定文件
mysqldump  -uroot -p --host=localhost --all-databases  --log-error=/tmp/mysqldump_error_log.err
--max_allowed_packet
服務器發送和接受的最大包長度。
mysqldump  -uroot -p --host=localhost --all-databases --max_allowed_packet=10240
--net_buffer_length
TCP/IP和socket連接的緩存大小。
mysqldump  -uroot -p --host=localhost --all-databases --net_buffer_length=1024
--no-autocommit
使用autocommit/commit 語句包裹表。
mysqldump  -uroot -p --host=localhost --all-databases --no-autocommit
--no-create-db,  -n
只導出數據,而不添加CREATE DATABASE 語句。
mysqldump  -uroot -p --host=localhost --all-databases --no-create-db
--no-create-info,  -t
只導出數據,而不添加CREATE TABLE 語句。
mysqldump  -uroot -p --host=localhost --all-databases --no-create-info
--no-data, -d
不導出任何數據,只導出數據庫表結構。
mysqldump  -uroot -p --host=localhost --all-databases --no-data
--no-set-names,  -N
等同於--skip-set-charset
mysqldump  -uroot -p --host=localhost --all-databases --no-set-names
--opt
等同於--add-drop-table,  --add-locks, --create-options, --quick, --extended-insert, --lock-tables,  --set-charset, --disable-keys 該選項默認開啟,  可以用--skip-opt禁用.
mysqldump  -uroot -p --host=localhost --all-databases --opt
--order-by-primary
如果存在主鍵,或者第一個唯一鍵,對每個表的記錄進行排序。在導出MyISAM表到InnoDB表時有效,但會使得導出工作花費很長時間。 
mysqldump  -uroot -p --host=localhost --all-databases --order-by-primary
--password, -p
連接數據庫密碼
--pipe(windows系統可用)
使用命名管道連接mysql
mysqldump  -uroot -p --host=localhost --all-databases --pipe
--port, -P
連接數據庫端口號
--protocol
使用的連接協議,包括:tcp, socket, pipe, memory.
mysqldump  -uroot -p --host=localhost --all-databases --protocol=tcp
--quick, -q
不緩沖查詢,直接導出到標准輸出。默認為打開狀態,使用--skip-quick取消該選項。
mysqldump  -uroot -p --host=localhost --all-databases 
mysqldump  -uroot -p --host=localhost --all-databases --skip-quick
--quote-names,-Q
使用(`)引起表和列名。默認為打開狀態,使用--skip-quote-names取消該選項。
mysqldump  -uroot -p --host=localhost --all-databases
mysqldump  -uroot -p --host=localhost --all-databases --skip-quote-names
--replace
使用REPLACE INTO 取代INSERT INTO.
mysqldump  -uroot -p --host=localhost --all-databases --replace
--result-file,  -r
直接輸出到指定文件中。該選項應該用在使用回車換行對(\\r\\n)換行的系統上(例如:DOS,Windows)。該選項確保只有一行被使用。
mysqldump  -uroot -p --host=localhost --all-databases --result-file=/tmp/mysqldump_result_file.txt
--routines, -R
導出存儲過程以及自定義函數。
mysqldump  -uroot -p --host=localhost --all-databases --routines
--set-charset
添加'SET NAMES  default_character_set'到輸出文件。默認為打開狀態,使用--skip-set-charset關閉選項。
mysqldump  -uroot -p --host=localhost --all-databases 
mysqldump  -uroot -p --host=localhost --all-databases --skip-set-charset
--single-transaction
該選項在導出數據之前提交一個BEGIN SQL語句,BEGIN 不會阻塞任何應用程序且能保證導出時數據庫的一致性狀態。它只適用於多版本存儲引擎,僅InnoDB。本選項和--lock-tables 選項是互斥的,因為LOCK  TABLES 會使任何掛起的事務隱含提交。要想導出大表的話,應結合使用--quick 選項。
mysqldump  -uroot -p --host=localhost --all-databases --single-transaction
--dump-date
將導出時間添加到輸出文件中。默認為打開狀態,使用--skip-dump-date關閉選項。
mysqldump  -uroot -p --host=localhost --all-databases
mysqldump  -uroot -p --host=localhost --all-databases --skip-dump-date
--skip-opt
禁用–opt選項.
mysqldump  -uroot -p --host=localhost --all-databases --skip-opt
--socket,-S
指定連接mysql的socket文件位置,默認路徑/tmp/mysql.sock
mysqldump  -uroot -p --host=localhost --all-databases --socket=/tmp/mysqld.sock
--tab,-T
為每個表在給定路徑創建tab分割的文本文件。注意:僅僅用於mysqldump和mysqld服務器運行在相同機器上。注意使用--tab不能指定--databases參數
mysqldump  -uroot -p --host=localhost test test --tab="/home/mysql"
--tables
覆蓋--databases (-B)參數,指定需要導出的表名,在后面的版本會使用table取代tables。
mysqldump  -uroot -p --host=localhost --databases test --tables test
--triggers
導出觸發器。該選項默認啟用,用--skip-triggers禁用它。
mysqldump  -uroot -p --host=localhost --all-databases --triggers
--tz-utc
在導出頂部設置時區TIME_ZONE='+00:00' ,以保證在不同時區導出的TIMESTAMP 數據或者數據被移動其他時區時的正確性。
mysqldump  -uroot -p --host=localhost --all-databases --tz-utc
--user, -u
指定連接的用戶名。
--verbose, --v
輸出多種平台信息。
--version, -V
輸出mysqldump版本信息並退出
--where, -w
只轉儲給定的WHERE條件選擇的記錄。請注意如果條件包含命令解釋符專用空格或字符,一定要將條件引用起來。
mysqldump  -uroot -p --host=localhost --all-databases --where=” user=’root’”
--xml, -X
導出XML格式.
mysqldump  -uroot -p --host=localhost --all-databases --xml
--plugin_dir
客戶端插件的目錄,用於兼容不同的插件版本。
mysqldump  -uroot -p --host=localhost --all-databases --plugin_dir=”/usr/local/lib/plugin”
--default_auth
客戶端插件默認使用權限。
mysqldump  -uroot -p --host=localhost --all-databases --default-auth=”/usr/local/lib/plugin/<PLUGIN>”
參數說明
解決辦法是:

1. 刪除my.ini [client]下的 no-beep 參數;
2. 在 mysqldump 后加--no-defaults參數,即:mysqldump --no-defualts -h主機IP -u用戶名 -p密碼 數據庫 > xxx.sql 。

 

 

2.恢復邏輯備份 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM