Oracle 列出表:USER_TABLES、ALL_TABLES 和 DBA_TABLES

Oracle 列出表:USER_TABLES、ALL_TABLES 和 DBA_TABLES
为什么 Oracle 没有 SHOW TABLES 命令MySQL 和 PostgreSQL 用户习惯于使用SHOW TABLES;或\dt。在 Oracle 中这两个命令都不存在运行它们会报错。Oracle 使用数据字典Data Dictionary这是一组只读的系统视图存储数据库中所有内容的元数据。查询这些视图比单行快捷命令更冗长但也功能强大得多。除了表名之外您还可以在同一次查询中获取存储详情、分区信息、行数和上次分析日期。数据库如何列出表MySQLSHOW TABLES;PostgreSQL\dt或查询information_schemaOracle查询数据字典视图USER_TABLES、ALL_TABLES、DBA_TABLES数据字典按三个作用域级别组织每个级别对应不同的数据库访问权限。您查询哪个视图取决于您的账户被允许查看的内容而这正是下一节要介绍的内容。根据访问权限级别在 Oracle 数据库中列出表Oracle 根据所有权和权限将其数据字典视图组织为三个级别。在编写任何查询之前了解您的账户适用的级别是第一步。方法 1列出您拥有的表USER_TABLES当您只需要查看自己模式中创建的表时请使用USER_TABLES。这是开发人员处理自己对象时最常见的起点。SELECT table_name, tablespace_name, num_rows, last_analyzed FROM user_tables ORDER BY table_name;包含num_rows和last_analyzed可以让您快速了解表是否有数据以及优化器上次收集统计信息的时间。注意USER_TABLES没有OWNER列。由于此视图仅显示您自己的表Oracle 认为所有者字段是多余的完全将其省略。方法 2列出您有权访问的表ALL_TABLES在多模式环境中您可能需要查看其他用户拥有的、您已被授予读取或修改权限的表。ALL_TABLES涵盖您的账户可访问的所有表而不仅仅是您自己的表。要按特定模式筛选请添加WHERE子句SELECT owner, table_name, tablespace_name FROM all_tables WHERE owner SALES_DEPT ORDER BY owner, table_name;一个重要细节Oracle 默认以大写存储表名和用户名。查询WHERE owner sales_dept将返回零结果。请始终在单引号内使用大写除非模式是用带引号的混合大小写名称创建的。方法 3列出数据库中的所有表DBA_TABLESDBA_TABLES为您提供跨所有模式的每个表的完整视图。您需要DBA角色或SELECT ANY DICTIONARY权限才能查询它。由于 Oracle 附带许多内部系统模式原始查询会返回大量噪音。使用排除列表将其过滤掉SELECT owner, table_name, tablespace_name FROM dba_tables WHERE owner NOT IN (SYS, SYSTEM, OUTLN, DBSNMP, APPQOSSYS) ORDER BY owner, table_name;如果您收到ORA-00942表或视图不存在则您的账户缺少所需权限。请向 DBA 申请授予您SELECT_CATALOG_ROLE这是无需完整 DBA 权限即可启用对字典视图读取访问的标准方式。您会实际使用的 6 个高级 Oracle 列出表查询标准查询可以获取基本列表。以下查询更进一步帮助您按列、按大小或按部分名称查找表并为工作选择合适的工具。使用场景查询视图所需权限按列名查找表ALL_TAB_COLUMNS标准检查行数和上次分析日期USER_TABLES标准按部分名称搜索表USER_TABLES标准按大小列出表DBA_SEGMENTSDBA 角色列出排除系统模式的表DBA_TABLESDBA 角色可视化浏览SQL Developer / dbForge用户访问1. 按列名查找表如果您知道一个列名但不记得哪些表使用了它请查询ALL_TAB_COLUMNS。这在包含许多相关表的复杂模式中尤其有用。SELECT owner, table_name, column_name FROM all_tab_columns WHERE column_name USER_ID ORDER BY owner, table_name;2. 检查行数和上次分析日期Oracle 优化器依赖统计信息来选择最高效的执行计划。如果num_rows不准确或last_analyzed是几个月前的查询性能可能会悄悄下降而没有任何明显错误。SELECT table_name, num_rows, last_analyzed FROM user_tables WHERE num_rows 0 ORDER BY num_rows DESC;提示如果您的统计信息看起来过时请让 DBA 在相关表上运行DBMS_STATS.GATHER_TABLE_STATS。3. 按部分名称搜索表当您只记得表名的一部分时使用LIKE运算符配合%通配符。请将搜索字符串保持为大写以匹配 Oracle 存储标识符的方式。SELECT table_name FROM user_tables WHERE table_name LIKE %INVENTORY%;4. 按大小列出表Oracle 中的表数据存储在段中因此您需要查询DBA_SEGMENTS来获取准确的大小数据。此查询返回每个表的总大小以 MB 为单位从大到小排列。SELECT segment_name AS table_name, owner, SUM(bytes) / 1024 / 1024 AS size_mb FROM dba_segments WHERE segment_type TABLE GROUP BY segment_name, owner ORDER BY size_mb DESC;这是进行存储审计或在迁移前识别大表的实用起点。5. 列出排除 Oracle 系统模式的表对DBA_TABLES的原始查询包含 Oracle 自己的内部表这些通常不是您需要的。将其过滤掉以获得应用程序表的清晰视图。SELECT owner, table_name FROM dba_tables WHERE owner NOT IN ( SYS, SYSTEM, OUTLN, DBSNMP, APPQOSSYS, CTXSYS, XDB, WMSYS ) ORDER BY owner, table_name;6. SQL*Plus vs SQL Developer vs GUI 工具选择正确的工具取决于您的工作方式SQL*Plus / SQLCL最适合快速检查和 shell 脚本。轻量级但输出格式需要手动设置如SET LINESIZE等命令。SQL DeveloperOracle 的标准 GUI。左侧的 Connections 面板让您无需编写任何 SQL 即可直观浏览表。dbForge / Toad具有更高级功能的第三方工具包括性能分析和可视化 ER 图。常见错误与故障排查即使是经验丰富的 DBA 在查询 Oracle 数据字典时也会遇到访问问题或意外的空结果。以下是四个最常见的问题及其修复方法。1. ORA-00942表或视图不存在原因您尝试在未获得所需管理权限的情况下查询DBA_TABLES。Oracle 对未经授权的用户完全隐藏这些视图因此该错误看起来与查询不存在的表相同。修复根据您的需要切换到USER_TABLES或ALL_TABLES。如果您确实需要访问DBA_TABLES请让管理员授予您SELECT_CATALOG_ROLE或SELECT ANY DICTIONARY权限。2. USER_TABLES 返回空结果原因当前用户不拥有任何表。这在新创建的账户或持有权限但没有对象的专用连接用户中很常见。修复改为查询ALL_TABLES以查看您的账户被授予访问权限的所有内容。如果您需要查看其他模式中的表请确认模式所有者已向您的用户授予对这些对象的SELECT权限。3. 混合大小写表名和带引号的标识符原因Oracle 默认以大写存储所有标识符。如果表是使用双引号创建的例如CREATE TABLE Sales_DataOracle 会保留精确的大小写。使用SALES_DATA的标准查询将返回空。修复检查数据字典查询中的TABLE_NAME列。如果看到小写字母则在后续所有语句中引用该表时必须使用双引号SELECT * FROM Sales_Data;4. DBA_TABLES 未返回行原因在多租户架构Oracle 12c 及更高版本中您可能连接到了容器数据库CDB根而不是您的应用程序表实际所在的可插拔数据库PDB。修复检查您的连接字符串并确认您连接到了哪个数据库。如有需要在运行查询之前使用ALTER SESSION SET CONTAINER pdb_name;切换到正确的 PDB。超越列出表使用 i2Stream 进行 Oracle 复制一旦您清楚了解了表结构自然的下一个问题就是如何使数据保持受保护并在系统间同步。对于在生产环境中运行 Oracle 的团队来说这意味着需要有一个可靠的复制层能够处理高事务量、模式变更和跨平台环境而不会中断生产运行。i2Stream 关键功能近零延迟的实时数据同步i2Stream 通过日志解析而非轮询来捕获变更在高并发下也能实现毫秒级同步。对于写入负载较重的 Oracle 环境这意味着复制能够跟上生产节奏而不会落后。完整 DDL 和 DML 支持模式变更、表修改和数据操作都被捕获并一起复制。您无需在模式更新后暂停复制或手动重新同步。事务级一致性i2Stream 确保事务在目标端按正确顺序应用并内置了针对插入、更新和删除操作的冲突解决机制。即使在复杂的高并发工作负载下数据完整性也能得到保持。无代理架构生产数据库服务器上无需安装任何软件。这意味着对您的 Oracle 实例零性能影响且源端无额外维护开销。灵活的复制拓扑i2Stream 支持一对一、一对多、多对一和级联同步配置。无论您是将分支机构数据整合到中央数据仓库还是将数据集分发到多个目标拓扑结构都可以根据您的架构进行配置。广泛的数据库兼容性除 Oracle 外i2Stream 还支持 SQL Server、MySQL、PostgreSQL、DB2 以及包括 Kafka、Hive 和 HDFS 在内的大数据平台等 40 多种数据库环境。这使其成为管理异构环境的团队的实用选择。常见问题问 1我可以在没有 DBA 权限的情况下在 Oracle 中列出表吗可以。USER_TABLES和ALL_TABLES都可以被标准用户访问无需任何特殊权限。USER_TABLES显示您拥有的表ALL_TABLES显示您被授予访问权限的所有表。只有在查询DBA_TABLES时才需要提升权限。问 2为什么 USER_TABLES 不返回结果这通常意味着当前用户不拥有任何表。如果您使用的是专用连接账户或新创建的用户请尝试查询ALL_TABLES来查看您的账户有权访问的对象。问 3USER_TABLES、ALL_TABLES 和 DBA_TABLES 之间有什么区别USER_TABLES仅显示您拥有的表。ALL_TABLES包括这些加上其他用户授予您访问权限的表。DBA_TABLES涵盖数据库中所有表但需要管理权限才能查询。问 4如何在 Oracle 中按大小列出表查询DBA_SEGMENTS按 segment_type ‘TABLE’ 过滤并按段汇总字节数。这需要 DBA 权限。完整语法请参见上文高级查询部分。结论在 Oracle 中列出表归结为知道哪个数据字典视图适合您的情况。使用USER_TABLES查询您自己的模式ALL_TABLES用于查看您有权限访问的跨模式表DBA_TABLES用于在具备适当权限时获取完整的数据库范围视图。在此基础上本指南中的高级查询可帮助您更进一步按列名查找表、检查统计信息、按大小筛选或按部分名称缩小结果范围。大多数访问问题都追溯到权限差距或大小写敏感不匹配一旦知道要查找什么这两者都很容易解决。