mysqldump: Got error: 1044: Access denied for user 'dbuser'@'localhost' to database 'db' when using LOCK TABLES
原因:mysqldump 默認加 --lock-tables(即 LOCK TABLES 權限),普通用戶通常無此權限。
mysqldump -u dbuser -p dbname --skip-lock-tables > backup.sql
GRANT LOCK TABLES ON dbname.* TO 'dbuser'@'localhost';
FLUSH PRIVILEGES;
--single-transaction)-- 備份專用賬號最小權限集
GRANT SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER ON dbname.* TO 'backup_user'@'%' IDENTIFIED BY 'StrongPass123!';
-- InnoDB 熱備份必加
GRANT RELOAD, PROCESS, REPLICATION CLIENT ON *.* TO 'backup_user'@'%';
mysqldump -u root -p dbname > backup.sql
mysqldump \
--single-transaction \ # InnoDB 一致性快照(核心)
--routines --triggers --events \ # 存儲過程/觸發器/事件
--master-data=2 \ # 記錄 Binlog 位置(主從搭建用)
--hex-blob \ # 二進制字段十六進制
--skip-lock-tables \ # 無 LOCK TABLES 權限時必加
-u backup_user -p dbname > backup_$(date +%F_%H%M).sql
| 參數組合 | 一致性級別 | 鎖表行為 | 適用引擎 |
|---|---|---|---|
| 默認 (--lock-tables) | 表級鎖定一致性 | 鎖定所有表 | MyISAM/InnoDB |
| --single-transaction | 事務級一致性(MVCC) | 不鎖表 | InnoDB 專用 |
| --skip-lock-tables | 無一致性保證 | 不鎖表 | 全引擎(風險自負) |
| --lock-all-tables | 全庫級一致性 | 鎖定全庫 | MyISAM/混合 |
IF 存儲引擎 = InnoDB:
IF 有 LOCK TABLES 權限:
USE --single-transaction (最佳)
ELSE:
USE --single-transaction --skip-lock-tables (次佳,無表鎖但有 MVCC)
ELSE (MyISAM/混合):
MUST HAVE LOCK TABLES 權限
USE --lock-tables 或 --lock-all-tables
核心建議:InnoDB 環境優先申請 --single-transaction 權限組合;無權限時 --skip-lock-tables 為臨時繞過方案,並納入權限治理待辦清單。