作者:王向
爱可生 DBA 团队成员,负责公司 DMP 产品的运维和客户 MySQL 问题的处理。擅长数据库故障处理。对数据库技术和 python 有着浓厚的兴趣。
本文来源:原创投稿
*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
背景
笔者在一次处理客户 MySQL 问题时遇到客户的 MySQL 的 sys 库不能用了并抛出一下错误:
mysql> SELECT * FROM sys.processlist;
ERROR 1356 (HY000): View 'sys.processlist' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
首先,这个问题其实并不难解决,但是这个问题引发的现象倒是挺有意思。
排查常见问题
先定位几个常见问题:
- 权限不够;
- sys 库 functions 和 procedures 丢失;
- mysqldump 全备后跨版本恢复【会发生问题 2 的现象】;
- mysql 升级没有执行 mysql_upgrade【会发生问题 2 的现象】;
首先排查权限问题是否有权限。
mysql> SHOW GRANTS FOR root@'localhost';
+---------------------------------------------------------------------+
| Grants for root@localhost |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION |
+---------------------------------------------------------------------+
2 rows in set (0.00 sec)
明显并不是,接着排查是否是 sys 库相关的 functions 和 procedures 丢失了?
mysql> SELECT * FROM mysql.proc;
Empty set (0.00 sec)
mysql> SHOW PROCEDURE STATUS WHERE Db = 'sys';
Empty set (0.00 sec)
mysql> SHOW FUNCTION STATUS WHERE Db = 'sys';
Empty set (0.00 sec)
sys 库 functions 和 procedures 丢失了,那不就是问题 3 就是问题 4,甩给 mysqldump 全备和升级没有执行 mysql_upgrade。
带着疑问于开始漫长的排查过程。经过对客户的刨根问题,发现并没有上述情况的发生。用户备份习惯都是全备(-A),且都是备份恢复后出现 sys 库 ERROR 1356,检查用户 MySQL 环境主要几大版本分布 MySQL 5.7.13,5.7.25,5.7.28。于是把问题定位到了 mysqldump 的备份上。
先备份还原一把看看
笔者强烈认为是客户跨版本造成的,给客户来点证据。先验证一波同版本 MySQL 使用 mysqldump 全备恢复后,到底会不会出现 sys 库 ERROR 1356。
备份前先检测一波 sys 库,确认完全 OK 后开整。
mysql> SELECT * FROM sys.version;
+-------------+---------------+
| sys_version | mysql_version |
+-------------+---------------+
| 1.5.2 | 5.7.31-log |
+-------------+---------------+
1 row in set (0.00 sec)
mysql> SELECT * FROM sys.processlist;
ERROR 1356 (HY000): View 'sys.processlist' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
mysql> SELECT COUNT(*) FROM mysql.proc;
+----------+
| COUNT(*) |
+----------+
| 48 |
+----------+
1 row in set (0.00 sec)
使用我们经常用的那坨命令备份所有库。
mysqldump --all-databases --set-gtid-purged=OFF \
--master-data=2 --single-transaction --routines \
--events --triggers --max_allowed_packet=256M > all.sql
备份完毕后我们开始恢复数据。
mysql -uroot -S /tmp/mysql.sock < all.sql
恢复完毕后,检测一

文章讲述了在MySQL中遇到sys库无法使用的问题及排查过程。通过详细分析发现,使用mysqldump全备时会清空mysql.proc表,导致sys库无法正常工作。文中提供了多种解决方案。
最低0.47元/天 解锁文章
1001

被折叠的 条评论
为什么被折叠?



