MySQL命令行導出導入數據庫實操指南
mysqldump 與 source 是 MySQL 命令行備份恢復的核心工具組合,無需圖形化介面,適合腳本自動化、服務器無界面環境、大數據量操作。本文記錄標準操作流程、常用參數、大數據優化技巧及常見問題。
一、導出數據庫:mysqldump
1.1 基礎語法
mysqldump -u 用戶名 -p [選項] 數據庫名 [表名...] > 導出文件.sql
# 示例:導出整庫
mysqldump -u root -p mydb > mydb_full_$(date +%F).sql
# 示例:導出單表
mysqldump -u root -p mydb t_user > mydb_t_user.sql
# 示例:導出多表
mysqldump -u root -p mydb t_user t_order > mydb_two_tables.sql
1.2 核心參數詳解
| 參數 | 作用 | 推薦場景 |
--single-transaction | 啟動一致性快照 (InnoDB專用),無鎖導出 | 生產環境必加,避免阻塞寫入 |
--routines | 導出存儲過程/函數 | 完整備份必加 |
--triggers | 導出觸發器 | 完整備份必加 |
--events | 導出定時事件 | 完整備份必加 |
--master-data=2 | 輸出 Binlog 位置 (註釋形式),用於主從搭建/增量恢復 | 主庫備份建議加 |
--flush-logs | 導出前切換 Binlog | 配合增量備份 |
--where="condition" | 導出符合條件的數據 | 分表/歸檔導出 |
--no-data | 僅導出結構 (DDL) | 結構遷移/對比 |
--no-create-info | 僅導出數據 (INSERT) | 數據遷移/合並 |
--compact | 精簡輸出 (禁用註釋、SET語句等) | 減小文件體積 |
--hex-blob | 二進制列用十六進制導出 | 含 BLOB/BINARY/GEOMETRY 列必加 |
--default-character-set=utf8mb4 | 指定連接字符集 | 防止亂碼,強制指定 |
1.3 生產環境推薦命令模板
# 完整備份 (結構+數據+對象+Binlog位置)
mysqldump -u backup_user -p'xxx' \
--single-transaction \
--routines --triggers --events \
--master-data=2 \
--default-character-set=utf8mb4 \
--hex-blob \
mydb > mydb_full_$(date +%F_%H%M).sql
# 僅結構
mysqldump -u root -p --no-data --routines --triggers --events mydb > mydb_struct.sql
# 大表分批導出 (配合 where 條件)
mysqldump -u root -p --where="id BETWEEN 1 AND 100000" mydb big_table > big_table_part1.sql
二、導入數據庫:source / mysql 命令
2.1 方式一:mysql 客戶端管道導入 (推薦、非交互、適合腳本)
# 1. 創建目標庫 (若不存在)
mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;"
# 2. 導入
mysql -u root -p --default-character-set=utf8mb4 mydb < mydb_full_20231001.sql
# 3. 驗證
mysql -u root -p -e "USE mydb; SHOW TABLES; SELECT COUNT(*) FROM t_user;"
2.2 方式二:交互模式 source 命令 (適合調試、分步執行)
mysql -u root -p
# 進入交互模式
CREATE DATABASE IF NOT EXISTS mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE mydb;
SOURCE /path/to/mydb_full_20231001.sql;
# 執行完成顯示 Query OK 行數統計
2.3 導入常用優化參數
| 參數/設置 | 作用 | 適用場景 |
SET autocommit=0; + COMMIT; | 關閉自動提交,手動控制事務邊界 | 大量 INSERT 導入,顯著提速 |
SET unique_checks=0; / SET foreign_key_checks=0; | 暫時關閉唯一/外鍵約束檢查 | 大數據導入,導入後重新開啟驗證 |
SET sql_log_bin=0; | 當前會話不記錄 Binlog | 從庫導入/數據修復,避免 Binlog 膨脹 |
--force | 遇到錯誤繼續執行 | 導入已知有髒數據的文件 |
2.4 大數據導入優化腳本模板
#!/bin/bash
# import_large.sh
DB_USER="root"
DB_PASS="xxx"
DB_NAME="mydb"
SQL_FILE="mydb_full.sql"
mysql -u$DB_USER -p$DB_PASS -e "CREATE DATABASE IF NOT EXISTS $DB_NAME CHARACTER SET utf8mb4;"
mysql -u$DB_USER -p$DB_PASS $DB_NAME <
三、常見問題與解決
| 問題 | 原因 | 解決 |
| ERROR 1064: You have an error in your SQL syntax | 版本不兼容 (5.7導出到8.0/反向) / 保留字衝突 | 加 --compatible=mysql40 / 目標版本安裝 mysql_upgrade / 手動修正 SQL |
| ERROR 1153: Got a packet bigger than 'max_allowed_packet' | 單條 INSERT 過大 (大字段/批量行) | 導入端臨時調大:SET GLOBAL max_allowed_packet=1073741824; (1GB) |
| ERROR 1213: Deadlock found when trying to get lock | 並發導入/約束檢查死鎖 | 關閉 foreign_key_checks / 單線程導入 |
| 導入後中文亂碼 | 字符集不匹配 (導出 latin1、導入 utf8mb4) | 導出導入雙端強制 --default-character-set=utf8mb4 |
| Access denied for user 'root'@'localhost' | 權限不足/密碼錯誤 | 確認用戶擁有目標庫 ALL PRIVILEGES |
| Unknown database 'mydb' | 目標庫不存在 | 導入前先 CREATE DATABASE |
四、進階:邏輯備份 vs 物理備份選型
| 維度 | mysqldump (邏輯備份) | xtrabackup / 快照 (物理備份) |
| 數據量適用 | < 50-100GB | > 100GB、TB級 |
| 備份速度 | 慢 (SQL解析、轉換、壓縮) | 極快 (文件級拷貝、流式傳輸) |
| 恢復速度 | 慢 (SQL重放、建索引) | 快 (文件拷貝+Redo應用) |
| 跨版本/引擎遷移 | 支持良好 | 不支持 (需同版本、同引擎、同頁面大小) |
| 一致性保證 | --single-transaction (InnoDB) | 原生支持、無鎖 |
| 工具成熟度 | 官方內置、無依賴 | Percona xtrabackup (需安裝) |
建議: 核心業務 邏輯備份 + 物理備份雙軌制:每日 mysqldump 全量邏輯備份 (異地存儲、跨版本可用) + 每小時 xtrabackup 增量物理備份 (快速恢復 RTO)。
- 上一篇文章: Windows下MySQL 5.1/5.7下載安裝配置與圖形化工具完整教程
- 下一篇文章: MySQL 5.7 安全特性深度解析:賬號管理、密碼策略、SSL、SQL Mode
Copyright ©
程式碼之家 All Rights Reserved