故障分析 | MySQL5.7 使用 mysqldump 重要避坑事项

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

作者:王向
爱可生 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

首先,这个问题其实并不难解决,但是这个问题引发的现象倒是挺有意思。

排查常见问题

先定位几个常见问题:

  1. 权限不够;
  2. sys 库 functions 和 procedures 丢失;
  3. mysqldump 全备后跨版本恢复【会发生问题 2 的现象】;
  4. 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

恢复完毕后,检测一

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值