本次實驗在 MySQL 5.0.85 環境下進行,目標資料庫為 test,包含 sms 和 email 兩張表。實驗內容涵蓋完整庫備份、單表備份、結構與數據分離導出,以及異機恢復的完整流程。
# mysqldump -uroot -p test > /mnt/zbtest.sql
備份生成的 SQL 文件主要包含兩部分:建表語句(DDL)與插入語句(DML)。文件頭部包含字符集、時區、外鍵檢查等會話變量設置,確保恢復時環境一致。
通過 vi /mnt/zbtest.sql 查看,典型結構如下:
SET @OLD_CHARACTER_SET_CLIENT 等)DROP TABLE IF EXISTS + CREATE TABLELOCK TABLES、ALTER TABLE ... DISABLE KEYS、批量 INSERT、ENABLE KEYS、UNLOCK TABLES此結構設計可最大化導入效率:禁用索引更新、批量寫入、最後重建索引。
# mysql -u root -pchangyou.com zbdump < /mnt/zbtest.sql
ERROR 1049 (42000): Unknown database 'zbdump'
原因:目標資料庫 zbdump 不存在。mysqldump 預設不包含 CREATE DATABASE 語句(除非使用 -B/--databases 參數)。
mysql> CREATE DATABASE zbdump;
mysql> exit
# mysql -u root -pchangyou.com zbdump < /mnt/zbtest.sql
mysql> USE zbdump;
mysql> SHOW TABLES;
+------------------+
| Tables_in_zbdump |
+------------------+
| email |
| sms |
+------------------+
mysql> SELECT COUNT(*) FROM email; -- 1,600,000 行
mysql> SELECT COUNT(*) FROM sms; -- 250,000 行
表結構、行數與原庫完全一致,恢復成功。
# mysqldump -uroot -p --tables zbdump email > /mnt/zbdump_email.sql
# mysqldump -uroot -p -T /tmp zbdump sms
生成兩個文件:
sms.sql:建表語句sms.txt:純文本數據(Tab 分隔),適合 LOAD DATA INFILE 高速導入注意:-T 要求 mysqldump 與 mysqld 運行在同一台機器,且導出目錄需 mysql 用戶寫入權限。
# mysqldump -uroot -p -d zbdump email > email_struct.sql
# mysqldump -uroot -p -d zbdump sms email > /tmp/zbdump_struct.sql
# mysql -uroot -p test < /tmp/zbdump_struct.sql
| 參數 | 含義 |
|---|---|
-B/--databases | 導出多個資料庫,含 CREATE DATABASE |
-d/--no-data | 僅導出結構 |
-t/--no-create-info | 僅導出數據 |
-R/--routines | 導出存儲過程/函數 |
-E/--events | 導出事件調度器 |
-T/--tab | 分離導出 SQL 與文本數據 |
--single-transaction | InnoDB 熱備份必備,保證一致性視圖 |
--master-data=2 | 輸出 CHANGE MASTER 註釋,便於主從搭建 |
--single-transaction --master-data=2,實現無鎖一致性備份並記錄 Binlog 位點。-T 分離導出,配合 LOAD DATA INFILE 恢復,速度提升 5-10 倍。mysqldump ... | gzip > backup.sql.gz 節省帶寬與存儲。