記錄 Windows/Linux 下 MySQL 開發運維高頻場景與避坑指南,涵蓋字符集深度對比、備份恢復標準流程、SQL 腳本多種執行方式、Delete/Truncate/Drop 差異、核心 DDL/DML 語法速查。
| 特性 | CHAR(M) | VARCHAR(M) | TEXT |
|---|---|---|---|
| 長度類型 | 定長 | 變長 | 變長 |
| 存儲上限 | M ≤ 255 字節 | M ≤ 65,535 字節 (行總長限制) | 64KB (TEXT)、16MB (MEDIUMTEXT)、4GB (LONGTEXT) |
| 實際佔用 | M 字節 (右補空格) | L+1/2 字節 (L=實際長度) | L+2 字節 |
| 中文存儲 | 1 字節/字符 (視字符集) | 2 字節/字符 (utf8) | 2 字節/字符 (utf8) |
| 大小寫敏感 | 不區分 (預設 CI 校對) | 不區分 | 不區分 |
| 適用場景 | 固定長度代碼 (MD5、UUID、郵編) | 通用變長文本 (姓名、標題、URL) | 長文本 (文章、日誌、JSON 文檔) |
建議:新項目全鏈路 utf8mb4,列類型優先 VARCHAR,超長文本用 TEXT 族,慎用 CHAR 除非長度極固定且高頻讀寫。
# 單庫備份 mysqldump -u user_name -p database_name > /backup/db_$(date +%F).sql # 多庫備份 mysqldump -u user_name -p --databases db1 db2 > /backup/multi_db.sql # 全量備份(含用戶權限) mysqldump -u user_name -p --all-databases --single-transaction --master-data=2 --routines --triggers --events > /backup/full_$(date +%F).sql
關鍵參數:
--single-transaction:InnoDB 熱備一致性視圖,無需鎖表。--master-data=2:輸出 Binlog 位點註釋,便利 PITR。--routines --triggers --events:包含存儲過程/觸發器/事件。# 完全備份 xtrabackup --backup --target-dir=/backup/full_$(date +%F) --user=root --password # 增量備份 (基於上一次完全備份) xtrabackup --backup --target-dir=/backup/inc_$(date +%F) --incremental-basedir=/backup/full_20240101 # 恢復準備 xtrabackup --prepare --target-dir=/backup/full_20240101 xtrabackup --prepare --target-dir=/backup/full_20240101 --incremental-dir=/backup/inc_20240102 # 複制回數據目錄 (需停庫) xtrabackup --copy-back --target-dir=/backup/full_20240101
| 場景 | 命令 | 說明 |
|---|---|---|
| 未登錄 Shell | mysql -h localhost -u user -p < /backup/db.sql | 管道導入,適合自動化腳本 |
| 已登錄 mysql> | source /backup/db.sql | 相對/絕對路徑均可 |
| 已登錄 mysql> | \. /backup/db.sql | source 簡寫,交互式常用 |
-- 方法一:雙單引號轉義 (標準 SQL)
INSERT INTO t(content) VALUES ('It''s a test');
-- 方法二:反斜杠轉義 (MySQL 預設開啟 NO_BACKSLASH_ESCAPES 影響)
INSERT INTO t(content) VALUES ('It\'s a test');
-- 最佳實踐:使用參數化查詢 (PreparedStatement),驅動層自動處理轉義,杜絕 SQL 注入。
# 1. 查看錯誤日誌 cat /var/lib/mysql/$(hostname).err # 關鍵錯誤: [ERROR] Do you already have another mysqld server running on port: 3306 ? # 2. 定位佔用進程 netstat -tlnp | grep :3306 # 或 lsof -i :3306 # 3. 終止進程 kill -9# 4. 重啟服務 systemctl restart mysqld
| 操作 | 數據可恢復 | 觸發器 | 自增重置 | 鎖級別 | 速度 | 回滾 |
|---|---|---|---|---|---|---|
| DELETE | 是 (Binlog/事務) | 觸發 | 否 | 行鎖 | 慢 | 支持 |
| TRUNCATE | 否 (DDL 隱式提交) | 不觸發 | 是 (歸 1) | 表鎖 | 極快 | 不支持 |
| DROP | 否 | 不觸發 | 表結構連同數據刪除 | 表鎖 | 極快 | 不支持 |
選型:清空大表用 TRUNCATE;刪除部分數據用 DELETE WHERE (配合 LIMIT 分批);廢棄表用 DROP。
-- 庫操作
CREATE DATABASE db_name CHARSET utf8mb4;
USE db_name;
DROP DATABASE db_name;
-- 表操作
CREATE TABLE t (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(64) NOT NULL DEFAULT '',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB CHARSET=utf8mb4;
ALTER TABLE t ADD COLUMN email VARCHAR(128) AFTER name;
ALTER TABLE t MODIFY name VARCHAR(128);
ALTER TABLE t DROP COLUMN email;
DROP TABLE t;
-- 索引
CREATE INDEX idx_name ON t(name);
CREATE UNIQUE INDEX uk_email ON t(email);
DROP INDEX idx_name ON t;
-- 增刪改查
INSERT INTO t(name) VALUES ('test'), ('batch');
SELECT * FROM t WHERE id = 1;
UPDATE t SET name='new' WHERE id=1;
DELETE FROM t WHERE id=1;
-- 自增調整
ALTER TABLE t AUTO_INCREMENT = 1000;
-- 條件更新技巧 (CASE WHEN)
UPDATE t SET status = CASE type WHEN 1 THEN 'A' WHEN 2 THEN 'B' ELSE 'C' END WHERE type IN (1,2,3);
將 MySQL bin 目錄加入系統 Path,任意目錄直接運行 mysql、mysqldump、mysqladmin 等命令,無需進入安裝目錄。
本手冊匯總了 MySQL 開發運維 80% 高頻場景的標準化操作。建議: