備份是資料庫生存底線。本文系統梳理 MySQL 邏輯備份 (mysqldump)、物理備份 (mysqlhotcopy/直複製)、恢復策略、異構遷移、以及 SELECT ... INTO OUTFILE / LOAD DATA INFILE 導入導出實戰,並對比 SQL Server/Oracle 差異,幫你建立完整備份體系。
| 參數 | 作用 |
|---|---|
--add-drop-table | 建表前加 DROP TABLE IF EXISTS,避免恢復報錯 |
--single-transaction | InnoDB 熱備必加,取得一致性快照不鎖表 |
--master-data=2 | 輸出 CHANGE MASTER 註釋,便於搭建從庫 |
--routines --triggers --events | 備份存儲過程/觸發器/事件 |
-B (--databases) | 含 CREATE DATABASE,跨庫遷移必備 |
-A (--all-databases) | 全例備份 |
-t (--no-create-info) | 僅導數據,不導結構 |
-d (--no-data) | 僅導結構 |
--where | 按條件導出子集 |
# 單庫全備(含建庫語句) mysqldump -u root -p --databases school --single-transaction --master-data=2 > school_$(date +%F).sql # 多庫備份 mysqldump -u root -p --databases school test > multi_$(date +%F).sql # 全例備份 mysqldump -u root -p --all-databases --single-transaction --master-data=2 > all_$(date +%F).sql # 單表備份 mysqldump -u root -p school book > school_book_$(date +%F).sql # 條件導出(如僅導 2023 年訂單) mysqldump -u root -p --where="order_date >= '2023-01-01'" shop orders > orders_2023.sql
character_set、time_zone、sql_mode 等會話變數,保證恢復環境一致/*!40101 ... */:僅 MySQL 4.01.01+ 執行,提升可移植性DROP TABLE IF EXISTS → CREATE TABLE → LOCK TABLES → DISABLE KEYS → INSERT → ENABLE KEYS → UNLOCK TABLESFLUSH TABLES WITH READ LOCKinnodb_fast_shutdown=0 且同版本恢復)FLUSH TABLES WITH READ LOCK → cp -r /var/lib/mysql /backup/ → UNLOCK TABLES# 语法 mysqlhotcopy db_name_1 ... db_name_n /path/to/new_directory # 示例 mysqlhotcopy -u root -p test /usr/backup
優點:極快(檔案級複製)、自動鎖表/flush。缺點:僅本機、非跨平台、不支援 InnoDB。
| 備份類型 | 還原命令 | 注意事項 |
|---|---|---|
| mysqldump SQL | mysql -u root -p dbname < backup.sql 或 SOURCE backup.sql | 需先建庫(除非含 CREATE DATABASE);SOURCE 僅在 mysql 客戶端有效 |
| 物理檔案 | 停服 → 覆蓋 datadir → 改擁有者 chown -R mysql:mysql → 啟服 | 主版本號必須相同;僅 MyISAM 可靠 |
| mysqlhotcopy | 停服 → cp -R /backup/test /var/lib/mysql/ → 改擁有者 → 啟服 | 同物理檔案 |
# 單庫 mysqldump -h src -u root -p dbname | mysql -h dst -u root -p # 全例 mysqldump -h src -u root -p --all-databases | mysql -h dst -u root -p
管道避免落地大檔案,網路帶寬許可下最快。
mysqldump 導出 → 新版 mysql 導入(InnoDB 必須此法)--compatible=mysql40 等相容參數,並人工檢查語法差異sed -i 's/latin1/utf8/g' dump.sql 或導入時指定 --default-character-set=utf8MySQL Migration Toolkit / SSMA / MyODBC + 導入導出嚮導SQL Developer / ora2mysql / CSV 中轉DATETIME vs Oracle DATE)、標識符引用符(反引號 vs 雙引號)、自增 vs SequenceSELECT * FROM test.person INTO OUTFILE '/tmp/person.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\"' LINES TERMINATED BY '\r\n';
需 FILE 權限,檔案生成於 Server 端。
mysqldump -T /tmp -u root -p test person -- 產生 person.sql (結構) + person.txt (數據,預設 tab 分隔)
mysql -u root -p --execute="SELECT * FROM test.person" test > person.txt mysql -u root -p --html --execute="SELECT * FROM test.person" test > person.html mysql -u root -p --xml --execute="SELECT * FROM test.person" test > person.xml
LOAD DATA INFILE '/tmp/person.csv' INTO TABLE test.person FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES; -- 跳過標題行
LOCAL 關鍵字:客戶端讀檔,無需 Server FILE 權限REPLACE / IGNORE:控制主鍵衝突行為INTO TABLE t (col1, col3) 實現欄位映射,異構導入利器mysqlimport -u root -p --fields-terminated-by=',' --ignore-lines=1 test /tmp/person.csv
檔名即表名,不支援欄位映射,適合同結構批量導入。
資料量 < 10GB 且需跨版本/異構 → mysqldump 資料量 > 50GB、純 MyISAM、同版本 → mysqlhotcopy / 直複製 資料量 > 100GB、InnoDB 為主、需熱備 → Percona XtraBackup (物理增量、流式、壓縮) 雲上托管 → 云廠商快照/備份服務 (RDS 自動備份、PITR)
--databases:僅導表無 CREATE DATABASE,刪庫後無法直接恢復。--single-transaction:InnoDB 熱備不加會鎖表或數據不一致。--default-character-set=utf8mb4。CHECKSUM TABLE、行數、關鍵業務查詢。建立「備份→驗證→異地存儲→定期演練」閉環,才是資料安全的真正保障。