資料匯出是資料庫管理的關鍵環節,主要用於兩大場景:備份防災(資料價值高昂,定期備份防範遺失)與資料共享(如書商共享新書資料庫、醫院交換電子病歷)。MySQL 提供多種匯出方式,本文深入解析兩大核心工具:mysqldump 與 SELECT INTO OUTFILE。
mysqldump 位於 MySQL/bin/ 目錄,功能強大且靈活:
CREATE 與 INSERT 語句。WHERE 子句篩選特定記錄。# 匯出整個資料庫
bin/mysqldump -p Meet_A_Geek > MeetAGeek_Dump_File.txt
# 匯出單一資料表
bin/mysqldump -p Meet_A_Geek Orders > MeetAGeek_Orders.txt
# 依條件匯出(訂單編號 > 2000)
bin/mysqldump -p --where="Order_ID > 2000" Meet_A_Geek Orders > Special_Dump.txt
| 參數 | 功能 |
|---|---|
--add-drop-table | 各表前加 DROP TABLE IF EXISTS,確保重複匯入不報錯 |
--add-locks | INSERT 前後加鎖,防止匯入期間他人操作該表 |
-c / --complete-insert | INSERT 語句包含欄位名,利於跨資料庫遷移 |
-t / --no-create-info | 僅匯出資料(無 CREATE TABLE) |
-d / --no-data | 僅匯出結構(無 INSERT) |
--opt | 啟用多項優化,加速匯出與後續匯入(預設開啟) |
-q / --quick | 逐行讀寫,避免大表佔滿記憶體 |
-T / --tab=path | 產生兩檔:.sql(結構)+ .txt(資料),適合大量資料載入 |
--fields-terminated-by=, | 指定欄位分隔符(如逗號),方便 Excel 開啟 |
bin/mysqldump -p --where="Order_Date >= '2000-01-01'" \
--tab=/home/mark --no-create-info --fields-terminated-by=, \
Meet_A_Geek Orders
此命令將 2000 年後的訂單以 CSV 格式輸出至 /home/mark/Orders.txt,無結構定義,直接可導入試算表。
若需在 SQL 腳本或應用程式中直接匯出,SELECT INTO OUTFILE 是最佳選擇,語法與 LOAD DATA INFILE 對稱,支援幾乎相同的格式化選項。
mysqld 服務運行:mysqladmin ping(回應 alive 即正常)。bin/mysql -p Meet_A_Geek。SELECT * INTO OUTFILE '/home/mark/Orders.txt'
FIELDS TERMINATED BY ','
FROM Orders
WHERE Order_Date >= '2000-01-01';
執行後即生成檔案。優勢在於可結合 JOIN 進行多表關聯查詢匯出,甚至作為簡易報表產生器。
USE Meet_A_Geek;
INSERT INTO Customers (Customer_ID, Last_Name, First_Name) VALUES (NULL, 'Kinnard', 'Vicky');
INSERT INTO Customers (Customer_ID, Last_Name, First_Name) VALUES (NULL, 'Kinnard', 'Steven');
INSERT INTO Customers (Customer_ID, Last_Name, First_Name) VALUES (NULL, 'Brown', 'Sam');
SELECT Last_Name INTO OUTFILE '/home/mark/Report.rpt'
FROM Customers WHERE Customer_ID > 1;
再以批次模式執行:bin/mysql < Report_G.rpt,輸出檔將包含所有符合條件的客戶姓氏。
Schema:一組以資料定義語言(DDL)表達的語句集,完整描述資料庫結構(含表、索引、約束等)。