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

Linux 下 mysqldump 備份與還原完整指南

     編輯:MySQL 資料庫相關知識

核心備份命令速查

場景命令範例說明
完整備份單一資料庫mysqldump db_name > backup.sql含結構與資料
指定帳號密碼備份mysqldump -u root -p db_name > backup.sql提示輸入密碼(較安全)
備份所有資料庫mysqldump -A -u root -p > all_dbs.sql-A = --all-databases
僅備份結構(無資料)mysqldump -d db_name -u root -p > schema.sql-d = --no-data
僅備份資料(無結構)mysqldump -t db_name -u root -p > data.sql-t = --no-create-info
備份指定資料表mysqldump -u root -p db_name tbl1 tbl2 > tables.sql多表以空格分隔
含 DROP TABLE 陳述式mysqldump --add-drop-table db_name > backup.sql還原前自動刪除舊表
壓縮備份(管道)mysqldump -u root -p db_name | gzip > backup.sql.gz節省磁碟空間

還原操作


# 還原單一資料庫(需先建立資料庫)
mysql -u root -p db_name < backup.sql

# 還原所有資料庫
mysql -u root -p < all_dbs.sql

# 直接在 MySQL 客戶端執行
mysql> SOURCE /path/to/backup.sql;

進階參數與最佳實踐

一致性備份關鍵參數


# 單交易一致性快照(InnoDB 推薦)
mysqldump --single-transaction --master-data=2 -u root -p db_name > backup.sql

# 參數解釋:
# --single-transaction: 在 REPEATABLE READ 隔離級別下開啟交易,獲得一致性視圖(僅適用 InnoDB)
# --master-data=2: 在輸出中以註釋形式記錄 Binlog 位點(CHANGE MASTER TO),用於從庫搭建
# --routines: 匯出存儲過程/函數
# --triggers: 匯出觸發器(預設開啟)
# --events: 匯出事件排程器任務
# --hex-blob: 二進制欄位以十六進制輸出,避免編碼問題

大數據量優化技巧

  • 分表並行匯出:配合 xargs -P 或 GNU Parallel 多線程加速
  • 避免鎖表:InnoDB 必加 --single-transaction;MyISAM 只能 --lock-tables(會阻塞寫入)
  • 分塊匯入:大 SQL 檔拆分為多個小檔,減少單次交易體積與回滾風險
  • --quick(預設開啟):逐行讀取而非緩衝整個結果集,降低記憶體佔用

結構變更常用 ALTER 語句

操作語法範例
重命名欄位ALTER TABLE tbl CHANGE old_col new_col INT;
修改欄位型別(保留名稱)ALTER TABLE tbl CHANGE col col BIGINT NOT NULL;
重命名資料表ALTER TABLE old_tbl RENAME new_tbl;
新增欄位ALTER TABLE tbl ADD col_name VARCHAR(50);
刪除欄位ALTER TABLE tbl DROP col_name;

常見問題排查

現象原因對策
還原報錯 Table already exists目標庫已有同名表備份加 --add-drop-table,或先 DROP DATABASE
還原資料截斷/型別不符目標表結構與備份不一致確保目標表結構相容,或僅導入資料 -t
備份耗時極長、佔用大量記憶體大表無 --quick、緩衝過大確認 --quick 生效,調整 --max-allowed-packet
GTID 複寫環境還原後主從報錯備份含 GTID 資訊衝突使用 --set-gtid-purged=OFF 或匯入前 RESET MASTER

自動化備份腳本範例


#!/bin/bash
# /usr/local/bin/mysql_backup.sh
BACKUP_DIR="/backup/mysql"
DATE=$(date +%F_%H-%M)
DB_USER="backup_user"
DB_PASS="xxxxxx"
DBS="db1 db2 db3"  # 或留空代表所有

mkdir -p $BACKUP_DIR

for DB in $DBS; do
    mysqldump --single-transaction --master-data=2 \
        --routines --triggers --events --hex-blob \
        -u$DB_USER -p$DB_PASS $DB | gzip > $BACKUP_DIR/${DB}_${DATE}.sql.gz
    
    # 保留最近 7 天
    find $BACKUP_DIR -name "${DB}_*.sql.gz" -mtime +7 -delete
done

加入 crontab -e:0 2 * * * /usr/local/bin/mysql_backup.sh 每天凌晨 2 點執行。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved