備份是資料庫最後一道防線。本文實戰演示 mysqldump 邏輯備份(庫/表/結構/數據分離)與 SELECT ... INTO OUTFILE 文本導出兩大體系,含恢復命令與自動化腳本思路。
| 場景 | 命令 | 輸出內容 |
|---|---|---|
| 備份單表 | mysqldump -u root -p db t1 t2 > backup.sql | 建表+插入語句 |
| 備份全庫 | mysqldump -u root -p db > backup.sql | 所有表結構與數據 |
| 備份多庫 | mysqldump -u root -p -B db1 db2 > backup.sql | 含 CREATE DATABASE |
| 備份全例項 | mysqldump -u root -p -A > full.sql | 所有庫所有表 |
# 僅導出結構(無數據)
mysqldump -u root -p -d db t1 > struct.sql
# 僅導出數據(無建表語句)
mysqldump -u root -p -t db t1 > data.sql
#!/bin/bash
BakDir=/backup/mysql
Date=$(date +%Y%m%d)
mysqldump -u root -p'password' db_name --single-transaction | gzip > $BakDir/db_$Date.sql.gz
# 保留 7 天
find $BakDir -name "*.sql.gz" -mtime +7 -delete
適用於大量數據高速導出導入(比 SQL 文本快 5-10 倍),但需 FILE 權限且文件落在 Server 端。
-- 導出全表數據(制表符分隔、換行符結尾)
SELECT * FROM db.t INTO OUTFILE '/tmp/t.txt'
FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n';
-- 導出指定列
SELECT id, name FROM db.t INTO OUTFILE '/tmp/t.txt';

LOAD DATA INFILE '/tmp/t.txt' INTO TABLE db.t
FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
(id, name); -- 指定列順序

# 恢復單表
mysql -u root -p db < backup.sql
# 恢復全庫(含 CREATE DATABASE)
mysql -u root -p < full_backup.sql
mysql> USE db;
mysql> SOURCE /path/backup.sql;
-- 或
mysql> \. /path/backup.sql
SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER, RELOAD, FILE「備份不驗證,等於沒備份。」建立「備份→驗證→恢復演練」閉環,才是真正的數據安全。