ERROR 1356
ERROR 1356
APPLIES TO:
5.7.x
SYMPTOMS
mysqldump 全备恢复后,无法查询 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
CASE
mysql> SELECT * FROM mysql.proc; |
sys 库 functions 和 procedures 丢失了,mysqldump 全备和升级没有执行 mysql_upgrade。
mysqldump 默认不会备份 sys 库。但在使用 mysqldump 在执行 --all-databases 会生成清空 mysql.proc 语句导致 sys 库还原后无法正常使用,这是一个 BUG,并且只存在于 MySQL 5.7.x !
SOLUTION
-
mysql_upgrade install or upgrade sys schema
# 删除 sys schema (An error occurs if a sys schema exists but has no version view)
mysql> DROP DATABASE sys;
# 这个时候 sys schema 不应该存在
mysql> SHOW DATABASES;
# 最后,执行 mysql_upgrade sys schema 以恢复正常
mysql_upgrade -uroot -p --upgrade-system-tables --skip-verbose --force
mysql> SHOW DATABASES;
mysql> SELECT COUNT(*) FROM mysql.proc;注意:mysql_upgrade 在修理 sys 库的同时,还修理 mysql 库和用户库表(期间加锁且速度一般),有极小可能会误伤;使用 mysql_upgrade 的时候要加上 --upgrade-system-tables,不然会扫描用户库表。
-
全备时同时备份 sys 库
mysqldump -A --set-gtid-purged=OFF --master-data=2 --single-transaction --routines --events --triggers > all.sql
mysqldump --databases --routines sys > sys_dump_`mysql -V|awk '{print $5}'|cut -b 1-6`.sql -
使用 databases 全备
select_databases="
SELECT
GROUP_CONCAT(schema_name SEPARATOR ' ')
FROM
information_schema.schemata
WHERE
schema_name NOT IN ('performance_schema','information_schema');"
databases=`mysql -NBe "$select_databases"`
mysqldump --set-gtid-purged=OFF --master-data=2 \
--single-transaction --routines --events --triggers \
--max_allowed_packet=256M --databases > all.sql -
使用 mysql-sys 开源代码
# 安装前操作,内容是禁用掉 sql_log_bin,不记录到日志中。
mysql> source before_setup.sql
# 创建 sys 库,实际会调用其他文件夹中的 sql 语句
# 来进行表、视图、存储过程、触发器的创建
mysql> source sys_57.sql
# 安装后的操作,内容是将 sql_log_bin 恢复到操作前的状态
mysql> source after_setup.sql
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.





