引言
研发需要某个 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
mysqldump备份数据库时出现when using LOCK TABLES的提示
对mysqldump在备份数据库时锁表的认识
mysql - Run MySQLDump without Locking Tables - Stack Overflow
mysqldump — A Database Backup Program
Best kept MySQLDump Secret - MySQL Performance Blog
mysqldump的流程 | P.Linux Laboratory
mysql中lock tables与unlock tables(锁表/解锁)使用总结