掌握 mysqldump 匯出與 source/管道匯入兩大核心技能,覆蓋結構、資料、壓縮、跨庫遷移常見場景。
| 需求 | 命令 | 說明 |
|---|---|---|
| 匯出資料 + 結構 (標準) | mysqldump -u user -p db_name > db_name.sql | 輸入密碼後生成 SQL 檔 |
| 僅匯出表結構 (無資料) | mysqldump -u user -p -d db_name > db_name.sql | -d / --no-data |
| 匯出指定表 | mysqldump -u user -p db_name tbl1 tbl2 > tables.sql | 表名空格分隔 |
| 匯出並壓縮 (推薦大庫) | mysqldump -u user -p db_name | gzip > db_name.sql.gz | 管道串流壓縮,不佔臨時空間 |
| 匯出多個庫 | mysqldump -u user -p --databases db1 db2 > multi.sql | 含 CREATE DATABASE 語句 |
| 帶條件匯出 (如近 30 天) | mysqldump -u user -p db_name tbl --where="created_at > DATE_SUB(NOW(), INTERVAL 30 DAY)" > part.sql | --where 過濾 |
注意:-p 後不加密碼 (安全),執行後提示輸入;或寫腳本用 -p'password' (無空格)。
mysql -u user -p
# 進入後
CREATE DATABASE IF NOT EXISTS db_name;
USE db_name;
SET NAMES utf8mb4;
SOURCE /path/to/db_name.sql;
優點:可見執行進度、錯誤行號、支援超大檔案分批提交。
# 一般匯入
mysql -u user -p db_name < db_name.sql
# 壓縮檔直接匯入
gunzip < db_name.sql.gz | mysql -u user -p db_name
# 跨伺服器直接遷移 (無落地檔)
mysqldump -u user -p db_name | mysql -h target_host -u user -p db_name
建議優先使用方法二,適合自動化腳本、CI/CD 流水線。
mysqldump 通常在 /usr/local/mysql/bin/ 或 /usr/bin/ (包管理安裝)。/home/user/backup/)。utf8mb4 推薦)。| 現象 | 原因 | 解決 |
|---|---|---|
| Unknown database | 目標庫不存在 | 先 CREATE DATABASE |
| ERROR 1062 Duplicate entry | 主鍵/唯一鍵衝突 | 用 --add-drop-table 匯出、或先 DROP TABLE |
| 中文亂碼 | 字符集不一致 | 匯出/匯入均指定 --default-character-set=utf8mb4、SET NAMES utf8mb4 |
| MySQL server has gone away | 大包超時/超過 max_allowed_packet | 增大 max_allowed_packet=512M、net_read_timeout=600 |