掌握命令列操作是 DBA 與開發者的核心技能。本文系統整理資料庫/表管理、資料操作、匯入匯出、備份還原、文字檔匯入五大場景的標準指令與最佳實務。
; 直接換行,提示符變 ->,補 ; 送出\c 取消當前多行輸入history 列表\G 替代 ;SOURCE /path/file.sql 或 mysql -u root -p db < file.sql-- 列出所有資料庫 SHOW DATABASES; -- 建立資料庫 (指定字元集) CREATE DATABASE business_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 切換資料庫 USE business_db; -- 刪除資料庫 DROP DATABASE IF EXISTS old_db;
-- 列出當前資料庫所有表 SHOW TABLES; -- 查看表結構 DESCRIBE users; -- 或 SHOW CREATE TABLE users\G -- 建表示例 (InnoDB + utf8mb4) CREATE TABLE users ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, email VARCHAR(100) NOT NULL, password_hash CHAR(60) NOT NULL COMMENT 'bcrypt hash', status TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '1=active,0=inactive', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_status (status), INDEX idx_created (created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- 刪除表 DROP TABLE IF EXISTS temp_table; -- 清空表資料 (保留結構、重置 AUTO_INCREMENT) TRUNCATE TABLE logs;
-- 插入單筆
INSERT INTO users (username, email, password_hash) VALUES ('john', 'john@example.com', '$2b$12$...');
-- 批次插入 (高效)
INSERT INTO users (username, email, password_hash) VALUES
('alice', 'alice@example.com', '$2b$12$...'),
('bob', 'bob@example.com', '$2b$12$...'),
('carol', 'carol@example.com', '$2b$12$...');
-- 更新
UPDATE users SET status = 0 WHERE last_login < DATE_SUB(NOW(), INTERVAL 1 YEAR);
-- 刪除 (謹慎使用,建議軟刪除)
DELETE FROM users WHERE id = 123;
-- 查詢
SELECT id, username, email, status FROM users WHERE status = 1 ORDER BY created_at DESC LIMIT 20;
FIELDS TERMINATED BY ','ENCLOSED BY '"'LINES TERMINATED BY '\r\n'\N (預設) 或自訂IGNORE 1 LINES 跳過-- 基本匯入 (Tab 分隔、無標題) LOAD DATA LOCAL INFILE '/data/users.txt' INTO TABLE users; -- CSV 匯入 (有標題行、雙引號包圍) LOAD DATA LOCAL INFILE '/data/users.csv' INTO TABLE users FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES (username, email, @password_raw) SET password_hash = SHA2(@password_raw, 256); -- 大檔案優化 SET SESSION bulk_insert_buffer_size = 256M; SET SESSION unique_checks = 0; SET SESSION foreign_key_checks = 0; LOAD DATA ... SET SESSION unique_checks = 1; SET SESSION foreign_key_checks = 1;
LOCAL 關鍵字:檔案在客戶端,經網路傳輸至伺服器 (需客戶端/伺服器均啟用 local_infile=1)LOCAL:檔案必須在伺服器端,需 FILE 權限local_infile,使用伺服器端匯入或應用層批次寫入# 備份單一資料庫 (含結構+資料、觸發器、常規) mysqldump -u root -p --single-transaction --routines --triggers --events business_db > business_db_$(date +%F).sql # 備份單一表 mysqldump -u root -p --single-transaction business_db users > users_$(date +%F).sql # 僅備份結構 (無資料) mysqldump -u root -p --no-data business_db > schema_only.sql # 壓縮備份 (管道串流,不佔暫存空間) mysqldump -u root -p --single-transaction business_db | gzip > business_db_$(date +%F).sql.gz # 遠端備份 mysqldump -h 192.168.1.100 -u root -p --single-transaction business_db | gzip > remote_backup.sql.gz
| 參數 | 用途 |
|---|---|
--single-transaction | InnoDB 一致性備份 (不鎖表),必加 |
--routines --triggers --events | 包含存儲過程、觸發器、事件 |
--master-data=2 | 備份檔含 CHANGE MASTER TO 註解 (建立 Slave 用) |
--hex-blob | 二進位欄位用十六進位表示 (避免編碼問題) |
--quick | 大表串流讀取,不緩存全表記憶體 |
# 1. 建立目標資料庫 mysql -u root -p -e "CREATE DATABASE business_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" # 2. 建立應用帳號 (參考權限管理文章) # 3. 還原 (解壓管道串流) gunzip < business_db_2024-01-15.sql.gz | mysql -u root -p business_db # 或直接還原 SQL 檔 mysql -u root -p business_db < business_db_2024-01-15.sql # 4. 驗證 mysql -u root -p -e "USE business_db; SHOW TABLES; SELECT COUNT(*) FROM users;"
#!/bin/bash
# /usr/local/bin/mysql_backup.sh
BACKUP_DIR="/backup/mysql"
DB_USER="backup_user"
DB_PASS="strong_password"
DBS="business_db logging_db"
RETENTION_DAYS=7
mkdir -p "$BACKUP_DIR"
for DB in $DBS; do
FILE="$BACKUP_DIR/${DB}_$(date +%F_%H-%M).sql.gz"
mysqldump -u "$DB_USER" -p"$DB_PASS" --single-transaction --routines --triggers --events "$DB" | gzip > "$FILE"
echo "[$(date)] Backup $DB -> $FILE"
done
# 清理舊備份
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete
echo "[$(date)] Cleanup completed"
# Crontab: 每天凌晨 2:30 執行 30 2 * * * /usr/local/bin/mysql_backup.sh >> /var/log/mysql_backup.log 2>&1
命令列操作無捷徑,唯有大量練習建立肌肉記憶。建議在測試環境完整演練「建庫 → 建表 → 匯入 → 備份 → 還原 → 驗證」全流程,再上生產環境。