學習內容:
1.數據庫的重要數據備份...
2.什么時候需要使用到數據庫備份..
3.如何恢復備份的數據..
1.備份:
說到備份,相比大家都不應該陌生,比如說我們平時在為我們的電腦重新做系統的時候,那么我們保存在電腦里的重要文件我們都需要進行備份..或者是當我們在使用一鍵還原系統的時候,我們也需要進行備份..那么數據庫也不例外,我們需要對數據庫里面保存的重要數據進行備份..比如說一個大型的企業,那么必然會有自己的一個大型數據庫,那么數據庫管理員必然會將自己企業的數據庫進行備份,一旦數據庫的數據丟失,那么管理員可以將數據恢復到當時備份時的狀態,以至於企業不會有任何的損失...
i.使用mysqldump進行數據庫備份...
mysqldump -u root -h localhost -p samp_db >d:\samp_db_2015.sql 解釋一下這個語句:mysqldump關鍵字.. -u表示user,就是用戶.... -h表示host,登陸用戶的主機名稱 -p表示password,登陸時的密碼,這里localhost表示的是我們本機,還可以使用ip地址,比如說127.0.0.1也是可以的... samp_db表示我們要備份的數據庫為samp_db... >.....表示要保存的位置... -- MySQL dump 10.13 Distrib 5.1.73, for Win64 (unknown) //這一行表示了我們使用mysqldump工具的版本號 -- -- Host: 127.0.0.1 Database: samp_db //主機信息和數據庫備份的名稱... -- ------------------------------------------------------ -- Server version 5.1.73-community //mysql服務器的版本號 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; //這里表示的是將一些系統變量賦給臨時變量..以確保恢復數據的時候恢復系統變量,那么恢復系統變量的語句呢?在最后面...*/; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; DROP TABLE IF EXISTS `c_count`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `c_count` ( //這里表示的是我建立的表格,包含着表的基本信息.... `id` int(11) NOT NULL, `num` int(11) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=gbk; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `c_count` //這里代表注釋部分mysql數據庫的注釋部分使用 --符號.. -- /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; //這是就是恢復我們保存的系統變量的值.... /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; -- Dump completed on 2015-05-11 19:41:23
我這里截取的內容不全,因為我建的數據庫表格信息太多..如果全截下來估計得很長...想必大家也沒心情看...所以就簡單的截了部分內容...
這里面包含着drop,insert,create等語句...我稍微的解釋一下上面的含義.....看上表。。。
注:
1./*!.....*/部分表示的是可執行的mysql注釋語句,這些語句只能在mysql中執行...在其他類型的數據庫將被認定為注釋內容,並且不會被執行,這里體現了數據庫的可移植性...
2./*!40101...*/這個40101表示的是這段語句在mysql的4.01.01版本或者比這個更高的版本的條件下才能被執行....
ii.mysqldump實現對部分表的備份...
mysqldump -u root -h localhost -p samp_db shop >d:\samp_db_shop_2015.sql;
這個和上面基本差不多,就是在數據庫的后面多追加了某個表格...如果是多個表格的話,我們可以使用空格來進行分隔...
iii.mysqldump備份全部或者多個數據庫...
mysqldump -u root -h localhost -p --databases samp_db mysql >d:\databases_2015.sql //備份多個數據庫,加 --databases mysqldump -u root -h localhost -p --all-databases >d:\all_databases_2015.sql; //備份全部的數據庫,加 --all-databases
備份的內容也基本和第一個截取的一樣...只是能多了一點東西,由於是多個數據庫的備份,那么備份的內容將會指明哪一個數據庫是samp_db,哪一個是mysql。。。多個數據庫之間我們用空格分隔...
2.物理備份...
簡單的介紹一下物理備份的內容...
i.直接對數據庫的存儲目錄進行復制...這一般屬於一種簡答,快速,有效的備份方式。。。但是這種備份方式還是有缺點的..它無法對innodb存儲引擎下的數據進行備份...並且還原的時候最好是還原到相同版本,不同版本可能會導致不兼容...
ii.另一種方式是使用mysqlhotcopy進行備份...mysqlhotcopy是在perl腳本下才能夠運行的...這個被成為快速備份,並且只能備份myisam存儲引擎下的表這個我沒有進行過多的研究,所以就不班門弄斧了...
-------------------------------------------------------------------——————————————————————————
2.數據恢復<==>還原
還原就是我們所說的數據恢復,我們之所以要備份數據庫,不就是為了當數據庫出現問題的時候,我們把備份數據進行還原的嗎。。。所以有了備份,那么自然也要有還原...
i.使用mysql語句指令進行還原...
mysql -u user -p [dbname]<filename.sql //基本語法
這個在上面備份數據庫的時候,對各個部分都有了一個講解,所以這里不一個一個部分進行講解了,只是在恢復的時候變成了 < 號了 .....
mysql -u root -h localhost -p samp_db < d:\samp_db_2015.sql; //還原我們備份的數據庫信息....
注意:執行上面這條命令的時候我們必須要把數據庫建好,否則會導致錯誤的發生....
還有我們可以在登陸到了數據庫以后使用source語句進行數據庫恢復....
mysql> use samp_db; Database Changed mysql>source d:\samp_db_2015.sql; //使用source還原數據庫里的數據信息
ii.物理還原...
1.第一種就是我們在備份的時候直接對數據庫的存儲目錄進行了復制,那么當還原的時候我們只需要把我們復制的東西重新拷貝到我們的存儲目錄下就可以直接完成了數據庫的還原...
說白了就是假如我們有一個數據庫samp_db,里面有一些重要的數據信息,重要的數據信息在存儲目錄下一定是按文件進行存儲的,我們把這些文件直接剪切,放置到一個文件夾中保存。。那么這樣做,就代表samp_db數據庫里的重要數據丟失了,然后我們把我們那個文件夾里的數據重新拷貝到samp_db文件夾中,這樣就代表重要數據還原回來了...
注意:這種方法只能還原在同一版本下的數據庫,並且只對myisam存儲引擎有效,對innodb存儲引擎無效...
2.mysqlhotcopy快速恢復...
這種我也沒有進行深入的研究,因此不進行班門弄斧....
注意:如果需要恢復的數據庫已經存在,則在使用DROP語句刪除已經存在的數據庫之后,恢復才能成功。另外mysql不同版本之間必須兼容,恢復之后的數據才可以使用!!
-----------———————————————————————————————————————————————————————
3.數據庫遷移.
數據庫的遷移:數據庫的遷移一般由數據庫管理員來搞定...在這里也簡單的說一下....
遷移的一般原因:
1、需要安裝新的數據庫服務器
2、mysql版本更新
3、數據庫管理系統變更(從SQLSERVER遷移到mysql)...
i.相同版本的數據庫遷移:
相同版本的數據庫遷移就是主版本號相同的數據庫直接進行數據庫移動...常用的方法就是使用mysqldump導出數據,然后在目標數據庫使用mysql進行導入
mysqldump -h www.clearlove.com -u root -p database_name | mysql -h www.nuoyan.com -u root -p
mysqldump導入的數據直接通過管道符|,將www.clearlove.com上的數據庫導入到www.nuoyan.com服務器上,database_name為數據庫名...如果想導出全部的數據庫則使用--all -databases參數...
ii.不同版本的mysql數據庫的遷移:
因為數據庫升級,需要將舊版本mysql數據庫中的數據遷移到新版本數據庫中。mysql服務器升級,需要先停止服務,然后卸載舊版本,並安裝新版本的mysql.如果想保留舊版本中的用戶訪問控制信息,則需要備份mysql的mysql庫,在新版本mysql安裝完成后,重新讀入mysql備份文件中的信息,舊版本和新版本的mysql可能使用不同的默認字符集,例如mysql.4.x中大多數使用latin1作為默認字符集,而mysql5.x的默認字符集為utf8。如果數據庫中有中文數據,遷移過程中需要對默認字符集進行修改,不然可能無法正常顯示結果。。。
新版本對舊版本有一定兼容性。從舊版本的mysql向新版本mysql遷移時,對於myisam引擎的表,可以直接復制數據庫文件,
也可以用mysqlhotcopy工具、mysqldump工具。
對於innodb引擎的表一般只能使用mysqldump將數據導出。然后使用mysql命令導入目標服務器。
從新版本向舊版本mysql遷移數據時要小心,最好使用mysqldump命令導出,然后導入目標數據庫中。
iii.不同數據庫之間的遷移...
這種情況也是經常會有的,比如說將mysql遷移到oracle。。。這種遷移方式我們首先要比較兩者之間的差異,不同的數據庫在定義數據類型時的形式可能是不同的...比如說mysql中日期字段分為date和time兩種,而oracle只有date一種...
-------------------------------------------------------------------------------------------------------------------------
4.導入和導出
導入:
在mysql中,當我們插入數據的時候,我們沒必要一條條的輸入sql語句來進行插入,我們還可以建立一個文本文件,然后將我們建立的文本文件的內容導入到數據庫當中就可以了....
基本語法: LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt' //這句話表示的是載入 file_name.txt文件, low_priority參數表示的是當沒有人訪問數據表格時,在進行插入... local表示的是導入本地文件,並且必須要有完整的文件位置....
[REPLACE | IGNORE] //表示參數控制對現有表的唯一鍵記錄重復的處理。就是比如說文件內插入了重復數據,我們應該如何處理.. replace表示使用新的一行去代替....ignore表示直接跳過....
上面這個語句必須要進行指定,否則一旦出現重復就會導致錯誤的發生,並且后續的數據將不會被導入...
INTO TABLE tbl_name [FIELDS [TERMINATED BY 'string'] //表示字段之間使用某個指定的字符或者字符串進行分隔 [[OPTIONALLY] ENCLOSED BY 'char'] //表示每個字段使用指定的字符包起來 [ESCAPED BY 'char' ] //表示將默認的轉義字符改變為某個指定的字符 ] [LINES [STARTING BY 'string'] //表示每行開頭的字符,可以是一個或者多個 [TERMINATED BY 'string'] //表示每一行結束以某個指定字符結尾,一般都是\r\n...表示每一行結束都換行... ] [IGNORE number LINES] //表示忽略開始處的行數,number為忽略數 [(col_name_or_user_var,...)] [SET col_name = expr,...]]
load data infile 'd:\data.txt' into samp_db.shop; select * from shop;
將文件導入到smap_db數據庫shop表格...
2.使用mysqlimport進行導入...
mysqlimport是一個獨立的exe應用程序...和load data infile基本差不多...
基本語法: mysqlimport -u root -p dbname filename.txt [OPTIONS] --[OPTIONS] 選項 FIELDS TERMINATED BY 'value' ENCLOSED BY 'value' ESCAPED BY 'value' LINES TERMINATED BY 'value' IGNORE LINES
這個和語法和上面類似,所以不進行解釋了。。。。
mysqlimport -u root -p samp_db d:\data.txt;
mysqlimport的功能和load data infile 基本一樣,唯一就是沒有指定字段的數據導入...下面指定的field字段中插入數據...這個功能mysqlimport是無法實現的....
load data infile d:\data.txt into table shop(shop_id,shop_name,shop_info);
導出:
有了導入,那么必然就有導出....
i.使用select into ....outfile進行導出...
基本語法: 和導入的基本語法有很多東西類似...就不進行解釋了 select columnlist from Table WHERE condition into outfile 'filename' [OPTIONS] fields terminated by 'VALUE' fields [OPTIONALLY] ENCLOSED BY 'VALUE' fields ESCAPED BY 'VALUE' lines STARTING by 'VALUE' lines terminated by 'VALUE' select * from samp.shop into outfile d:\shop.txt FIELDS TERMINATED BY ',' ENCLOSED BY '\'' ESCAPED BY '\'' LINES TERMINATED BY '\r\n'; //按照了指定的規格進行數據的導入...
ii.使用mysqldump進行文件的導出...
mysqldump -T path -u root -p dbname [tables][OPTIONS] --fields-terminated-by= --fields-enclosed-by= --fields-optionally-enclosed-by= --fields-escaped-by= --lines-terminated-by= mysqldump -T d:\ -u root -h localhost -p samp_db shop; 這樣就實現了數據的導出...
iii.我們還可以使用mysql進行數據的導出。。。這個相比mysqldump,導出數據的可讀性更強。。。。
mysql -u root -p --execute="SELECT 語句" dbname >filename.txt//基本語法... mysql -u root -p --execute="SELECT * FROM person;" test>C:\person3.txt//還可以是.html文件或者.xml文件....
------------------------------------------------------------------------------------------------------------------------
截止到這里數據庫就告一段落了,把基礎的東西總算是學了個差不多了...還有很多東西沒有學到。。。等以后在實際開發中在進行知識點的彌補吧...明天開始該進行JDBC的學習了。。。。。