使用最高权限用户执行导出时遇到权限问题
(Got error:1356/1449均和此问题有关)
这个库本身是从别的地方通过Xtrabackup迁移过来的,在完成迁移之后原库的很多用户已经丢失了,但是在某些视图中却是定义了definer的,这导致在执行导出时,这些视图根本无法去读取,即使是最高权限的root也不行
对mysql.proc和information_schema.views进行查询,可以发现这些不存在的用户
①SELECT definer,type FROM mysql.proc GROUP BY definer,type;
②select TABLE_SCHEMA,table_name,definer,SECURITY_TYPE from information_schema.views;
由于没有任何用户可以对information_schema.views进行直接修改,因此definer的修改需要采用下列语句
③select concat("alter DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW ",TABLE_SCHEMA,".",TABLE_NAME," as ",VIEW_DEFINITION,";") from information_schema.VIEWS where DEFINER not in ('root@localhost','mysql.sys@localhost');
将第③步找出的所有结果(下图标蓝的alter语句)拷贝到新的查询窗口中进行执行,可以将所有除开mysql.sys以外的definer值修改成root@localhost从而解决该权限问题;
(还有一种很吃力而且不讨好但可以解决问题的方法就是把这些对应的definer全部创建出来并赋予权限)
注意:如果遇到执行失败,有可能导致不是所有语句都完成执行,所以完成执行之后,一定要再次执行第③条语句,确定无法查出任何不满足的条件才OK(如下图),否则的话,需要结合第②条语句的结果集,检查没有执行成功的语句
通过information_schema.views可以看到修改已经生效
You can't use locks with log tables. when using LOCK TABLES
(Got error : 1556)
网上对于这个错误的处理办法是下图这样的
第4条在做主从的时候,是不可能采用这个参数的;
第3条和第2条的意义差不多,但并不一定能完全解决问题
打开general_log,发现即使排除了general_log和slow_log后,在执行到对mysql库的导出时,仍然出现了1556的报错,对mysql库其他表进行排查,发现slow_log_view也存在无法锁定的问题
最后的导出语句如下:(注意ignore-table参数需要多次写出)
mysqldump -uroot -p'密码' -A --ignore-table=mysql.general_log --ignore-table=mysql.slow_log --ignore-table=mysql.slow_log_view > all.sql
综合来说,第1条解决方案较为合适,在做主从的时候,我们不希望对mysql和is库进行导出,对应语句如下
mysql -e "show databases;" -uroot -p密码| grep -Ev "Database|information_schema|mysql|test" | xargs mysqldump -uroot -p密码 --databases --single-transaction --master-data=2 > all.sql