- 網絡攻防實戰研究:MySQL數據庫安全
- 祝烈煌
- 4496字
- 2020-10-30 15:11:16
1.6 MySQL數據庫的導入與導出
目前,很多網站系統都采用MySQL+PHP+Apache的架構,其中MySQL數據庫是基礎,查看數據庫、將數據庫導出到本地、將數據庫導入本地數據庫進行還原、在本地架設模擬環境進行測試等,都離不開對數據庫的操作。盡管數據庫的導入和導出是常見和基礎的操作,但在實際操作過程中有很多技巧和注意事項。本節將對MySQL數據庫的導入和導出進行詳細介紹。
1.6.1 Linux下MySQL數據庫的導入與導出
1.MySQL數據庫的導出命令和參數
對于Linux而言,主要通過mysql和mysqldump命令來執行導出操作。在使用這兩個命令時,都需要使用參數。
MySQL連接參數列舉如下。
· -u$USER:用戶名。
· -p$PASSWD:密碼。
· -h127.0.0.1:如果連接遠程服務器,請用對應的主機名或IP地址替換“127.0.0.1”。
· -P3306:端口。
· --default-character-set=utf8:指定字符集。
· --skip-column-names:不顯示數據列的名字。
· -B:以批處理方式運行MySQL程序。查詢結果將以制表符間隔格式顯示。
· -e:執行命令后退出。
mysqldump參數列舉如下。
· -A:全庫備份。
· --routines:備份存儲過程和函數。
· --default-character-set=utf8:設置字符集。
· --lock-all-tables:全局一致性鎖。
· --add-drop-database:在每次執行建表語句之前,執行DROP TABLE IF EXIST語句。
· --no-create-db:不輸出CREATE DATABASE語句。
· --no-create-info:不輸出CREATE TABLE語句。
· --databases:將后面的參數都解析為庫名。
· --tables:第一個參數為庫名,后續參數均為表名。
2.MySQL數據庫的常見導出命令
(1)將全庫備份到本地目錄

(2)將指定庫導出到本地目錄
將antian365庫導出到本地目錄,命令如下。

(3)將某個庫中的表導出到本地目錄
將antian365庫中的user表導出到本地目錄,命令如下。

(4)將指定庫中的表(僅數據)導出到本地目錄(帶過濾條件)
將mysql庫中的user表導出到本地目錄,命令如下。

(5)將某個庫的所有表結構導出

(6)將某個查詢sql的數據以txt格式導出到本地目錄
在導出的文件中,各數據間用制表符分隔,例如“'select user,host,password from mysql.user;'”,命令如下。

(7)將某個查詢sql的數據以txt格式導出到MySQL服務器
登錄MySQL,將默認的制表符換成逗號(適應csv格式),命令如下。

3.提高MySQL數據庫導出速度的技巧
通過 MySQL 導出數據的速度可能非常慢,在處理百萬級數據時可能要花上幾個小時。在導出時,合理地使用幾個參數,就可以提高速度。
· --max_allowed_packet=XXX:客戶端和服務器之間通信緩存區的最大值。
· --net_buffer_length=XXX:TCP/IP和套接字通信緩存區的大小,創建長度為net_buffer_length的行。
注意
max_allowed_packet和net_buffer_length的值不能比目標數據庫的設定值大,否則可能會出錯。
首先,確定目標數據庫的參數值,命令如下。

然后,根據參數值輸入mysqldump命令,示例如下。

現在,導入速度就變得很快了。需要注意的是,max_allowed_packet和net_buffer_length參數的值應該設置得大一些。最簡單的方法是直接復制數據庫目錄,不過在這樣做之前要停止MySQL服務。
4.MySQL數據庫的常見導入命令
在將全庫數據恢復到 MySQL 時,因為包含 mysql庫的權限表,所以導入后需要執行“FLUSH PRIVILEGES;”命令。
(1)使用mysql命令導入

(2)使用source命令導入
登錄MySQL,執行source命令(后面的文件路徑為絕對路徑),示例如下。

(3)使用mysql命令恢復某個庫的數據
使用mysql命令恢復antian365庫中的user表,命令如下。

(4)使用source命令恢復某個庫的數據
使用source命令恢復antian365庫中的user表,命令如下。

(5)恢復MySQL服務器上的txt文件


(6)恢復MySQL服務器上的csv文件
在執行以下命令時,需要FILE權限,各數據間用逗號分隔。

(7)將本地txt或csv文件恢復到MySQL中

1.6.2 Windows下MySQL數據庫的導入與導出
Windows 下 MySQL 數據庫的導入和導出相對簡單,在此僅作簡單的介紹。在后面的章節中,會結合實際應用介紹一些在Windows下使用客戶端軟件導入和導出MySQL數據庫的方法。
1.通過mysqldump命令導入和導出
命令格式如下。

把數據庫db導出到backupdatabase20140916.sql文件,示例如下。

導入數據庫的命令行,示例如下。

把backupdatabase20140916.sql導入新建數據庫db,示例如下。

