資料庫備份與遷移是運維的核心技能。本文針對虛擬主機 (共享環境) 與服務器/VPS (獨享環境) 兩大典型場景,提供從圖形工具到命令列的完整匯入匯出方案,涵蓋 mysqldump、source、PHPMyAdmin、程式內建備份等多種手段,並針對大數據量、權限不足、鎖表報錯等常見問題給出解決方案。
# PHP 設定限制 (通常無法修改)
upload_max_filesize = 2M~50M
post_max_size = 8M~100M
max_execution_time = 30~300s
memory_limit = 128M~512M
# 後果:超過限制的大數據庫會導致匯入/匯出超時、記憶體溢位、檔案截斷
mysqldump 或 PHP 原生 API 分卷壓縮.sql.gz → FTP/面板下載root 或資料庫專用帳號密碼mysqldump/mysql 命令在 PATH 中 (Linux 通常在 /usr/bin/,Windows 在 安裝目錄/bin/)# 匯出 (備份)
mysqldump -u root -p --databases db1 > /backup/db1_$(date +%F).sql
# 輸入密碼後執行
# 進階:排除表、壓縮、單事務一致性
mysqldump -u root -p \
--single-transaction \
--routines --triggers --events \
--ignore-table=db1.log_table \
--databases db1 | gzip > /backup/db1_$(date +%F).sql.gz
# 匯入 (還原)
mysql -u root -p < /backup/db1_2024-01-15.sql
# 或進入 mysql 後
SOURCE /backup/db1_2024-01-15.sql;
# 指定多個庫
mysqldump -u root -p --databases db1 db2 db3 > multi_db.sql
# 所有庫 (含系統庫 mysql、sys、performance_schema、information_schema)
mysqldump -u root -p --all-databases > all_dbs.sql
# 注意:還原時會覆蓋目標實例的用戶、權限、系統表,跨版本/跨實例慎用
# 僅結構 (無數據)
mysqldump -u root -p --no-data --databases db1 > db1_struct.sql
# 僅數據 (無結構,需配合 --no-create-db --no-create-info)
mysqldump -u root -p --no-create-db --no-create-info --databases db1 > db1_data.sql
# 單表結構
mysqldump -u root -p --no-data db1 tbl1 > tbl1_struct.sql
mysqldump -u root -p --where="created_at > '2024-01-01'" db1 tbl1 > tbl1_2024.sql
# 僅導出符合條件的行,適合歷史數據歸檔、分表遷移
mysqldump -u root -p -T /tmp/export_dir \
--fields-terminated-by=',' \
--fields-enclosed-by='"' \
--lines-terminated-by='\n' \
db1 tbl1
# 產生 tbl1.sql (結構) + tbl1.txt (CSV 數據)
# 需求:Server 有 /tmp/export_dir 寫入權限、secure_file_priv 允許該路徑
# 1. 進入命令列
Win+R → cmd
# 2. 切換到 MySQL bin 目錄
cd "C:\Program Files\MySQL\MySQL Server 8.0\bin"
# 3. 執行命令 (參數同 Linux)
mysqldump -u root -p db1 > D:\backup\db1.sql
mysql -u root -p db1 < D:\backup\db1.sql
# 4. 解決 "when using LOCK TABLES" 報錯
mysqldump -u root -p --skip-lock-tables db1 > db1.sql
# 原因:備份帳號無 LOCK TABLES 權限,跳過鎖表 (InnoDB 配合 --single-transaction 不需鎖表)
| 問題 | 原因 | 解決方案 |
|---|---|---|
| Access denied; you need (at least one of) the PROCESS privilege(s) | MySQL 5.7.31+/8.0.21+ mysqldump 需 PROCESS 權限查看系統變數 | 授權:GRANT PROCESS ON *.* TO 'backup_user'@'%'; 或升級 mysqldump 版本 |
| Lock wait timeout exceeded / Table is locked | 備份期間表被鎖、長事務阻塞 | 加 --single-transaction (InnoDB) 或 --skip-lock-tables |
| Got error: 1016: Can't open file: './db/tbl.frm' (errno: 24) | 打開文件句柄數超限 | 調大 open_files_limit、table_open_cache,重啟 MySQL |
| MySQL server has gone away | 大數據包超時、連線中斷 | 增大 max_allowed_packet (客戶端/Server 同調)、檢查網路穩定性 |
| Unknown collation: 'utf8mb4_0900_ai_ci' | 跨版本匯入 (8.0 → 5.7) 排序規則不支援 | 匯出時加 --compatible=mysql57 或目標庫升級 |
| 中文亂碼 | 字符集不一致 | 匯出/匯入全鏈路指定 --default-character-set=utf8mb4,目標庫表同字符集 |
mydumper / myloader (多線程、分塊、壓縮)--where="id BETWEEN 1 AND 1000000" 分批次mysqldump ... | gzip | ssh target "gunzip | mysql ..." (避免落地磁碟)Percona XtraBackup (熱備份、不鎖表、增量、恢復快)FLUSH TABLES WITH READ LOCK)# 1. 行數校驗
SELECT COUNT(*) FROM src_db.tbl;
SELECT COUNT(*) FROM dst_db.tbl;
# 2. 校驗和對比 (需相同排序)
mysqldump --no-create-info --order-by-primary db1 tbl1 | md5sum
# 目標庫同理
# 3. 關鍵業務抽樣
SELECT * FROM dst_db.tbl WHERE id IN (1,100,1000,10000);
# 4. 應用層煙霧測試
# 啟動應用指向新庫,跑核心流程 (登入、查詢、寫入、報表)
選擇正確的匯入匯出工具與參數,是資料安全遷移的前提。**虛擬主機借力平台工具,服務器掌握命令列核心,大數據上物理備份/並行工具**。建立標準化備份腳本、驗證流程、定期演練,才能在災難發生時從容應對。