MySql的備份還原

備份數據是數據庫管理最經常使用的操做。爲了保證數據庫中數據的安全,數據管理員須要按期進行數據備份。一旦數據庫遭到破壞,即可經過備份的文件來還原數據庫。所以,數據備份是一項很重要的工做。html

數據備份

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

Mysqldump命令的工做原理很簡單。它先查出須要備份的表的結構,再在文本文件中生存一個CREATE語句;而後,將表中的全部記錄轉換成一條INSERT語句,這些CREATE語句和INSERT語句都是還原時使用的,還原數據時就可使用其中的CREATE語句來建立表,使用其中的INSERT語句來還原數據。sql

備份一個數據庫

使用mysqldump命令備份一個數據庫的基本語法以下:數據庫

mysqldump -uusername -p dbname table1 table2 …… > BackupName.sql安全

其中,dbname參數表示數據庫的名稱;table1和table2參數表示表的名稱,沒有該參數時將備份整個數據庫;BackupName.sql參數表示備份文件的名稱,文件名前面能夠加上一個絕對路徑。一般將數據庫備份成一個後綴名爲sql的文件。mysqldump命令備份的文件並不是必定要求後綴名爲.sql,備份成其餘格式的文件也是能夠的,例如,後綴名爲.txt的文件。可是,一般狀況下是備份成後綴名爲.sql的文件。服務器

