引言
研发需要某个 MySQL 表,需要运维这边导出来提供给他们。
问题
一般使用 mysqldump 命令即可,但从生产环境直接导出表有报错,如下:
mysqldump: Got error: 1044: Access denied for user ‘xxx’@’xxx’ to database ‘xxx’ when using LOCK TABLES
分析
从以下报错可以判断 mysqldump 使用的用户没锁表权限。
登录到 mysql 下可以确认。
*************************** 8. row ***************************
Host: 127.0.0.1
User: xxx
Password: *xxx
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Reload_priv: Y
Shutdown_priv: N
Process_priv: N
File_priv: N
Grant_priv: Y
References_priv: N
Index_priv: Y
Alter_priv: Y
Show_db_priv: N
Super_priv: Y
Create_tmp_table_priv: N
Lock_tables_priv: N
Execute_priv: Y
Repl_slave_priv: N
Repl_client_priv: N
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Create_user_priv: Y
Event_priv: N
Trigger_priv: Y
Create_tablespace_priv: N
ssl_type:
14 rows in set (0.00 sec)
解决方法
授予用户锁表权限即可。
网上有人说使用 –skip-lock-tables,这个会影响数据的一致性(可能比丢数据还要遭糕),故不推荐使用这个方法。
–single-transaction 用于 Innodb 引擎的数据库 dump 时,可以不锁表。
mysql 锁表原理深入下去还有很多细节可以学习,可以参考 Ref 相关资料。
Ref