2.通過MySQL命令導入和導出
將數據庫xxx導出到d盤根目錄下的xxx.sql文件,示例如下。

將數據庫d盤下的xxx.sql文件導入數據庫xxx,示例如下。

登錄MySQL以后,通過如下命令進行導入操作。

1.6.3 將html文件導入MySQL數據庫
某些數據庫,既不是sql文件,也不是txt、csv、xls等文件,而是html文件。數據在html文件中以表格的形式存在。打開該文件,數據以表格的形式展現,如圖1-41所示。

圖1-41 以表格形式顯示的數據
1.選擇導入類型
Navicat系列軟件支持多種類型的數據。如圖1-42所示,單擊選中“HTML文件(*.htm;*.html)”,然后單擊“下一步”按鈕。

圖1-42 選擇導入文件的類型
在其他類型的庫的導入過程中,需要針對不同的類型進行選擇。例如,對于xls文件,需要單擊選中“Excel文件(*.xls)”。
2.查看文件的編碼格式
在導入前,需要知道文件是以何種格式編碼的。在本例中,使用記事本程序打開文件,單擊“格式”菜單項,即可看到該文件是用UTF-8格式編碼的。如圖1-43所示,在導入時需要設置文件的編碼方式,否則導入的數據在數據庫中會顯示為亂碼。
3.選擇編碼方式
因為文件是用UTF-8格式編碼的,所以在“編碼”下拉列表中選擇“65001(UTF-8)”選項,如圖1-44所示。這一步很關鍵,如果編碼格式選擇錯誤,導入的數據將顯示為亂碼。

圖1-43 查看文件的編碼方式

圖1-44 選擇編碼
4.設置欄名稱和起始數據行
如圖1-45所示:輸入數字“1”,設置導入數據的第一行為欄名稱(如果設置第二行,則輸入數字“2”);“第一個數據行”表示從第幾行開始導入數據,在這里輸入數字“1”,表示從第一行開始導入(如果輸入數字“2”,則表示從第二行開始導入);“最后一個數據行”文本框可以為空。

圖1-45 設置欄名稱和起始數據行
5.設置目標表和源表
設置目標表和源表,如圖1-46所示(默認會顯示同樣的名稱)。可以手動修改目標表的名稱。此時,可以新建表,也可以選擇數據庫中已經存在的表。

圖1-46 設置目標表
6.設置目標表的欄名稱
如圖1-47所示,默認顯示第一行數據為欄名稱。可以對每一個目標欄名稱進行設置,既可以使用默認名稱,也可對其進行修改。同時,需要設置類型和長度等。

圖1-47 設置目標表的欄名稱
然后,單擊“下一步”按鈕,在導入模式中選擇“添加:添加記錄到目標表”選項,進行數據的導入。
7.查看導入日志
在導入過程中會顯示導入百分比。如果顯示“100%”,表示已經導入全部數據。在導入向導窗口會顯示導入日志,如圖1-48所示,其中包含導入的文件、新建的表等信息。如果導入成功,會顯示“Finished-Successfully”。如果在導入過程中出現了錯誤,可以將日志信息復制下來。單擊“關閉”按鈕,完成數據的導入。

圖1-48 查看日志
8.查看導入的數據
打開導入的數據庫表,所有數據被正確地導入。接下來,就可以對數據進行查看和處理了。
1.6.4 將MSSQL數據庫導入MySQL數據庫
將MSSQL數據庫導入MySQL數據庫的操作,與將html文件導入MySQL數據庫的操作基本相同。在“導入類型”中選擇“ODBC”選項,設置數據連接屬性為“Microsoft OLE DB Provider for SQL Server”,如圖1-49所示。

圖1-49 設置數據庫連接屬性
切換到“連接”標簽頁,輸入服務器名稱“.”(也可以輸入IP地址或數據庫服務器的名稱,“.”表示本機或localhost)。輸入登錄服務器的信息,即設置數據連接方式是“使用Windows NT集成安全設置”還是“使用指定的用戶名稱和密碼”。最后,選擇一個數據庫進行連接測試。如圖1-50所示,如果顯示“測試連接成功”,就可以進行后續操作。

圖1-50 測試數據庫連接
后續操作與將html文件導入MySQL數據庫類似,在此就不贅述了。
1.6.5 將xls和xlsx文件導入MySQL數據庫
將xls和xlsx文件導入MySQL數據庫的步驟與前面介紹的大致相同,區別只是在導入這兩種文件時需要選擇表。
如圖1-51所示,選擇xlsx文件中存在數據的表,例如Sheet1和Sheet2。

圖1-51 導入xlsx文件
1.6.6 將xml文件導入Navicat for MySQL
筆者在對某網站進行滲透測試時發現,該網站會自動記錄用戶個人信息,生成log.txt文件。該文件已經超過700MB,使用記事本程序打開比較困難。如圖1-52所示,使用瀏覽器查看該文件,發現其明顯是以XML語法進行記錄的。通過測試發現,使用Navicat for MySQL可以將該文件導入數據庫,但前提是將該文件重命名為xml文件。

