前言
網站遷移或備份恢復時,MySQL 數據導入導出是核心操作。小數據量可用 phpMyAdmin,但大數據庫(超過 PHP 上傳限制、執行時間限制)必須使用命令行工具 mysqldump 導出與 mysql 導入,配合 SSH 與 wget 傳輸,效率極高。本文整理常用場景與參數,供快速查閱。
一、數據導出
基本語法
mysqldump --add-drop-table -h host -u user -p dbname > dbname.sql
-h:遠程主機,本機可省略
--add-drop-table:導出前加 DROP TABLE,便於覆蓋導入
- 輸入密碼後,SQL 文件生成於當前目錄
常見場景範例
| 場景 | 命令範例 |
| 全庫備份(含存儲過程、觸發器、鎖表、字符集) | mysqldump -u$USER -p$PASSWD -h127.0.0.1 -P3306 \
--routines --default-character-set=utf8 \
--lock-all-tables --add-drop-database -A > db.all.sql |
| 指定庫備份(如 mysql 系統庫) | mysqldump -u$USER -p$PASSWD -h127.0.0.1 -P3306 \
--routines --default-character-set=utf8 \
--databases mysql > db.sql |
| 指定表備份(如 mysql.user) | mysqldump -u$USER -p$PASSWD -h127.0.0.1 -P3306 \
--routines --default-character-set=utf8 \
--tables mysql user > db.table.sql |
| 僅導出數據(帶 WHERE 條件過濾) | mysqldump -u$USER -p$PASSWD -h127.0.0.1 -P3306 \
--routines --default-character-set=utf8 \
--no-create-db --no-create-info \
--tables mysql user --where="host='localhost'" > db.table.sql |
| 僅導出表結構(無數據) | mysqldump -u$USER -p$PASSWD -h127.0.0.1 -P3306 \
--routines --default-character-set=utf8 \
--no-data --databases mysql > db.nodata.sql |
| 導出查詢結果為 TSV(製表符分隔) | mysql -u$USER -p$PASSWD -h127.0.0.1 -P3306 \
--default-character-set=utf8 --skip-column-names -B \
-e 'select user,host,password from mysql.user;' > mysql_user.txt |
| 導出查詢結果為 CSV(逗號分隔,寫入服務器本地) | # 進入 MySQL 交互模式
SELECT user,host,password FROM mysql.user
INTO OUTFILE '/tmp/mysql_user.csv'
FIELDS TERMINATED BY ','; |
二、數據導入
基本語法
mysql -h host -u user -p dbname < dbname.sql
- 大數據量導入比 phpMyAdmin 快數十倍
- 本機導入可省略
-h
常見場景範例
| 場景 | 命令範例 |
| 全量恢復(含 mysql 系統庫,需執行 FLUSH PRIVILEGES) | # 方法一:管道導入
mysql -u$USER -p$PASSWD -h127.0.0.1 -P3306 --default-character-set=utf8 < db.all.sql
# 方法二:source 命令(需絕對路徑)
mysql -u$USER -p$PASSWD -h127.0.0.1 -P3306 --default-character-set=utf8
mysql> source /tmp/db.all.sql; |
| 恢復指定庫/表 | # 管道
mysql -u$USER -p$PASSWD -h127.0.0.1 -P3306 --default-character-set=utf8 mysql < db.table.sql
# source
mysql> use mysql;
mysql> source /tmp/db.table.sql; |
| 導入服務器端 TSV 文件(需 FILE 權限) | mysql> use mysql;
mysql> LOAD DATA INFILE '/tmp/mysql_user.txt' INTO TABLE user; |
| 導入服務器端 CSV 文件 | mysql> use mysql;
mysql> LOAD DATA INFILE '/tmp/mysql_user.csv' INTO TABLE user FIELDS TERMINATED BY ','; |
| 導入客戶端本地 TSV/CSV(LOCAL 關鍵字) | mysql> use mysql;
# TSV
mysql> LOAD DATA LOCAL INFILE '/tmp/mysql_user.txt' INTO TABLE user;
# CSV
mysql> LOAD DATA LOCAL INFILE '/tmp/mysql_user.csv' INTO TABLE user FIELDS TERMINATED BY ','; |
三、Linux 下傳統備份與還原速查
# 1. 進入數據目錄(視安裝路徑調整)
cd /var/lib/mysql
# 2. 備份單庫
mysqldump -u root -p voice > voice.sql
# 3. 還原 - 法一:進入交互模式
mysql -u root -p
mysql> use voice;
mysql> source voice.sql;
# 4. 還原 - 法二:管道直接導入
mysql -u root -p voice < voice.sql
小結
- 導出靈活組合
--routines、--default-character-set、--lock-all-tables、--no-data、--where 等參數應對各種需求。
- 導入優先使用管道重定向,大文件配合
source 或 LOAD DATA。
- 遷移前務必確認字符集一致,避免亂碼。