在專案營運過程中,資料庫備份與還原是不可或缺的環節。常見的處理方式主要有兩種:使用 SELECT ... INTO OUTFILE 搭配 LOAD DATA INFILE,以及使用官方工具 mysqldump。前者優在於可自訂導出格式、僅導出純資料不含建表結構,便於導入不同結構的資料表,靈活度較高;後者則是標準化的備份方案,功能強大、參數豐富,適合完整庫備份、結構備份及跨環境遷移。
此方法適合需自訂欄位分隔符、行結束符等格式的場景。示例:
-- 導出符合條件的資料到檔案 SELECT * FROM mytable WHERE status != 0 AND name != '' INTO OUTFILE '/home/db_bak2012' FIELDS TERMINATED BY '|' ENCLOSED BY '\"' LINES TERMINATED BY '\r\n'; -- 導入資料到另一張表 LOAD DATA INFILE '/home/db_bak2012' INTO TABLE mytable_bak FIELDS TERMINATED BY '|' ENCLOSED BY '\"' LINES TERMINATED BY '\r\n';
mysqldump -u 用戶名 -p 資料庫名 > 導出檔名.sql mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql
mysqldump -u 用戶名 -p 資料庫名 表名 > 導出檔名.sql mysqldump -u wcnc -p smgp_apps_wcnc users > wcnc_users.sql
mysqldump -u wcnc -p -d --add-drop-table smgp_apps_wcnc > d:\wcnc_db.sql # -d: 不導出資料;--add-drop-table: 每個 CREATE 前加 DROP TABLE
# 進入 MySQL 控制台 mysql -u root -p mysql> USE 資料庫名; mysql> SET NAMES utf8; -- 注意是 utf8 而非 UTF-8,避免亂碼 mysql> SOURCE d:\wcnc_db.sql;
mysqldump -uroot -p --databases test mysql # 以空格分隔多個庫名
mysqldump -uroot -p --all-databases
以下整理常用參數,供快速查閱:
| 參數 | 簡寫 | 說明 |
|---|---|---|
| --all-databases | -A | 導出全部資料庫 |
| --all-tablespaces | -Y | 導出全部表空間 |
| --no-tablespaces | -y | 不導出任何表空間資訊 |
| --add-drop-database | 每個資料庫建立前加 DROP DATABASE | |
| --add-drop-table | 每個資料表建立前加 DROP TABLE(預設開啟,可用 --skip-add-drop-table 關閉) | |
| --add-locks | 導出表前加 LOCK TABLES,後 UNLOCK TABLES(預設開啟) | |
| --allow-keywords | 允許關鍵字作為欄位名(以表名為前綴) | |
| --apply-slave-statements | 在 CHANGE MASTER 前加 STOP SLAVE,結尾加 START SLAVE | |
| --character-sets-dir | 字元集檔案目錄 | |
| --comments | 附加註釋資訊(預設開啟,--skip-comments 關閉) | |
| --compatible | 導出資料相容其他資料庫或舊版 MySQL(值:ansi、mysql323、postgresql 等) | |
| --compact | 輸出精簡資訊(去除註釋、頭尾結構),等同多個 --skip-* 選項 | |
| --complete-insert | -c | 使用完整 INSERT 語句(含欄位名),提高插入效率但可能受 max_allowed_packet 限制 |
| --compress | -C | 啟用客戶端與伺服器間壓縮傳輸 |
| --create-options | -a | 在 CREATE TABLE 包含所有 MySQL 特有選項(預設開啟) |
| --databases | -B | 導出多個資料庫,後續參數視為資料庫名 |
| --debug | 輸出除錯資訊 | |
| --default-character-set | 設定預設字元集(預設 utf8) | |
| --delayed-insert | 採用 INSERT DELAYED 方式導出 | |
| --delete-master-logs | 備份後刪除主庫 binlog,自動啟用 --master-data | |
| --disable-keys | 以 ALTER TABLE DISABLE/ENABLE KEYS 包裹 INSERT,加速導入(僅 MyISAM,預設開啟) | |
| --dump-slave | 將主庫 binlog 位置追加到輸出檔,值 1/2 決定格式 | |
| --events | -E | 導出事件 |
| --extended-insert | -e | 使用多值 INSERT 語法,縮減檔案體積並加速導入(預設開啟) |
| --flush-logs | 導出前刷新日誌 | |
| --flush-privileges | 導出 mysql 資料庫後發出 FLUSH PRIVILEGES | |
| --force | 忽略導出過程中的 SQL 錯誤 | |
| --hex-blob | 以十六進位導出二進位欄位(BINARY、VARBINARY、BLOB) | |
| --host | -h | 指定主機資訊 |
| --ignore-table | 不導出指定表(需重複指定,格式:database.table) | |
| --insert-ignore | 使用 INSERT IGNORE 語句 | |
| --lock-all-tables | -x | 全域讀鎖定所有表,確保一致性(關閉 --single-transaction 和 --lock-tables) |
| --lock-tables | -l | 導出前鎖定所有表(READ LOCAL),InnoDB 建議用 --single-transaction |
| --master-data | 輸出 binlog 位置到檔案,值 1 輸出 CHANGE MASTER,2 為註釋格式 | |
| --max_allowed_packet | 最大封包長度 | |
| --net_buffer_length | TCP/IP 與 socket 連線緩衝區大小 | |
| --no-autocommit | 用 autocommit/commit 包裹表 | |
| --no-create-db | -n | 不產生 CREATE DATABASE 語句 |
| --no-create-info | -t | 不產生 CREATE TABLE 語句 |
| --no-data | -d | 不導出資料,僅導出結構 |
| --opt | 綜合選項:等同 --add-drop-table --add-locks --create-options --quick --extended-insert --lock-tables --set-charset --disable-keys(預設開啟) | |
| --order-by-primary | 依主鍵或首個唯一鍵排序記錄(導出 MyISAM 到 InnoDB 時有用,但耗時) | |
| --password | -p | 連線密碼 |
| --port | -P | 連線埠號 |
| --protocol | 連線協定:tcp、socket、pipe、memory | |
| --quick | -q | 不緩衝查詢,直接輸出(預設開啟) |
| --quote-names | -Q | 用反引號包裹表/欄位名(預設開啟) |
| --replace | 使用 REPLACE INTO 取代 INSERT INTO | |
| --result-file | -r | 直接輸出到指定檔案(Windows 換行符適用) |
| --routines | -R | 導出預存程序與自訂函數 |
| --set-charset | 輸出 SET NAMES default_character_set(預設開啟) | |
| --single-transaction | 導出前發 BEGIN,確保一致性(僅 InnoDB,與 --lock-tables 互斥,大表建議搭配 --quick) | |
| --dump-date | 在輸出檔加入導出時間(預設開啟) | |
| --skip-opt | 禁用 --opt 選項 | |
| --socket | -S | 指定 socket 檔案位置(預設 /tmp/mysql.sock) |
| --tab | -T | 為每個表建立 tab 分隔文字檔(需 mysqldump 與 mysqld 同機) |
| --tables | 覆蓋 --databases,指定導出表名 | |
| --triggers | 導出觸發器(預設開啟,--skip-triggers 關閉) | |
| --tz-utc | 設定時區 TIME_ZONE='+00:00',保證 TIMESTAMP 正確性 | |
| --user | -u | 指定連線用戶名 |
| --where | -w | 只導出符合 WHERE 條件的記錄 |
| --xml | -X | 導出 XML 格式 |
| --plugin_dir | 客戶端插件目錄 | |
| --default_auth | 客戶端插件預設權限 |
--single-transaction --quick --routines --triggers --events 組合,確保一致性且不阻塞寫入。--compatible=ansi 降低相容性風險。--result-file 避免換行符問題。