首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 數據導入導出全攻略:mysqldump、mysqlimport、SELECT INTO OUTFILE、備份恢復策略

     編輯:MySQL 資料庫相關知識

一、導出工具對比

工具/語句適用場景優點缺點
mysqldump邏輯備份、跨版本遷移、結構+數據導出SQL 文本可讀、支持 WHERE 篩選、壓縮傳輸、跨引擎大表導出/導入慢、佔用磁盤大
SELECT ... INTO OUTFILE大批量導出文本/CSV、報表生成速度極快、可指定分隔符/引號、支持 JOIN 複雜查詢需 FILE 權限、只能導出到服務器本地、不含建表語句
mysqlhotcopyMyISAM 物理熱備份極快、鎖表時間短僅 MyISAM、僅 Unix/NetWare、需文件系統訪問
物理拷貝數據目錄全庫物理冷備份/快照最快、支持增量(配合 LVM/ZFS/btrfs 快照)需停庫或全局鎖、InnoDB 需配合 ib_logfile
二進制日志增量備份、時間點恢復 (PITR)增量、可重放、支持主從需解析、恢復慢、佔磁盤

二、mysqldump 核心參數與實戰

常用參數速查

# 必備
--single-transaction        # InnoDB 一致性無鎖導出(必加)
--master-data=2              # 記錄 binlog 位置(CHANGE MASTER TO 註釋)
--routines --triggers --events  # 導出存儲過程/觸發器/事件
--hex-blob                   # 二進制列十六進制導出
--default-character-set=utf8mb4  # 字符集顯式指定

# 性能
--quick                      # 流式導出,不緩存全表結果集
--extended-insert            # 多行 INSERT(默認開啟)
--opt                        # 等同 --add-drop-table --add-locks --extended-insert --quick --lock-tables --set-charset --disable-keys

# 結構控制
--no-data (-d)               # 只導結構
--no-create-info (-t)        # 只導數據
--add-drop-table             # 每表前加 DROP TABLE IF EXISTS
--compact                    # 精簡輸出(去除註釋等)

# 篩選
--where="id > 1000"          # 導出滿足條件的行
--tables tbl1 tbl2           # 指定表(配合 --databases)
--ignore-table=db.tbl        # 排除表

典型命令示例

# 1. 全庫邏輯備份(生產標準)
mysqldump -u backup -p --single-transaction --master-data=2 \
  --routines --triggers --events --hex-blob \
  --default-character-set=utf8mb4 \
  --databases db1 db2 > /backup/full_$(date +%F).sql

# 2. 大表分批導出(配合 WHERE 主鍵範圍)
mysqldump -u backup -p --single-transaction --where="id BETWEEN 1 AND 1000000" \
  db big_table > /backup/big_table_part1.sql

# 3. 只導結構(遷移審計)
mysqldump -u backup -p --no-data --routines --triggers --events db > schema.sql

# 4. 遠程直接導入另一實例
mysqldump -h src_host -u backup -p --single-transaction db | \
  mysql -h dst_host -u root -p db

三、SELECT INTO OUTFILE / LOAD DATA INFILE 高性能文本互導

導出

SELECT id, name, created_at
FROM users
WHERE created_at >= '2023-01-01'
INTO OUTFILE '/tmp/users_2023.csv'
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\'
LINES TERMINATED BY '\n';
  • 需 FILE 權限、secure_file_priv 目錄寫入權限。
  • 文件不能存在,否則報錯。
  • 支持任意 SELECT(含 JOIN、聚合),可作報表生成器。

導入

LOAD DATA INFILE '/tmp/users_2023.csv'
INTO TABLE users
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\'
LINES TERMINATED BY '\n'
IGNORE 1 LINES  -- 若有表頭
(id, name, @created_at)
SET created_at = STR_TO_DATE(@created_at, '%Y-%m-%d %H:%i:%s');
  • LOCAL 關鍵字:客戶端讀文件發送給服務器,無需服務器 FILE 權限、繞過 secure_file_priv。
  • REPLACE/IGNORE 處理主鍵/唯一鍵衝突。
  • SET col = expr 列轉換/賦值。
  • LOW_PRIORITY 延遲插入直到無讀鎖。

四、mysqlimport 批量導入工具

# 等價於 LOAD DATA,命令行批量處理多文件
mysqlimport -u user -p --local --fields-terminated-by=, \
  --fields-enclosed-by='"' --lines-terminated-by='\n' \
  --ignore-lines=1 --columns='id,name,created_at' \
  db /path/users_2023.csv

文件名 = 表名(不含擴展名),支持通配符批量導入。

五、備份恢復策略設計

分級策略

級別頻率方式保留RPO/RTO
全量邏輯備份每日 1 次(低峰)mysqldump --single-transaction7-30 天RPO 24h / RTO 視數據量
增量備份每小時/每 15 分鐘binlog (FLUSH LOGS 切割) 或 xtrabackup --incremental7-30 天RPO 1h/15min / RTO 較長
物理快照每日/每 6 小時LVM/ZFS/云盤快照 + FLUSH TABLES WITH READ LOCK3-7 天RPO 6h / RTO 分鐘級
異地災備實時/每日主從複製 + 從庫備份 / 跨區域 binlog 同步長期RPO 秒級 / RTO 分鐘級

核心原則

  1. 備份必須可恢復:定期演練恢復流程,驗證文件完整性。
  2. 主從架構下從庫備份:不阻塞主庫,STOP SLAVE SQL_THREAD 保證一致性點。
  3. InnoDB 物理備份首選 xtrabackup:支持熱備份、增量、壓縮、流式傳輸,比 mysqldump 快 10 倍+。
  4. binlog 必開:log_bin=on, binlog_format=ROW, expire_logs_days=7, sync_binlog=1(金融級)。
  5. 加密傳輸與存儲:备份文件加密、傳輸走 SSL/VPN。

六、避坑清單

  • mysqldump 無 --single-transaction 導致 MyISAM 鎖表、InnoDB 一致性風險。
  • 字符集不匹配導致亂碼:導出導入均顯式指定 --default-character-set=utf8mb4。
  • secure_file_priv 限制導致 INTO OUTFILE 失敗:檢查變量值,文件放對應目錄或用 LOCAL。
  • 大事務導入 LOAD DATA 卡住:分批、關閉自動提交、調大 innodb_log_file_size。
  • 備份文件未壓縮佔滿磁盤:管道接 gzip/pigz 或 zstd。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved