mysqldump: Got error: 1044: Access denied for user ‘xx’@’xx’ to database ‘xx’ when using LOCK TABLES

今天在生产环境使用 mysqldump 命令报错,如下:

mysqldump: Got error: 1044: Access denied for user ‘xxx’@’xxx’ to database ‘xxx’ when using LOCK TABLES

这主要是因为备份用户的权限不足导致的。

经过研究对比,给出以下三种解决方案:

1、skip-lock-tables

mysqldump -u用户名 -p --skip-lock-tables 数据库名称> ***.sql

–skip-lock-tables,参数指示mysqldump实用程序在获取转储之前不发出LOCK TABLES命令,该转储将获取每个表上的READ锁.应该锁定数据库中的所有表,以便在备份过程的情况下提高一致性.即使使用skip-lock-table,当表被转储时,也不会收到任何INSERT或UPDATE,因为它将被锁定,因为从表中获取所有记录所需的SELECT。这个会影响数据的一致性(可能比丢数据还要遭糕),故不推荐使用这个方法。

2、single-transaction

mysqldump -u用户名 -p --single-transaction 数据库名称> ***.sql

-single-transaction参数,那么导出过程中只能保证每个表的数据一致性(利用多版本特性实现,目前只能针对InnoDB事务表),可以不锁表。比如有一个大表,mysqldump对该表的导出需要1分钟,那么在这1分钟的过程中,该表时可以被正常访问的。(正常访问包括增删改查,但是alter table等对表结构发生更改的语句要被挂起。)mysqldump能够保证从开始对该表进行导出,一直到对该表的导出结束,该表的数据都是开始的一致性数据快照状态。所以该参数明显不能保证各个表之间的数据一致性(特别是外键约束的父表和子表之间)。但是该参数能够让数据库处于可使用(就是应用感觉数据库可用)状态,相当于联机备份,所以被经常使用。该参数默认off。

3、授予用户锁表权限即可

查看当前用户权限:

show grants for 当前用户名@'localhost';@'localhost';

修改此用户的权限设置:

grant all on 数据库名 to 数据库用户@'localhost' identified by "数据库密码";

再次执行备份语句。

猜你喜欢

转载自blog.csdn.net/u013938578/article/details/120750690