开启TSDB之后,出现show create table找不到表的情况,仔细一看是因为我们的库中有一些view。
其实我有点不明白即是因为要用 show create table呢?像之前一样用 describe tablename 的方式不是很好吗?
原提问者GitHub用户dmsolr
show create table失败之后会回退到desc table name. 主要为解决unique key的获取,show create table针对多个唯一键时可以正确提取
原回答者GitHub用户agapple
show create table 和 describe tablename 都是MySQL的SQL语句,用于获取表结构信息。它们的区别在于,show create table 可以获取表的创建语句,包括表的结构和索引等信息,而 describe tablename 只能获取表的结构信息,不能获取索引信息。
在Canal的TSDB中,可以通过 show create table 来获取表结构信息,然后将它们缓存起来,以便在解析binlog时使用。但是,如果MySQL数据库中存在View,使用 show create table 会抛出“Table 'xxx' doesn't exist”异常,因为View并不是表,不能用于创建表。
为了解决这个问题,可以在Canal的TSDB中过滤掉View,只缓存表的结构信息。可以通过在获取表结构信息时,增加一个过滤条件,只获取表而不获取View的信息。例如,可以使用以下SQL语句:
SHOW FULL TABLES IN database_name
WHERE TABLE_TYPE LIKE 'BASE TABLE'; 这个SQL语句会获取指定数据库中的所有表,但不包括View。然后,可以循环遍历这些表,使用 show create table 来获取每个表的结构信息,并将它们缓存起来。
如果需要获取索引信息,可以使用 show index from tablename 来获取指定表的索引信息,而不需要使用 show create table。可以在获取表结构信息时,同时获取索引信息,并将它们一起缓存起来。
需要注意的是,Canal的使用比较复杂,需要结合具体的环境和情况进行分析和解决。在开启Canal的TSDB时,需要确认MySQL数据库中的表结构信息是否正确,并正确配置Canal的TSDB配置信息。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。