
StarRocks SHOW CREATE DATABASE 详解查看数据库建库语句与内部实现原理【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocksStarRocks 的SHOW CREATE DATABASE语句用于返回创建某个数据库时的 SQL 命令是数据库管理员在迁移、重建或审计库结构时最常用的“逆向查看”手段之一。本文将完整讲解该语句的语法、参数、返回结果与典型用法并深入 FEFrontend源码揭示其从解析、鉴权到结果生成的全链路实现帮助你不仅会用更理解它背后的工作原理。语句概述SHOW CREATE DATABASE是 StarRocks 提供的一条数据库元数据查看命令它根据当前会话所在的 catalog 与指定的数据库名称从 FE 的元数据管理中取出数据库对象并动态拼接出等价的CREATE DATABASE建库语句返回给客户端。该语句只读、不修改任何元数据适合用于备份 / 迁移数据库时获取可重放的建库 SQL审计或比对不同环境的数据库创建参数查看数据库是否绑定了storage_volume、location等属性。CREATE DATABASE语句本身位于 CREATE_DATABASE.md本篇是与其配套的逆向查看命令。语法SHOW CREATE DATABASE db_name其中db_name为数据库名称必填不允许省略。执行时StarRocks 会返回一行结果包含数据库名称以及重建该数据库所需的完整 SQL 语句。参数说明参数必选说明db_name是要查看的数据库名称必须已存在。数据库命名的具体规范与长度限制可参考 System_limit.md与CREATE DATABASE不同SHOW CREATE DATABASE不接受任何PROPERTIES参数数据库属性如storage_volume会由系统自动从元数据中读取并拼接到返回的 SQL 中。返回结果执行成功后会返回一个两列的二维结果集列名含义Database数据库名称Create Database创建该数据库所使用的 SQL 命令使用示例查看普通内部数据库mysql show create database zj_test; ------------------------------------- | Database | Create Database | ------------------------------------- | zj_test | CREATE DATABASE zj_test | -------------------------------------在未绑定任何额外属性如共享数据模式下的storage_volume时返回的建库语句就是最基础的CREATE DATABASE \db_name 形式数据库名会被反引号包裹以保证特殊字符场景下的 SQL 可重放性。查看绑定了存储卷的云原生数据库在共享数据shared-data模式下如果数据库创建时通过PROPERTIES (storage_volume...)绑定了存储卷SHOW CREATE DATABASE返回的 SQL 会额外附带该属性mysql show create database cloud_db; ------------------------------------------------------------------- | Database | Create Database | ------------------------------------------------------------------- | cloud_db | CREATE DATABASE cloud_db | | | PROPERTIES (storage_volume s3_storage_volume) | -------------------------------------------------------------------这一行为的底层逻辑位于 FE 的结果执行器 ShowExecutor.java当数据库存在location外部表场景时优先输出PROPERTIES (location ...)否则在共享数据模式下、且数据库为普通用户库时通过StorageVolumeMgr.getStorageVolumeNameOfDb(db.getId())查询该数据库绑定的存储卷名称并拼入 SQL。存储卷管理器中内置了名为builtin_storage_volume的默认存储卷具体可参见 StorageVolumeMgr.java。权限要求执行SHOW CREATE DATABASE需要用户对目标数据库拥有任意ANY数据库级权限。该检查在 FE 的鉴权访问器 AuthorizerStmtVisitor.java 中实现它会先校验当前会话是否已选中 catalog再调用Authorizer.checkAnyActionOnDb进行权限校验未通过时抛出AccessDeniedException并报告拒绝访问。如果没有相应权限可通过 GRANT 文档描述的方式为用户授予数据库权限后再执行。底层执行原理从源码层面看一条SHOW CREATE DATABASE语句在 FE 内部要经历以下四个阶段语法解析AST 构建SQL 被解析为ShowCreateDbStmt抽象语法树节点该节点持有数据库名称db其定义位于 ShowCreateDbStmt.java注释中明确了其语法形式为SHOW CREATE DATABASE db。语义分析Catalog 校验BasicDbStmtAnalyzer.java 的visitShowCreateDbStatement会校验当前会话是否已选中 catalog若currentCatalog为空则抛出SemanticException(No catalog selected)。对应的单元测试见 BasicDbStmtAnalyzerTest.java其中分别覆盖了“未选择 catalog 报错”与“选中 catalog 正常通过”两条路径。权限鉴权Authorizer如上一节所述通过 AuthorizerStmtVisitor.java 校验用户对数据库的ANY权限。结果执行与拼装ShowExecutorShowExecutor.java 根据当前 catalog 类型分派元数据查询内部 catalog通过context.getGlobalStateMgr().getLocalMetastore().getDb(dbName)获取数据库外部 catalog通过GlobalStateMgr.getCurrentState().getMetadataMgr().getDb(...)获取随后调用MetaUtils.checkDbNullAndReport确保数据库存在最后按照“基础建库语句 可选 PROPERTIES”的规则拼接出Create Database列的内容并封装为ShowResultSet返回给客户端。由此可见SHOW CREATE DATABASE返回的并非数据库中存储的原文而是 FE 根据当前数据库的实时元数据状态动态生成的等价 SQL因此它始终能准确反映数据库当前实际绑定的属性。与其他数据库语句的配合使用SHOW CREATE DATABASE通常与以下语句配合构成完整的数据库生命周期管理闭环相关文档均位于 Database 目录 下语句作用关联文档CREATE DATABASE创建数据库支持storage_volume属性CREATE_DATABASE.mdSHOW DATABASES列出当前 catalog 下的全部数据库SHOW_DATABASES.mdUSE切换当前会话的工作数据库USE.mdDESC/DESCRIBE查看库内表结构DESCRIBE.mdALTER DATABASE修改数据库属性如更换存储卷ALTER_DATABASE.mdDROP DATABASE删除数据库DROP_DATABASE.md一个典型的使用流程是先用SHOW DATABASES确认目标库名再用SHOW CREATE DATABASE导出其建库 SQL 作为迁移或重建依据若发现存储卷绑定不合理可借助ALTER DATABASE调整属性后再次执行SHOW CREATE DATABASE校验结果。小结SHOW CREATE DATABASE虽然是一条看似简单的元数据查询语句但其背后覆盖了语法解析、catalog 校验、RBAC 权限鉴权与动态 SQL 拼装四个关键环节并针对内部 catalog、外部 catalog、共享数据模式分别做了差异化处理。掌握它你不仅能快速导出可重放的建库语句还能借助其返回结果理解数据库当前绑定的storage_volume、location等属性状态为库的迁移与治理提供可靠依据。【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考