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;
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 丢失了,mysqldump 全备和升级没有执行 mysql_upgrade。

mysqldump 默认不会备份 sys 库。但在使用 mysqldump 在执行 --all-databases 会生成清空 mysql.proc 语句导致 sys 库还原后无法正常使用,这是一个 BUG,并且只存在于 MySQL 5.7.x !

SOLUTION

  1. 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,不然会扫描用户库表。

  2. 全备时同时备份 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
  3. 使用 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
  4. 使用 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