| 領域 | 5.6 行為 | 5.7 變更 | 影響 |
|---|---|---|---|
| 用戶創建 | GRANT 隱式創建 | 強制 CREATE USER + GRANT 分離 | 避免意外創建無密賬戶 |
| 用戶名長度 | 16 字節 | 32 字節 | 支援更長標識符 |
| 認證插件 | mysql_old_password 可用 | 移除 old_password,默認 mysql_native_password | 安全性提升 |
| 密碼過期 | 無 | PASSWORD EXPIRE 選項 | 合規輪換 |
| 賬戶鎖定 | 無 | ACCOUNT LOCK/UNLOCK | 運維隔離 |
| 代理用戶 | 基礎支援 | 原生認證插件集成 PROXY 權限 | 權限復用 |
| test 库 | 默認存在 | 默認刪除 | 減少攻擊面 |
| SSL | 手動配置 | mysql_ssl_rsa_setup 自動生成,默認加密連接 | 零配置加密 |
| 初始化 | mysql_install_db | mysqld --initialize,隨機密碼存 ~/.mysql_secret | 首次登錄強制改密 |
| SQL_MODE | NO_ENGINE_SUBSTITUTION | 嚴格模式組合(見下表) | 數據質量強保障 |
-- 1. 創建用戶(明文密碼) CREATE USER 'dxy'@'localhost' IDENTIFIED BY '123456'; -- 等價於 CREATE USER 'dxy'@'localhost' IDENTIFIED WITH 'mysql_native_password' BY '123456'; -- 2. 創建用戶(哈希值,避免明文傳輸) CREATE USER 'dxy'@'localhost' IDENTIFIED WITH 'mysql_native_password' AS '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9'; -- 3. 授權(不再包含 IDENTIFIED BY) GRANT SELECT,INSERT,UPDATE,DELETE ON dba_test.* TO 'dxy'@'localhost'; -- 4. 查看完整定義(含哈希、過期、鎖定狀態) SHOW CREATE USER 'dxy'@'localhost';
-- 創建時設置 CREATE USER 'dxy'@'localhost' IDENTIFIED BY '123456' PASSWORD EXPIRE INTERVAL 10 DAY; -- 存量用戶修改 ALTER USER 'zjy'@'localhost' PASSWORD EXPIRE NEVER; -- 永不過期 ALTER USER 'dxy'@'localhost' PASSWORD EXPIRE INTERVAL 30 DAY; ALTER USER 'dxy'@'localhost' PASSWORD EXPIRE; -- 立即過期 -- 全局默認過期天數 SET GLOBAL default_password_lifetime=90; -- 0=永不過期
ALTER USER ... IDENTIFIED BY ... 重置密碼ERROR 1820 (HY000): You must reset your password...ALTER USER 'dxy'@'localhost' ACCOUNT LOCK; -- 鎖定 -- 登錄報錯:ERROR 3118 (HY000): Account is locked. ALTER USER 'dxy'@'localhost' ACCOUNT UNLOCK; -- 解鎖
-- 前置:啟用代理參數 SET GLOBAL check_proxy_users=ON; SET GLOBAL mysql_native_password_proxy_users=ON; -- 1. 原始賬戶 CREATE USER 'dxy'@'127.0.0.1' IDENTIFIED BY '123456'; GRANT ALL ON test.* TO 'dxy'@'127.0.0.1'; -- 2. 代理賬戶 CREATE USER 'dxy_proxy'@'127.0.0.1' IDENTIFIED BY '123456'; GRANT PROXY ON 'dxy'@'127.0.0.1' TO 'dxy_proxy'@'127.0.0.1'; -- 3. 驗證 -- 以 dxy_proxy 登錄 SELECT USER(), CURRENT_USER(); -- USER()=dxy_proxy, CURRENT_USER()=dxy (權限來自 dxy) SHOW GRANTS; -- 顯示 dxy 的權限
# 生成證書(數據目錄下自動創建 *.pem) mysql_ssl_rsa_setup --datadir=/var/lib/mysql # 默認連接即加密 mysql -u dba -p -h 127.0.0.1 \s -- SSL: Cipher in use is DHE-RSA-AES256-SHA # 強制 SSL 登錄(賬戶級) CREATE USER 'ssl_user'@'%' IDENTIFIED BY 'pwd' REQUIRE SSL;
| 模式 | 含義 | 違規示例 |
|---|---|---|
| ONLY_FULL_GROUP_BY | GROUP BY 必須包含所有非聚合列 | SELECT a,b FROM t GROUP BY a |
| STRICT_TRANS_TABLES | 事務表嚴格模式:截斷/無效值報錯 | VARCHAR(10) 插入 20 字符 |
| NO_ZERO_IN_DATE | 拒絕月/日為 0 的日期 | '2024-00-01' |
| NO_ZERO_DATE | 拒絕 '0000-00-00' | DATE 默認值 '0000-00-00' |
| ERROR_FOR_DIVISION_BY_ZERO | 除零報錯而非返回 NULL | SELECT 1/0 |
| NO_AUTO_CREATE_USER | GRANT 必須指定密碼 | GRANT SELECT ON *.* TO 'x'@'%' |
| NO_ENGINE_SUBSTITUTION | 引擎不可用時不自動替換 | CREATE TABLE ... ENGINE=TOKUDB |
主從 SQL_MODE 必須完全一致,否則複製中斷、遷移數據截斷/報錯。建議全環境統一為嚴格模式,代碼層適配標準 SQL。
MySQL 5.7 將安全從「事後補丁」轉為「內核能力」:**分離創建授權、密碼生命周期管理、賬戶狀態控制、權限代理復用、默認加密傳輸、嚴格數據校驗**。升級 5.7 不只是版本號變更,更是安全基線的整體躍升。