开发者社区> 问答> 正文

TSDB show create table时没过滤View

开启TSDB之后,出现show create table找不到表的情况,仔细一看是因为我们的库中有一些view。

其实我有点不明白即是因为要用 show create table呢?像之前一样用 describe tablename 的方式不是很好吗?

原提问者GitHub用户dmsolr

展开
收起
绿子直子 2023-05-09 10:27:30 94 0
2 条回答
写回答
取消 提交回答
  • show create table失败之后会回退到desc table name. 主要为解决unique key的获取,show create table针对多个唯一键时可以正确提取

    原回答者GitHub用户agapple

    2023-05-10 09:36:56
    赞同 展开评论 打赏
  • 随心分享,欢迎友善交流讨论:)

    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配置信息。

    2023-05-09 10:53:57
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载