热衷于分享各种干货知识,大家有想看或者想学的可以评论区留言,秉承着“开源知识来源于互联网,回归于互联网”的理念,分享一些日常工作中能用到或者比较重要的内容,希望大家能够喜欢,不足之处请大家多提宝贵地意见,我们一起提升,守住自己的饭碗。
正文开始
在数据库管理过程中,全面了解数据库资产是优化运维的基础。你是否曾希望一键获取 MySQL、Oracle、PostgreSQL 数据库内所有信息,快速掌握数据库架构、数据规模和字段详情?现在,我们就能实现这一目标 —— 查询 MySQL、Oracle、PostgreSQL 数据库中各数据库及其下辖表,同时获取每张表的数据行数、存储占用、列名、字段类型,以及列注释信息。这不仅能让运维人员在排查故障时快速定位问题,还能帮助开发人员更好理解数据库设计,大幅提升开发效率。本文将分享具体查询方法,无论你是经验丰富的 DBA,还是初入数据库领域的开发者,都不容错过!
1、查询 MySQL 数据库中所有数据库及其包含的表,获取每张表的数据行数、存储大小、列名、字段类型以及列注释信息
SELECTt.TABLE_SCHEMA AS '数据库',t.TABLE_NAME AS '表名',t.TABLE_ROWS AS '数据行数',CONCAT(ROUND(t.DATA_LENGTH/1024/1024, 2), ' MB') AS '数据大小',CONCAT(ROUND(t.INDEX_LENGTH/1024/1024, 2), ' MB') AS '索引大小',c.COLUMN_NAME AS '列名',c.COLUMN_TYPE AS '字段类型',c.COLUMN_COMMENT AS '列注释',t.TABLE_COMMENT AS '表注释',c.IS_NULLABLE AS '是否允许NULL',c.COLUMN_KEY AS '键类型',c.COLUMN_DEFAULT AS '默认值',c.EXTRA AS '额外信息'FROMINFORMATION_SCHEMA.TABLES tJOININFORMATION_SCHEMA.COLUMNS cON t.TABLE_SCHEMA = c.TABLE_SCHEMAAND t.TABLE_NAME = c.TABLE_NAMEWHEREt.TABLE_SCHEMA NOT IN ('sys','mysql','information_schema','performance_schema')ORDER BYt.DATA_LENGTH DESC, -- 按数据大小降序排列t.TABLE_SCHEMA, -- 按数据库名排序t.TABLE_NAME, -- 按表名排序c.ORDINAL_POSITION; -- 按列定义顺序排序
2、查询 Oracle 数据库中所有数据库及其包含的表,获取每张表的数据行数、存储大小、列名、字段类型以及列注释信息
SELECTa.owner AS "数据库",a.table_name AS "表名",b.num_rows AS "数据行数",TO_CHAR(ROUND(a.bytes / 1024 / 1024, 2)) || ' MB' AS "数据大小",c.COLUMN_NAME AS "列名",c.DATA_TYPE ||CASEWHEN c.DATA_PRECISION IS NOT NULL AND c.DATA_SCALE IS NOT NULL THEN '(' || c.DATA_PRECISION || ',' || c.DATA_SCALE || ')'WHEN c.DATA_PRECISION IS NOT NULL THEN '(' || c.DATA_PRECISION || ')'ELSE ''END AS "字段类型",NVL(d.comments, '无注释') AS "列注释",NVL(e.comments, '无注释') AS "表注释",CASE c.NULLABLE WHEN 'Y' THEN '是' ELSE '否' END AS "是否允许NULL",f.constraint_type AS "键类型",c.DATA_DEFAULT AS "默认值",'' AS "额外信息"FROM(SELECTsegment_name,owner,SUM(bytes) AS bytesFROMdba_segmentsWHEREsegment_type = 'TABLE'GROUP BYsegment_name,owner) aJOINdba_tables b ON a.segment_name = b.table_name AND a.owner = b.ownerJOINdba_tab_columns c ON b.table_name = c.table_name AND b.owner = c.ownerLEFT JOINdba_col_comments d ON c.table_name = d.table_name AND c.owner = d.owner AND c.COLUMN_NAME = d.COLUMN_NAMELEFT JOINdba_tab_comments e ON b.table_name = e.table_name AND b.owner = e.ownerLEFT JOIN (SELECTuc.table_name,ucc.COLUMN_NAME,uc.constraint_type,uc.ownerFROMdba_constraints ucJOINdba_cons_columns ucc ON uc.constraint_name = ucc.constraint_name AND uc.owner = ucc.ownerWHEREuc.constraint_type IN ('P', 'U')) f ON c.table_name = f.table_name AND c.COLUMN_NAME = f.COLUMN_NAME AND c.owner = f.ownerWHEREa.owner NOT IN ('SYS', 'SYSTEM')ORDER BYa.bytes DESC,a.owner,a.segment_name,c.COLUMN_ID;
3、查询 Postgresql 数据库中所有数据库及其包含的表,获取每张表的数据行数、存储大小、列名、字段类型以及列注释信息
SELECTn.nspname AS "数据库",c.relname AS "表名",(SELECTreltuplesFROMpg_classWHEREoid = c.oid) AS "数据行数",pg_size_pretty(pg_relation_size(c.oid)) AS "数据大小",a.attname AS "列名",format_type(a.atttypid, a.atttypmod) AS "字段类型",col_description(a.attrelid, a.attnum) AS "列注释",obj_description(c.oid, 'pg_class') AS "表注释",CASE a.attnotnull WHEN false THEN '是' ELSE '否' END AS "是否允许NULL",CASEWHEN con.contype = 'p' THEN 'PRIMARY KEY'WHEN con.contype = 'u' THEN 'UNIQUE'ELSE ''END AS "键类型",a.atthasdef AS "默认值",'' AS "额外信息"FROMpg_namespace nJOINpg_class c ON c.relnamespace = n.oidJOINpg_attribute a ON a.attrelid = c.oidLEFT JOINpg_constraint con ON con.conrelid = c.oid AND a.attnum = ANY(con.conkey)WHEREc.relkind = 'r'AND n.nspname NOT IN ('pg_catalog', 'information_schema')AND a.attnum > 0ORDER BYpg_relation_size(c.oid) DESC,n.nspname,c.relname,a.attnum;
文中的概念来源于互联网,如有侵权,请联系我删除。
欢迎关注公众号:小周的数据库进阶之路,一起交流数据库、中间件和云计算等技术。如果觉得读完本文有收获,可以转发给其他朋友,大家一起学习进步!感兴趣的朋友可以加我微信,拉您进群与业界的大佬们一起交流学习。
文章转载自小周的数据库进阶之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