ps:文件開頭記錄了MySQL的版本、備份的主機名和數據庫名。文件中,以「--」開頭的都是SQL語言的註釋。以「/*!40101」等形式開頭的都是與MySQL有關的註釋。40101是MySQL數據庫的版本號,這裏就表示MySQL4.1.1。文件中沒有建立數據庫的語句,所以,student.sql文件中的全部表和記錄必須還原到一個已經存在的數據庫中。還原數據時,CREATE TABLE語句會在數據庫中建立表,而後執行INSERT語句向表中插入記錄。socket

備份多個數據庫

mysqldump命令備份多個數據庫的語法以下:工具

mysqldump -uusername -p --databases dbname1 dbname2 > BackupName.sql性能

這裏要加上「databases」這個選項,而後後面跟多個數據庫的名稱。網站

備份全部數據庫

mysqldump命令備份全部數據庫的語法以下:

mysqldump -uusername -p --all-databases > BackupName.sql

使用「--all-databases」選項就能夠備份全部數據庫了。

直接複製整個數據庫目錄

MySQL有一種最簡單的備份方法,就是將MySQL中的數據庫文件直接複製出來。這種方法最簡單,速度也最快。使用這種方法時,最好將服務器先中止。這樣,能夠保證在複製期間數據庫中的數據不會發生變化。若是在複製數據庫的過程當中還有數據寫入,就會形成數據不一致。

這種方法雖然簡單快捷,但不是最好的備份方法。由於,實際狀況可能不容許中止MySQL服務器。並且,這種方法對INNODB存儲引擎的表不適用。對於MyISAM存儲引擎的表,這樣備份和還原很方便。可是還原時最好是相同版本的MySQL數據庫,不然可能會存儲文件類型不一樣的狀況。

ps:在MySQL的版本號中,第一個數字表示主版本號。主版本號相同的MySQL數據庫的文件類型會相同。例如,MySQL5.1.39和MySQL5.1.40這兩個版本的主版本號都是5.那麼這兩個數據庫的數據文件擁有相同的文件格式。

使用mysqlhotcopy工具快速備份

若是備份時不能中止MySQL服務器,能夠採用mysqlhotcopy工具。使用mysqlhotcopy工具有份要比mysqldump命令快。

mysqlhotcopy工具是一個Perl腳本,主要在Linux操做系統下使用。mysqlhotcopy工具使用LOCK TABLES、FLUSH TABLES 和 cp來進行快速備份。其工做原理是,先將須要備份的數據庫加上一個讀操做鎖,而後用FLUSH TABLES將內存中的數據寫回到硬盤上的數據庫中,最後把須要備份的數據庫文件複製到目標目錄。使用mysqlhotcopy的命令以下:

[root@localhost~]#mysqlhotcopy [option] dbname1 dbname2 …… backupDir/

其中,dbname1等表示須要備份的數據庫的名稱;backupDir參數指定備份到哪一個文件夾下。這個命令的含義就是將dbname一、dbname2等數據庫備份到backDir目錄下。mysqlhotcopy工具備一些經常使用的選項,這些選項的介紹以下:

--help:用來查看mysqlhotcopy的幫助;

--allowold:若是備份目錄下存在相同的備份文件,將舊的備份文件名加上_old;

--keepold:若是備份目錄下存在相同的備份文件,不刪除舊的備份文件,而是將舊文件改名;

--flushlog:本次備份以後,將對數據庫的更新記錄到日誌中;

--noindices:只備份數據文件,不備份索引文件;

--user=用戶名:用來指定用戶名,能夠用-u代替;

--password=密碼:用來指定密碼,能夠用-p代替。使用-p時,密碼與-p緊挨着,或者只使用-p,而後用交換的方式輸入密碼,這與登陸數據庫時的狀況是同樣的;

--port=端口號:用來指定訪問端口,能夠用-P代替;

--socket=socket文件:用來指定socket文件,能夠用-S代替。

ps:mysqlhotcopy工具不是MySQL自帶的,須要安裝Perl的數據接口包,Perl的數據庫接口包能夠在MySQL官方網站下載,網址是http://dev.mysql.com/downloads/dbi.html。mysqlhotcopy工具的工做原理是將數據庫文件拷貝到目標目錄。所以mysqlhotcopy工具只能備份MyISAM類型的表,不能用來備份InnoDB類型的表。

數據還原

管理員的非法操做和計算機的故障都會破壞數據庫文件。當數據庫遇到這些意外時,能夠經過備份文件將數據庫還原到備份時的狀態,這樣能夠將損失下降到最小。

使用mysql命令還原

使用mysqldump命令能夠將數據庫的數據備份成一個文本文件,一般這個文件的後綴名是.sql。須要還原時,可使用mysql命令來還原備份的數據。

備份文件中一般包含CREATE語句和INSERT語句。mysql命令能夠執行備份文件中的CREATE語句和INSERT語句,經過CREATE語句來建立數據庫和表,經過INSERT語句來插入備份的數據。mysql命令的基本語法以下:

mysql -uroot -p  dbname < backup.sql

其中,dbname參數表示數據庫名稱。該參數爲可選參數,能夠指定數據庫名,也能夠不指定;指定數據庫名時,表示還原該數據庫下的表;不指定數據庫名時,表示還原特定的一個數據庫,而備份文件中有建立數據庫的語句。

ps:若是使用--all-databases參數備份了全部的數據庫,那麼還原時不須要指定數據庫。由於,其對應的sql文件包含有CREATE DATABASE語句,能夠經過該語句建立數據庫。建立數據庫以後,能夠執行sql文件中的USE語句選擇數據庫,而後在數據庫中建立表而且插入記錄。

直接複製到數據庫目錄

經過直接複製數據的方式備份的數據,能夠直接複製到MySQL的數據庫目錄下。經過這種方式還原時,必須保證兩個MySQL數據庫的主版本號是相同的。並且,這種方式對MyISAM類型的表比較有效,對於InnoDB類型的表則不可用,由於InnoDB表的表空間不能直接複製。

使用mysqlhotcopy命令備份的數據也是經過這種方式來還原的。在Linux操做系統下,複製到數據庫目錄後,必定要將數據庫的用戶和組變成mysql。命令以下:

chown -R mysql.mysql dataDir

其中,兩個mysql分別表示組和用戶;「-R」參數能夠改變文件夾下的全部子文件的用戶和組;「dataDir」參數表示數據庫目錄。

ps:Linux操做系統下的權限設置很是嚴格。一般狀況下,MySQL數據庫只有root用戶和mysql用戶組下的mysql用戶能夠訪問。所以,將數據庫目錄複製到指定文件夾後,必定要使用chown命令將文件夾的用戶組變爲mysql,將用戶變爲mysql。

數據庫遷移

數據庫遷移就是指將數據庫從一個系統移動到另外一個系統上。數據庫遷移的緣由有多種,多是由於升級了計算機,或者是部署開發的管理系統,或者升級了MySQL數據庫,甚至是換用其餘的數據庫。根據上述狀況,能夠將數據庫遷移大體分爲3類。這3類分別是在MySQL相同版本的數據庫之間遷移、遷移到MySQL其餘版本的數據庫中和遷移到其餘類型的數據庫中。

MySQL相同版本的數據庫之間的遷移

MySQL相同版本的數據庫之間的遷移就是在主版本號相同的MySQL數據庫之間進行數據庫移動,這種遷移的方式最容易實現。

MySQL相同版本的數據庫之間進行數據庫遷移的緣由不少。一般的緣由是換了新的機器,或者是裝了新的操做系統;還有一種常見的緣由就是將開發的管理系統部署到工做機器上。由於遷移先後MySQL數據庫的主本版號相同,因此能夠經過複製數據庫目錄來實現數據庫遷移。可是,只有數據庫表都是MyISAM類型的才能使用這種方式。

最經常使用和最安全的方式是使用mysqldump命令來備份數據庫。而後使用mysql命令將備份文件還原到新的MySQL數據庫中。這裏能夠將備份和遷移同時進行。假設從一個名爲host1的機器中備份出全部數據庫,而後,將這些數據庫遷移到名爲host2的機器上。命令以下:

mysqldump -h name1 -u root -password=password1 -all-databases

mysql -h host2 -u root -password=password2

其中,「-password=password1」是name1主機上root用戶的密碼;同理,password2是name2主機上的root用戶的密碼。經過這種方式能夠直接實現遷移。

不一樣數據庫之間的遷移

不一樣數據庫之間遷移是指從其餘類型的數據庫遷移到MySQL數據庫,或者從MySQL數據庫遷移到其餘類型的數據庫。例如,某個網站原來使用Oracle數據庫,由於運營成本過高等諸多緣由,但願改用MySQL數據庫。或者,某個管理系統原來使用MySQL數據庫,由於某種特殊性能的要求,但願改用Oracle數據庫。這樣的不一樣數據庫之間的遷移也常常會發生,可是這種遷移沒有廣泛適用的解決方法。

MySQL之外的數據庫也有相似mysqldump這樣的備份工具,能夠將數據庫中的文件備份成sql文件或普通文件。可是,由於不一樣數據庫廠商沒有徹底按照SQL標準來設計數據庫,這就形成了不一樣數據庫使用的SQL語句的差別。例如,微軟的SQL Server軟件使用的是T-SQL語言。T-SQL中包含了非標準的SQL語句,這就形成了SQL Server和MySQL的SQL語句不能兼容。

除了SQL語句存在不兼容的狀況外,不一樣的數據庫之間的數據類型也有差別。例如,SQL Server數據庫中有ntext、Image等數據類型,這些MySQL數據庫都沒有;MySQL支持的ENUM和SET類型,這些SQL Server數據庫不支持,數據類型的差別也形成了遷移的困難。從某種意義上說,這種差別是商業數據庫公司故意形成的壁壘,這種行爲是阻礙數據庫市場健康發展的。

表的導出和導入

MySQL數據庫中的表能夠導出成文本文件、XML文件或者HTML文件;相應地,文本文件也能夠導入MySQL數據庫中。在數據庫的平常維護中,常常須要進行表的導出和導入的操做。

用SELECT …… INTO OUTFILE導出文本文件

MySQL中,可使用SELECT …… INTO OUTFILE語句將表的內容導出成一個文本文件。其基本語法形式以下:

SELECT [列名] FROM table [WHERE語句] INTO OUTFILE '目標文件' [OPTION];

該語句分爲兩個部分,前半部分是一個普通的SELECT語句,經過這個SELECT語句來查詢所須要的數據;後半部分是導出數據的。其中,「目標文件」參數指定將查詢的記錄導出到哪一個文件;「OPTION」參數時能夠有經常使用的5個選項。介紹以下:

FIELDS TERMINATED BY '字符串':設置字符串爲字段的分隔符,默認值是「\t」;

FIELDS ENCLOSED BY '字符':設置字符串括上字段的值。默認狀況下不使用任何符號;

FIELDS OPTIOINALLY ENCLOSED BY '字符':設置字符串括上CHAR、VARCHAR、和TEXT等字符型字段。默認狀況下不使用任何符號;

FIELDS ESCAPED BY '字符':設置轉義字符,默認值爲「\」;

LINES STARTING BY '字符串':設置每行開頭的字符,默認狀況下無任何字符;

LINES TERMINATED BY '字符串':設置每行的結束符,默認值是「\n」;

SELECT * FROM student INTO OUTFILE 'D:\student1.txt'
FIELDS TERMINATED BY '\,'OPTIONALLY ENCLOSED BY '\"' LINES STARTING BY '\>'
TERMINATED BY'\r\n';
字段之間用「,」隔開,字符型數據用雙引號括起來,每條記錄以「>」開頭。「TERMINATED BY'\r\n'」能夠保證每條記錄佔一行。

用mysqldump命令導出文本文件

mysqldump命令能夠備份數據庫中的數據,但在備份時保存了CREATE語句和INSERT語句,不只如此,mysqldump命令還能夠導出文本文件。其基本的語法形式以下:

mysqldump -uroot -pPassword -T 目標目錄 dbname table [option];

其中,Password參數表示root用戶的密碼,密碼緊挨着-p選項;目標目錄參數時指導出的文本文件的路徑;dbname參數表示數據庫的名稱;table參數表示表的名稱;option表示附件選項。這些選項介紹以下:

--fields-terminated-by=字符串:設置字符串爲字段的分隔符,默認值是「\t」;

--fields-enclosed-by=字符:設置字符串括上字段的值;

--fields-optionally-enclosed-by=字符:設置字符括上CHAR、VARCHAR和TEXT等字符型字段;

--fields-escaped-by=字符:設置轉義字符;

--lines-terminated-by=字符串:設置每行的結束符。

注意這些選項必須用雙引號括起來,不然,MySQL數據庫系統將不能識別這幾個參數。

mysqldump -uroot -p111 -T D:\test student
"--fields-terminated-by=,""-fields-optionally-enclosed-by="
字段之間用「,」隔開,字符型數據用雙引號括起來.

ps:其實,mysqldump命令也是調用SELECT……INTO OUTFILE語句來導出文本文件的。除此以外,mysqldump命令同時還生成了student.sql文件,這個文件中有表的結構和表中的記錄。

mysqldump命令還能夠導出xml格式的文件,其基本語法以下:

mysqldump -uroot -pPassword -xml-X dbname table > D:\name.xml;

其中,Password表示root用戶的密碼;使用-xml或者-X選項就能夠導出xml格式的文件;dbname表示數據庫的名稱;table表示表的名稱;D:\name.xml表示導出的xml文件的路徑。

用mysql命令導出文本文件

mysql命令能夠用來登陸MySQL服務器,也能夠用來還原備份文件。同時,mysql命令也能夠導出文本文件。其基本語法形式以下:

mysql -uroot -pPassword -e "SELECT語句" dbname > D:/name.txt;

其中,Password表示root用戶的密碼;使用-e選項就能夠執行SQL語句:「SELECT語句」用來查詢記錄;D:/name.txt表示導出文件的路徑。

mysql命令還能夠導出XML文件和HTML文件。mysql命令導出XML文件的語法以下:

mysql -uroot -pPassword -xml-X -e "SELECT語句" dbname>D:/name.xml

其中,Password表示root用戶的密碼;使用-xml或者-X選項就能夠導出xml格式的文件;dbname表示數據庫的名稱;D:/name.xml表示導出的XML文件的路徑。

mysql命令導出HTML文件的語法以下:

mysql -uroot -pPassword --html-H -e "SELECT語句" dbname>D:/name.html

其中,使用--html或者-H選項就能夠導出HTML格式的文件。

相關文章
相關標籤/搜索