美文网首页MySQL(总)MySQL备份MySQL主从
mysql.proc表字段缺失导致的mysqldump报错(Go

mysql.proc表字段缺失导致的mysqldump报错(Go

作者: 飞翔的Tallgeese | 来源:发表于2019-01-09 17:50 被阅读0次

    写在最前

    1356的错误,在前几天写的mysqldump问题集合里面已经写过了,然而本次按照常规的套路无法处理这次的1356错误,所以单独写出来

    1356以及相关mysqldump错误参阅这个问题集合:mysqldump问题处理集合


    IP架构

    问题数据库:172.17.100.106

    参考库:172.17.100.107、172.17.100.100

    106库是一个多次实验之后,做过主库也做过从库的数据库;107库是一个刚刚初始化的新库;

    问题描述

    执行全库的mysqldump时导出报了一个1356的权限错误

    问题排查

    根据前面处理1356的经验,对mysql.proc和information_schema.views进行查询,然而并没有发现任何异常!

    特别是下图(语句②的执行结果图)红框中的host_summary这个在上图中出现的报错视图,type和definer可以说都是再正常不过了。

    ①SELECT definer,type FROM mysql.proc GROUP BY definer,type;

    ②select TABLE_SCHEMA,table_name,definer,SECURITY_TYPE from information_schema.views;

    对比参考数据库,发现106库(问题库)的第①个语句结果略微有一些不一样,下图是107库(参考库)的执行结果

    而在106库的结果中,只有第一行

    对106库和107库分别执行mysql.proc的全库查询发现:107库有48行数据,而106库只有6行数据;再参考100库,数据量也远远不止6条!

    决定先对106库的mysql.proc表进行数据补全

    处理问题

    思路是先对106库的mysql.proc表进行备份,再将107库的mysql.proc表数据导过来

    create table qimo.proc select * from mysql.proc;

    报错:ERROR 1786 (HY000): Statement violates GTID consistency: CREATE TABLE ... SELECT.

    #需要关闭GTID,此处采用在线关闭

    set global gtid_mode='ON_PERMISSIVE';

    set global gtid_mode='OFF_PERMISSIVE';

    set global gtid_mode='OFF';

    set global ENFORCE_GTID_CONSISTENCY='OFF'

    #再次执行

    create table qimo.proc select * from mysql.proc;

    报错:ERROR 1067 (42000): Invalid default value for 'modified'

    典型的sql_mode错误,查询mysql.proc表可以发现modified又冲突了,改sql_mode去

    这里还不能带global,如果是set global sql_mode的话,不会在这个会话里生效

    set sql_mode='STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

    #解决这2个错误后,表的复制完成了

    #关闭GTID,并将107库的mysql.proc表进行复制

    create database qimo;

    create table qimo.pr select * from mysql.proc;

    #将107库的qimo.proc表导出(仅导出结构-d,数据结构都导出则不加-d)

    mysqldump -uroot -p密码 qimo proc > qimo.sql

    #将sql拷贝到106库,执行单表的导入(导出的单表里面有数据和结构,但是不会写表的归属数据库,所以在执行单表导入的时候,需要写明库名,比如下面的粗斜体qimo)

    mysql -uroot -p密码 qimo < qimo.sql

    将106库的2张表合并

    use qimo;

    insert into proc select * from pr;

    #将106库的qimo.proc表导出

    mysqldump -uroot -p密码 qimo proc > proc.sql

    #查询mysql.proc表的建表语句

    use mysql;

    show create table proc;

    #将建表语句复制下来,编辑之前导出的proc.sql

    #将建表语句进行替换(mysql.proc是系统表,他的建表语句和通过create table复制出去的qimo.proc是不同的)

    #导入mysql.proc表

    mysql -uroot -p密码 mysql < proc.sql

    为什么不直接insert数据到mysql.proc表呢?

    系统表是不能加写锁的,我也尝试了直接insert,然后就得到了下面的报错

    insert into mysql.proc select * from qimo.proc;

    ERROR 1428 (HY000): You can't combine write-locking of system tables with other tables or lock types

    验证

    sys库下面所有的view已经可以正常读取

    执行106库的全库导出也顺利完成


    后话

    测试库只求解决问题,干起来倒是肆无忌惮,老实说我也不知道正式库到底能不能在生产时间这么直接去干掉mysql.proc再重建

    相关文章

      网友评论

        本文标题:mysql.proc表字段缺失导致的mysqldump报错(Go

        本文链接:https://www.haomeiwen.com/subject/keigrqtx.html