暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

一文搞懂MySQL、Oracle、PostgreSQL 数据库全方位资产盘点

热衷于分享各种干货知识,大家有想看或者想学的可以评论区留言,秉承着“开源知识来源于互联网,回归于互联网”的理念,分享一些日常工作中能用到或者比较重要的内容,希望大家能够喜欢,不足之处请大家多宝贵地意见,我们一起提升,守住自己的饭碗。

正文开始

在数据库管理过程中,全面了解数据库资产是优化运维的基础。你是否曾希望一键获取 MySQL、Oracle、PostgreSQL 数据库内所有信息,快速掌握数据库架构、数据规模和字段详情?现在,我们就能实现这一目标 —— 查询 MySQL、Oracle、PostgreSQL 数据库中各数据库及其下辖表,同时获取每张表的数据行数、存储占用、列名、字段类型,以及列注释信息。这不仅能让运维人员在排查故障时快速定位问题,还能帮助开发人员更好理解数据库设计,大幅提升开发效率。本文将分享具体查询方法,无论你是经验丰富的 DBA,还是初入数据库领域的开发者,都不容错过!

1、查询 MySQL 数据库中所有数据库及其包含的表,获取每张表的数据行数、存储大小、列名、字段类型以及列注释信息

    SELECT 
        t.TABLE_SCHEMA AS '数据库',
        t.TABLE_NAME AS '表名',
        t.TABLE_ROWS AS '数据行数',
        CONCAT(ROUND(t.DATA_LENGTH/1024/10242), ' MB'AS '数据大小',
        CONCAT(ROUND(t.INDEX_LENGTH/1024/10242), ' 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 '额外信息'
    FROM 
        INFORMATION_SCHEMA.TABLES t
    JOIN 
        INFORMATION_SCHEMA.COLUMNS c 
        ON t.TABLE_SCHEMA = c.TABLE_SCHEMA 
        AND t.TABLE_NAME = c.TABLE_NAME
    WHERE 
        t.TABLE_SCHEMA NOT IN ('sys','mysql','information_schema','performance_schema')
    ORDER BY 
        t.DATA_LENGTH DESC,  -- 按数据大小降序排列
        t.TABLE_SCHEMA,      -- 按数据库名排序
        t.TABLE_NAME,        -- 按表名排序
        c.ORDINAL_POSITION;  -- 按列定义顺序排序

    2、查询 Oracle 数据库中所有数据库及其包含的表,获取每张表的数据行数、存储大小、列名、字段类型以及列注释信息

      SELECT
          a.owner AS "数据库",
          a.table_name AS "表名",
          b.num_rows AS "数据行数",
          TO_CHAR(ROUND(a.bytes / 1024 / 10242)) || ' MB' AS "数据大小",
          c.COLUMN_NAME AS "列名",
          c.DATA_TYPE ||
          CASE
              WHEN 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
          (
              SELECT
                  segment_name,
                  owner,
                  SUM(bytes) AS bytes
              FROM
                  dba_segments
              WHERE
                  segment_type = 'TABLE'
              GROUP BY
                  segment_name,
                  owner
          ) a
      JOIN
          dba_tables b ON a.segment_name = b.table_name AND a.owner = b.owner
      JOIN
          dba_tab_columns c ON b.table_name = c.table_name AND b.owner = c.owner
      LEFT JOIN
          dba_col_comments d ON c.table_name = d.table_name AND c.owner = d.owner AND c.COLUMN_NAME = d.COLUMN_NAME
      LEFT JOIN
          dba_tab_comments e ON b.table_name = e.table_name AND b.owner = e.owner
      LEFT JOIN (
          SELECT
              uc.table_name,
              ucc.COLUMN_NAME,
              uc.constraint_type,
              uc.owner
          FROM
              dba_constraints uc
          JOIN
              dba_cons_columns ucc ON uc.constraint_name = ucc.constraint_name AND uc.owner = ucc.owner
          WHERE
              uc.constraint_type IN ('P''U')
      ) f ON c.table_name = f.table_name AND c.COLUMN_NAME = f.COLUMN_NAME AND c.owner = f.owner
      WHERE
          a.owner NOT IN ('SYS''SYSTEM')
      ORDER BY
          a.bytes DESC,
          a.owner,
          a.segment_name,
          c.COLUMN_ID;

      3、查询 Postgresql 数据库中所有数据库及其包含的表,获取每张表的数据行数、存储大小、列名、字段类型以及列注释信息

        SELECT
            n.nspname AS "数据库",
            c.relname AS "表名",
            (
                SELECT
                    reltuples
                FROM
                    pg_class
                WHERE
                    oid = 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",
            CASE
                WHEN con.contype = 'p' THEN 'PRIMARY KEY'
                WHEN con.contype = 'u' THEN 'UNIQUE'
                ELSE ''
            END AS "键类型",
            a.atthasdef AS "默认值",
            '' AS "额外信息"
        FROM
            pg_namespace n
        JOIN
            pg_class c ON c.relnamespace = n.oid
        JOIN
            pg_attribute a ON a.attrelid = c.oid
        LEFT JOIN
            pg_constraint con ON con.conrelid = c.oid AND a.attnum = ANY(con.conkey)
        WHERE
            c.relkind = 'r'
            AND n.nspname NOT IN ('pg_catalog''information_schema')
            AND a.attnum > 0
        ORDER BY
            pg_relation_size(c.oid) DESC,
            n.nspname,
            c.relname,
            a.attnum;


        END
        往期文章回顾

        文中的概念来源于互联网,如有侵权,请联系我删除。

        欢迎关注公众号:小周的数据库进阶之路,一起交流数据库、中间件和云计算等技术。如果觉得读完本文有收获,可以转发给其他朋友,大家一起学习进步!感兴趣的朋友可以加我微信,拉您进群与业界的大佬们一起交流学习。



        文章转载自小周的数据库进阶之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论