關于mysql數據庫備份與還原的方法,這里首先講到備份的工具:mysqlhotcopy,使用mysqlhotcopy工具可進行快速備份,然后數據還原,使用mysql命令還原;最后需要導出數據庫表。詳細的介紹還得閱讀本文。
1.數據備份
定期的備份數據庫,使得在意外情況發生的時候,盡量的減少損失。
1.使用mysqldump命令備份
mysqldump是MySQL提供的一個數據庫備份工具,mysqldump命令執行的時候,將數據庫備份成一個文本文件,該文件中包含了多個CREATE 和INSERT語句,使用這些語句可以重新創建表和插入數據;
【使用mysqldump備份單個數據庫中】
mysqldump?-u?user?-h?host?-p?password?dbname>filename.sql
【使用mysqldump備份數據庫中的指定表】
mysqldump?-u?user?-h?host?-p?password?dbname[tbname,[tbname…]]>filename.sql
【使用mysqldump備份多個數據庫】
mysqldump?-u?user?-h?host?-p?password?--databases[dbname,[dbname…]]>filename.sql
使用–databases參數之后,必須指定至少一個數據庫的名稱,多個數據庫之間使用空格隔開;
【備份系統中所有的數據庫】
mysqldump?-u?user?-h?host?-p?password?--all-databases>filename.sql
提示:如果在服務器上進行備份,并且表均為MyISAM,應考慮使用mysqlhotcopy,因為可以更快的進行備份和恢復;
2.直接復制整個數據庫目錄
因為MySQL表保存為文件方式,所以可以直接復制MySQL數據庫的存儲目錄以及文件進行備份。
這是一種簡單、快速、有效的備份方式,要想保持備份的一致性,備份前需要對相關表執行LOCK TABLES 操作,然后對表執行FLUSH TABLES(確保開始備份前將所有激活的索引頁寫入硬盤)。這樣當復制數據庫目錄的文件時,允許其他的用戶繼續查詢表。
這種方法對InnoDB存儲引擎的表不適用。使用這種方法備份數據最好還原到相同版本的服務器中,不同版本可能不兼容;
3.使用mysqlhotcopy工具快速備份
mysqlhotcopy是一個Perl腳本。
只能運行在數據庫目錄所在的機器上,并且只能備份MyISAM和ARCHIVE類型的表;
2.數據還原
1.使用MySQL命令還原
mysql?-u?username?-p?[dbname]?<p style="margin-left:0cm;">注意:如果filename.sql文件為mysqldump工具創建的包含創建數據庫語句的文件,執行的時候不需要指定數據庫名;</p><p style="margin-left:0cm;">如果已經登錄到MySQL服務器,還可以使用source命令導入SQL文件。</p><pre class="brush:sql;toolbar:false">source?filename
提示:執行source命令之前,必須使用use語句選擇數據庫。不然,恢復過程中會出現錯誤;
2.直接復制到數據庫目錄
如果數據庫通過復制數據庫文件備份,可以直接復制備份的文件到MySQL數據目錄下實現還原。
通過該方式還原的時候,必須保持備份數據庫和待還原的數據庫服務器的主版本號相同。而且這種方式只是對MyISAM引擎的表有效,對于InnoDB引擎的表不可用;
執行還原以前關閉MySQL服務,將備份的文件或者目錄覆蓋MySQL的data目錄,啟動MySQL服務。
對于Linux/Unix操作系統來講,復制完文件需要將文件的用戶或者用戶組更改為mysql運行的用戶和組,通常用戶是mysql,組也是mysql;
3.mysqlhotcopy快速恢復
mysqlhotcopy備份之后的文件也可以用來恢復數據庫,在MySQL服務器停止運行的時候,將備份的數據庫文件復制到MySQL存放的位置(MySQL的data文件夾),重新啟動MySQL服務即可。
如果以根用戶執行該操作,必須指定數據庫文件的所有者
chown?-R?mysql.mysql?/var/lib/mysql/dbname cp?-R?/usr/backup/test?usr/local/mysql/data
執行完該語句,重啟服務器,MySQL將恢復到備份狀態
提示:如果需要恢復的數據庫已經存在,則在使用DROP語句刪除已經存在的數據庫之后,恢復才可以成功,另外MySQL不同版本之間必須兼容;
3.數據庫遷移
數據庫遷移就是把數據從一個系統移動到另一個系統上。數據遷移有以下原因:
1.相同版本的MySQL數據庫之間的遷移
相同版本的MySQL數據庫之間的遷移就是指在主版本號相同的MySQL數據庫之間進行數據庫移動。
舉例:
將www.abc.com主機上的MySQL數據庫全部遷移到www.bcd.com主機上:
mysqldump?-h?www.abc.com?-u?root?-ppassword?dbname?|?mysql?-h?www.bcd.com?-uroot?-ppassword
說明:
mysqldump導入的數據直接通過管道符|,傳給mysql命令導入到主機www.bcd.com數據庫中,dbname為需要遷移的數據庫名稱,如果需要遷移全部的數據庫,可以使用參數 –all-databases
2.不同版本的MySQL數據庫之間的遷移
MySQL服務器升級的時候,需要先停止服務,然后卸載舊版本,并安裝新版本MySQL,這種更新方法很簡單,如果想保留舊版本中的用戶訪問控制信息,需要備份MySQL中的mysql數據庫,在新版本MySQL安裝完成之后,重新讀入mysql備份文件中的信息;
舊版本與新版本的字符集不同時,遷移過程需要對默認字符集進行修改,不然可能無法正常顯示結果;
對于InnoDB引擎的表,一般只能使用mysqldump工具將數據導出,然后使用mysql命令導入到目標服務器上。
從新版本向舊版本遷移數據的時候,需要特別的小心,最好使用mysqldump命令導出,然后導入目標數據庫中;
3.不同數據庫之間的遷移
數據庫遷移可以使用一些工具,例如在Windows系統下,可以使用MyODBC實現MySQL和SQL Server之間的遷移。
MySQL官方提供的工具MySQL Migration Toolkit也可以實現在不同數據庫間進行數據遷移;
4.表的導出和導入
MySQL數據庫中的數據可以導出成SQL文本文件、xml文件或者HTML文件。
1.使用SELECT…INTO OUTFILE導出文本文件
MySQL數據庫導出數據的時候,允許使用包含導出定義的SELECT語句進行數據導出操作。該文件被創建到服務器主機上,因此必須擁有文件寫入權限(FILE權限),才能使用此語法。
語法格式:
SELECT?columnlist?FORM?table?WHERE?condition?INTO?OUTFILE?‘filename’?[OPTIONS]
[OPTIONS]選項:
● FIELDS TERMINATED BY ‘value’
● FIELDS [OPTIONALLY] ENCLOSED BY ‘value’
● FIELDS ESCAPED BY ‘value’
● LINES STARTING BY ‘value’
● LINES TERMINATED BY ‘value’
說明:filename不能是一個已經存在的文件;
OPTIONS部分語法包括FIELDS部分的語法和LINES子句,其可能的取值有:
FIELDS?TERMINATED?BY?‘value’:
設置字段之間的分隔字符,可以為單個或者多個字符,默認情況下為制表符‘t’
FIELDS?[OPTIONALLY]?ENCLOSED?BY?‘value’:
設置字段的包圍字符,只能為單個字符,如果使用了OPTIONALLY,則只有CHAR和VERCHAR等字符數據字段被包括;
FIELDS?ESCAPED?BY?‘value’:
設置如何寫入或者讀取特殊字符,只能為單個字符,即設置轉義字符,默認值為“”
LINES?STARTING?BY?‘value’:
設置每行數據開始字符,可以為單個或者多個,默認不使用任何字符
LINES?TERMINATED?BY?‘value’:
設置每行數據結尾的字符 可以為單個或者多個字符,默認值為‘n’;
注意:FIELDS和LINES兩個子句是可選的,如果同時指定,FIELDS必須位于LINES的前面;
2.使用mysqldump命令導出文本文件
mysqldump工具不僅可以將數據導出為包含CREATE、INSERT的SQL文件,也可以導出為純文本文件;
mysqldump?-T?path-u?root?-p?dbname?[tables]?[OPTIONS]
–OPTIONS選項:
● –fields-terminated-by=value
● –fields-enclosed-by=value
● –fields-optionally-enclosed-by=value
● –fields-escaped-by=value
● –lines-terminated-end-by=value
說明:只有指定了T參數才可以導出為純文本文件;path表示導出數據的目錄;tables為指定要導出表的名稱;如果不指定,將導出數據庫dbname中的所有的表;
[options]取值:
● –fields-terminated-by=value:
? ? ? ? 設置字段之間的分隔字符,可以為單個或者多個字符,默認情況下為制表符‘t’
● –fields-enclosed-by=value:
? ? ? ? ?設置字段的包圍字符;
● –fields-optionally-enclosed-by=value:
? ? ? ? ?設置字段的包圍字符,只能為單個字符,如果使用了OPTIONALLY,則只有CHAR和VERCHAR等字符數據字段被包括;
● –fields-escaped-by=value:
? ? ? ? ?控制如何寫入或者讀取特殊字符,只能為單個字符,及設置轉義字符,默認為反斜線“”;
● –lines-terminated-end-by=value:
? ? ? ? 設置每行數據結尾的字符,可以為單個或者多個字符,默認值為‘n’
3.使用MySQL命令導出文本文件
mysql是一個功能豐富的工具命令,使用MySQL還可以在命令行模式下執行SQL指令將查詢結果導入到文本文件中。相比mysqldump,MySQL工具導出的結果可讀性更強。
如果MySQL服務器是一個單獨的機器,用戶是在一個client上進行操作,用戶要把數據導入到client機器上,可以使用mysql -e語句;
使用MySQL導出數據文本文件語句的基本格式如下:
mysql?-u?root?-p?--execute=”SELECT語句”?dbname?>?filename.txt
使用MySQL命令還可以指定查詢結果的顯示格式:
如果某行記錄字段很多,可能一行不能完全顯示,可以使用–vartical參數,將每條記錄分為多行顯示;
【將查詢結果導出到HTML文件中】
mysql?-u?root?-p?--html?--execute=”SELECT語句”?dbname?>?filename.html
【將查詢結果導出到xml文件中】
mysql?-u?root?-p?--xml?--execute=”SELECT語句”?dbname?>?filename.xml
4.使用LOAD DATA INFILE方式導入文本文件
LOAD DATA INFILE 語句用于高速的從一個文本文件中讀取行,并裝入一個表中。文件名稱必須為文字字符串。
LOAD?DATA?INFILE?‘路徑+文件名.txt’?INTO?TABLE?tablename?[OPTIONS]?[IGNORE?number?LINES]
?注意:如果導出的.txt文件中指定了一些特殊的字符,因此還原語句中也要指定這些字符,以確保還原之后數據的完整性和正確性;
–OPTIONS選項
● FIELDS TERMINATED BY ‘value’
● FIELDS [OPTIONALLY] ENCLOSED BY ‘value’
● FIELDS ESCAPED BY ‘value’
● LINES STARTING BY ‘value’
● LINES TERMINATED BY ‘value’
可以看到LOAD DATA 語句中,關鍵字INFILE后面的filename文件為導入數據的來源;
tablename表示待導入的數據表名稱;
OPTIONS部分語法包括FIELDS部分的語法和LINES子句,其可能的取值有:
FIELDS?TERMINATED?BY?‘value’:
設置字段之間的分隔字符,可以為單個或者多個字符,默認情況下為制表符‘t’
FIELDS?[OPTIONALLY]?ENCLOSED?BY?‘value’:
設置字段的包圍字符,只能為單個字符,如果使用了OPTIONALLY,則只有CHAR和VERCHAR等字符數據字段被包括;
FIELDS?ESCAPED?BY?‘value’:
設置如何寫入或者讀取特殊字符,只能為單個字符,即設置轉義字符,默認值為“”
LINES?STARTING?BY?‘value’:
設置每行數據開始字符,可以為單個或者多個,默認不使用任何字符
LINES?TERMINATED?BY?‘value’:
設置每行數據結尾的字符 可以為單個或者多個字符,默認值為‘n’;
[IGNORE?number?LINES]
選項表示忽略文件開始處的行數,number表示忽略的行數。執行LOAD DATA語句需要FILE權限;
5.使用mysqlimport命令導入文本文件
使用mysqlimport命令可以導入文本文件,并且不需要登錄MySQL客戶端。
使用mysqlimport語句需要指定所需的選項、導入的數據庫名稱以及導入的數據文件的路徑和名稱。
mysqlimport命令的基本語法如下:
mysqlimport?-u?root?-p?dbname?filename.txt?[OPTIONS]
[options]取值:
● –fields-terminated-by=value:
? ? ? ? ?設置字段之間的分隔字符,可以為單個或者多個字符,默認情況下為制表符‘t’
● –fields-enclosed-by=value:
? ? ? ? ?設置字段的包圍字符;
● –fields-optionally-enclosed-by=value:
? ? ? ? ?設置字段的包圍字符,只能為單個字符,如果使用了OPTIONALLY,則只有CHAR和VERCHAR等字符數據字段被包括;
● –fields-escaped-by=value:
? ? ? ? ?控制如何寫入或者讀取特殊字符,只能為單個字符,及設置轉義字符,默認為反斜線“”;
● –lines-terminated-end-by=value:
? ? ? ? 設置每行數據結尾的字符,可以為單個或者多個字符,默認值為‘n’
● –ignore-lines=n
? ? ? ? 忽略數據文件的前n行;
注意:mysqlimport命令不能指定導入數據庫的表名稱,數據表的名稱由導入文件名稱決定,即文件名作為表名,導入數據之前該表必須存在。
相關推薦: