導出
# 進入 bin 目錄(或已加 PATH)
cd /usr/local/mysql/bin
# 導出單庫(含建表、數據、觸發器、存儲過程)
mysqldump -u root -p --single-transaction --routines --triggers --events db_name > /backup/db_name_$(date +%F).sql
# 導出多庫
mysqldump -u root -p --databases db1 db2 > /backup/multi_db.sql
# 導出全例(含 mysql 系統庫,謹慎)
mysqldump -u root -p --all-databases > /backup/full_$(date +%F).sql
# 只導結構(不含數據)
mysqldump -u root -p -d db_name > /backup/db_name_struct.sql
# 壓縮導出(管道)
mysqldump -u root -p db_name | gzip > /backup/db_name_$(date +%F).sql.gz
關鍵參數解析
| 參數 | 作用 |
--single-transaction | InnoDB 熱備份核心,開啟一致性快照,不鎖表 |
--routines | 導出存儲過程/函數 |
--triggers | 導出觸發器 |
--events | 導出 Event 調度器任務 |
--master-data=2 | 輸出註釋形式的 CHANGE MASTER TO 位置/GTID,用於從庫搭建 |
--set-gtid-purged=OFF | 不輸出 GTID 集合,避免跨版本導入報錯 |
--quick | 流式讀取,不緩存全表結果集,大表必加 |
導入
方法一:MySQL 客戶端 source 命令(交互式)
mysql -u root -p
CREATE DATABASE IF NOT EXISTS db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE db_name;
SOURCE /backup/db_name_2024-01-15.sql;
方法二:管道重定向(非交互,適合腳本)
mysql -u root -p db_name < /backup/db_name_2024-01-15.sql
# 或壓縮文件
zcat /backup/db_name_2024-01-15.sql.gz | mysql -u root -p db_name
方法三:多庫導入(含 CREATE DATABASE)
mysql -u root -p < /backup/multi_db.sql
# 或全例
mysql -u root -p < /backup/full_2024-01-15.sql
大數據量導入優化
- 關閉索引/外鍵/唯一檢查:
SET FOREIGN_KEY_CHECKS=0; SET UNIQUE_CHECKS=0; SET AUTOCOMMIT=0;
SOURCE big.sql;
SET FOREIGN_KEY_CHECKS=1; SET UNIQUE_CHECKS=1; SET AUTOCOMMIT=1;
- 調大 InnoDB 緩衝:
SET GLOBAL innodb_buffer_pool_size=4G;(臨時)。
- 並行導入:將大表按主鍵範圍拆分多個 SQL,多會話並行
SOURCE。
- 用
LOAD DATA 替代 INSERT:導出時 --tab 生成 CSV,導入用 LOAD DATA INFILE,速度提升 5-10 倍。
跨版本遷移注意
- 高版本導出 → 低版本導入:易報錯(語法、函數、數據類型不支援),需人工修正 SQL。
- 低版本 → 高版本:通常兼容,導入後**必須運行**
mysql_upgrade 更新系統表。
- 字符集不一致:導出前確認
SET NAMES utf8mb4,導入庫預設同字符集。
驗證導入結果
# 表行數對比
SELECT TABLE_NAME, TABLE_ROWS FROM information_schema.TABLES WHERE TABLE_SCHEMA='db_name';
# 核心表抽樣
SELECT COUNT(*) FROM db_name.core_table;
SELECT * FROM db_name.core_table ORDER BY id DESC LIMIT 5;