備份是資料庫災難恢復的最後防線。本文系統整理 mysqldump 邏輯備份、mysqlhotcopy 物理備份(MyISAM 專用)、壓縮管道、跨伺服器遷移、還原驗證的完整指令集,並說明 MyISAM 與 InnoDB 參數差異。
/usr/local/mysql/bin/mysqldump \
-u yejr -p yejr \
--default-character-set=utf8 \
--opt --extended-insert=false \
--triggers -R --hex-blob -x \
db_name > db_name.sql
-x / --lock-all-tables:鎖定所有表,確保 MyISAM 一致性。
/usr/local/mysql/bin/mysqldump \
-u yejr -p yejr \
--default-character-set=utf8 \
--opt --extended-insert=false \
--triggers -R --hex-blob \
--single-transaction \
db_name > db_name.sql
關鍵差異:--single-transaction 替代 -x,利用 MVCC 實現一致性非阻塞備份,**InnoDB 必加**。
| 場景 | 命令範例 |
|---|---|
| 僅結構 | mysqldump -u user -p --no-data --add-drop-table db > schema.sql |
| 僅資料 | mysqldump -u user -p --no-create-info db > data.sql |
| 指定表 | mysqldump -u user -p db tbl1 tbl2 > tables.sql |
| 多庫備份 | mysqldump -u user -p --databases db1 db2 db3 > multi.sql |
| 全例備份 | mysqldump -u user -p --all-databases > all.sql |
| 帶 WHERE 條件 | mysqldump -u user -p --where="id>100" db tbl > part.sql |
| 壓縮輸出 | mysqldump -u user -p db | gzip > db.sql.gz |
/usr/local/mysql/bin/mysql -u yejr -p yejr db_name < db_name.sql
mysql -u yejr -p yejr
mysql> USE db_name;
mysql> SOURCE /tmp/db_name.sql;
gunzip < db_name.sql.gz | mysql -u yejr -p yejr db_name
# 或
zcat db_name.sql.gz | mysql -u yejr -p yejr db_name
⚠️ 已在 MySQL 5.7+ 移除,僅供舊版 MyISAM 環境參考。InnoDB 請用 mysqldump --single-transaction 或 Percona XtraBackup。
# 單庫
mysqlhotcopy -h localhost -u yejr -p yejr db_name /backup/dir
# 多庫
mysqlhotcopy -h localhost -u yejr -p yejr db1 db2 db3 /backup/dir
# 正則匹配庫名
mysqlhotcopy -h localhost -u yejr -p yejr 'db_name.*' /backup/dir
# 1. 停止 MySQL
systemctl stop mysqld
# 2. 複製資料庫目錄到 datadir
cp -rf /backup/dir/db_name /var/lib/mysql/
# 3. 修正權限
chown -R mysql:mysql /var/lib/mysql/db_name
# 4. 啟動 MySQL
systemctl start mysqld
shell> mysqldump --quick db_name | gzip > db_name.contents.gz
# 還原
shell> gunzip < db_name.contents.gz | mysql db_name
# 遷移至遠端主機
shell> mysqldump -u user -p db_name | mysql --host=remote_ip -C db_name
# -C: 啟用壓縮協議傳輸
CHECKSUM TABLE、pt-table-checksum(主從一致性)。
# 安裝
yum install percona-xtrabackup-80 # 或 apt
# 完全備份(非阻塞)
xtrabackup --backup --target-dir=/backup/full --user=root --password=xxx
# 增量備份
xtrabackup --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/full --user=root --password=xxx
# 準備(合併增量、應用日誌)
xtrabackup --prepare --target-dir=/backup/full
xtrabackup --prepare --target-dir=/backup/full --incremental-dir=/backup/inc1
# 還原(需停庫、清空 datadir)
xtrabackup --copy-back --target-dir=/backup/full --datadir=/var/lib/mysql
chown -R mysql:mysql /var/lib/mysql
systemctl start mysqld
XtraBackup 支援 InnoDB 熱備份、增量、壓縮、並行、流式傳輸,是**生產環境 InnoDB 物理備份的標準選擇**。