我正在尝试将一个存储过程添加到一个数据库中,该数据库不显示任何存在于树(Workbench)中:
正如树的屏幕截图所示。
另外,执行:
SHOW PROCEDURE STATUS where Db = 'my_database_name';
返回 0 条记录。
但是当我尝试创建一个像这样的过程时:
DELIMITER $$
CREATE PROCEDURE `sp_myprocedure`(
IN prm_id int,
IN prm_active boolean
)
BEGIN
# a select statement returning some records
END$$
DELIMITER ;
抛出错误:
Error Code: 1304. PROCEDURE sp_myprocedure already exists 0.0097 sec
然后我检查了腐败:
mysqlcheck
对于有问题的数据库,它返回tables
- 一切正常:
...
my_database_name.my_table_name OK
...
它似乎没有损坏,所以我很困惑。
- MySQL 5.7.34
- 工作台 8.0.31
这里发生了什么?
执行中
SHOW CREATE TABLE mysql.proc;
回报
CREATE TABLE `proc` (
`db` char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
`name` char(64) NOT NULL DEFAULT '',
`type` enum('FUNCTION','PROCEDURE') NOT NULL,
`specific_name` char(64) NOT NULL DEFAULT '',
`language` enum('SQL') NOT NULL DEFAULT 'SQL',
`sql_data_access` enum('CONTAINS_SQL','NO_SQL','READS_SQL_DATA','MODIFIES_SQL_DATA') NOT NULL DEFAULT 'CONTAINS_SQL',
`is_deterministic` enum('YES','NO') NOT NULL DEFAULT 'NO',
`security_type` enum('INVOKER','DEFINER') NOT NULL DEFAULT 'DEFINER',
`param_list` blob NOT NULL,
`returns` longblob NOT NULL,
`body` longblob NOT NULL,
`definer` char(93) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`sql_mode` set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','NOT_USED','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH') NOT NULL DEFAULT '',
`comment` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`character_set_client` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`collation_connection` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`db_collation` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`body_utf8` longblob,
PRIMARY KEY (`db`,`name`,`type`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Stored Procedures'
您应该修复存储存储过程的表
这应该清除它。
由于该
mysql.proc
表是 MyISAM,它可能已损坏。这很容易发生。当 MyISAM 表 (proc.MYD
) 的头文件中没有写入正确数量的打开文件句柄时,它被标记为崩溃。你有一个新问题。MySQL 5.7 应该有 InnoDB 作为存储引擎。您应该将其转换为 InnoDB。