圖1-52 查看文件內容及其格式
下面介紹測試過程。
1.選擇編碼方式
打開Navicat for MySQL,選擇一個數據庫,依次選擇“導入向導”→“導入類型”→“xml文件”選項。如圖1-53所示,選擇數據源(即需要導入的數據文件),同時設置編碼格式為UTF-8。

圖1-53 設置編碼格式
注意
編碼格式的選擇是非常重要的。如果編碼格式選擇錯誤,不僅導入的數據庫可能顯示為亂碼,還有可能在導入數據庫的過程中直接出現錯誤,導致數據導入失敗。
2.選擇表字段
如圖1-54所示,在下拉列表中選擇一個值作為表行的標簽。可以選擇軟件提供的值,也可以自行指定(其實就是表里面的字典)。然后,單擊“下一步”按鈕。

圖1-54 選擇表字段
3.設置數據行
如圖1-55所示,如果第一個數據行是欄位名稱,則將第一個數據行設置為“2”,否則設置為“1”,其他項保持默認設置即可。

圖1-55 設置數據的第一行和欄位名稱
4.設置目標表的名稱
如圖1-56所示,源表是指要將其內容導入數據庫的表,目標表是指導入后數據庫中的表(軟件會自動指定一個表),自動顯示出來的目標表的名稱為“log”。

圖1-56 設置表名稱
注意
在一些情況下,目標表名稱如果為特殊字符(例如含有“.”等),將無法成功導入數據。因為這些字符在數據庫中是禁止使用的,所以無法創建表。
5.設置導入表的欄位名稱
如圖1-57所示,Navicat for MySQL會自動識別xml文件中的字段名稱,并將其轉換為數據庫能夠接受的格式(即數據庫欄位名稱),因此一般保持默認設置即可。在特殊情況下,可能需要修改欄位名稱所對應的數據庫類型和長度。

圖1-57 設置欄位名稱
6.選擇導入模式
Navicat for MySQL提供了五種導入模式,但在本例中只能使用其中的兩種,一種是添加,另一種是復制,如圖1-58所示。保持“添加:添加記錄到目標表”的默認選中狀態,后續設置均保持默認狀態,即可開始導入數據。

圖1-58 選擇導入方式
7.導入數據庫
如圖1-59所示,開始導入數據庫。在該窗口中會顯示數據導入進度、已處理數據的記錄、錯誤信息、已添加數據的記錄及耗費的時間等,窗口標題欄顯示“100%”則表示導入成功。

圖1-59 導入數據
8.后續處理
導入成功后,可以將一些無用的數據清理掉,命令如下。

1.6.7 通過Navicat for MySQL代理導入數據
使用Navicat for MySQL進行數據庫連接,可以通過HTTP通道實現。
1.在“常規”選項卡中設置
新建MySQL連接,設置連接名、主機名(本例為“localhost”)、端口和密碼,如圖1-60所示。

圖1-60 設置MySQL連接
2.使用HTTP通道
切換到“HTTP”標簽頁,勾選“使用 HTTP 通道”選項。如圖1-61所示,在“通道地址”文本框中輸入ntunnel_mysql.php文件的實際地址,單擊“確認”按鈕。

圖1-61 使用HTTP通道
3.本地連接遠程數據庫
如圖1-62所示,在Navicat for MySQL中雙擊新建數據庫的地址,即可實現與該網站數據庫的連接。

圖1-62 本地連接遠程數據庫
盡管有些網站是禁止遠程連接數據庫的,但攻擊者在擁有WebShell的情況下,仍然可以將文件C:\Program Files(x86)\PremiumSoft\Navicat for MySQL\ntunnel_mysql.php復制到目標站點根目錄或其他目錄下,從而導出數據庫。因此,在實際工作中,即使禁用了遠程數據庫連接,也需要經常對網站數據庫的安全性進行檢查。
1.6.8 導入技巧和錯誤處理
1.轉碼處理
使用記事本程序(或者其他文本編輯器)打開文件,在“格式”菜單中選擇“轉為UTF-8編碼格式”選項,文件將以UTF-8編碼格式進行編碼,如圖1-63所示。

圖1-63 進行轉碼處理
2.出錯繼續
如圖1-64所示,在正式將數據導入數據庫之前,勾選“遇到錯誤繼續”復選框,導入過程就不會因為導入數據的格式錯誤而終止了。

圖1-64 出錯繼續
3.錯誤信息再處理
如圖1-65所示,如果數據格式不全或編碼中有多余的特殊字符,數據導入將會失敗,沒有被成功導入的數據會在日志中顯示出來。

圖1-65 錯誤信息再處理
將日志中的出錯信息復制到記事本程序中,修改其中的錯誤并保存,然后在查詢器中進行查詢和導入。
如圖1-66所示,一些sql文件在導出時使用了錯誤的編碼,特別是中文字符,會在其中顯示“?”。這時,需要進行替換操作。可以將“?”替換為“'”,重新運行sql文件。

圖1-66 處理文件中的特殊字符