命令列匯出 (mysqldump)
# 完整庫
mysqldump -u root -p --single-transaction --routines --events --triggers db_name > backup.sql
# 單表
mysqldump -u root -p db_name table_name > table.sql
# 僅結構
mysqldump -u root -p --no-data db_name > schema.sql
# 壓縮輸出
mysqldump -u root -p db_name | gzip > backup.sql.gz
命令列匯入
# 進入 mysql 建庫
mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS target_db;"
# 匯入
mysql -u root -p target_db < backup.sql
# 或 mysql 內部
mysql> USE target_db;
mysql> SOURCE /path/backup.sql;
常見錯誤與解決
| 錯誤訊息 | 原因 | 解決 |
| Unknown database 'xxx' | Shell 下執行 mysqldump 不需分號,資料庫名含特殊字元未加反引號 | 資料庫名加反引號 \`db_name\`,或先 mysql -e "CREATE DATABASE \`db_name\`;" |
| Access denied for user ''@'localhost' | 未指定 -u,或密碼錯誤 | 補齊 -u root -p |
| ERROR 1044 (42000): Access denied for user '@'localhost' to database 'mysql' | 免密登入 (--skip-grant-tables) 進入匿名用戶 | 正常登入或指定用戶 |
| Got a packet bigger than 'max_allowed_packet' | 大欄位 (BLOB/TEXT) 超過限制 | mysqldump --max_allowed_packet=1G、SET GLOBAL max_allowed_packet=1G |
| Character set 'utf8mb4' unsupported | 舊版 MySQL 導入新版備份 | 目標庫建表指定 CHARSET=utf8,或升級目標 MySQL |
| Table doesn't exist in engine | .ibd 檔遺失/損壞 | Discard/Import tablespace 或從備份恢復 |
大資料庫匯入優化
SET autocommit=0; SET unique_checks=0; SET foreign_key_checks=0; 關閉檢查
- 分檔匯入:
split -l 10000 backup.sql part_
- 使用
pv backup.sql | mysql -u root -p db 顯示進度
- 啟用
LOAD DATA INFILE 替代 INSERT (需 secure_file_priv 配合)
跨版本遷移清單
- 來源
mysql_upgrade (若升級)
- 目標
mysql_install_db / mysqld --initialize
- 備份前
FLUSH TABLES WITH READ LOCK (一致性)
- 匯入後
ANALYZE TABLE 更新統計資訊