一聚教程网:一个值得你收藏的教程网站

热门教程

如何在Oracle 19c中设置PDB默认表空间

时间:2026-08-17 18:59:48 编辑:袖梨 来源:一聚教程网

必须先切换到目标PDB再执行ALTER DATABASE DEFAULT TABLESPACE命令,否则在CDB$ROOT中操作无效;需验证当前容器为PDB(通过SHOW CON_NAME或SYS_CONTEXT),确保目标表空间ONLINE,且不可设为SYSTEM/SYSAUX。

不能在 CDB$ROOT 里改 PDB 的默认表空间,必须先切换到目标 PDB,再用 ALTER DATABASE DEFAULT TABLESPACE 命令设置 —— 这是唯一有效路径。

确认当前容器是目标 PDB 而不是 CDB$ROOT

很多操作失败,根源在于没切对容器。哪怕你刚连上 / as sysdba,默认也在 CDB$ROOT,所有针对 PDB 的逻辑操作(包括设默认表空间)都会被忽略或报错。

  1. 执行 SHOW CON_NAME:输出必须是你的 PDB 名(如 PDB1),不是 CDB$ROOT
  2. 执行 SELECT SYS_CONTEXT('USERENV', 'CON_NAME') FROM dual:结果应与预期 PDB 名一致
  3. 若不对,先运行 ALTER SESSION SET CONTAINER = PDB1(替换为实际 PDB 名)
  4. 注意:ALTER DATABASE 类命令只作用于当前容器,不跨 PDB

执行 ALTER DATABASE DEFAULT TABLESPACE 设置

这条命令修改的是整个 PDB 级别的默认永久表空间,影响所有后续未显式指定表空间的建表、建索引等操作。它不改变已有用户的 DEFAULT_TABLESPACE 属性,只影响新对象的落库位置。

  1. 确保目标表空间已存在且状态为 ONLINE(查 DBA_TABLESPACES
  2. 运行 ALTER DATABASE DEFAULT TABLESPACE users(替换 users 为你的业务表空间名)
  3. 该语句无需指定用户,也不需要 GRANT 权限,SYSSYSTEM 在 PDB 内即可执行
  4. 执行后立即生效,无需重启 PDB

验证是否生效及常见误判点

很多人查 DBA_USERS 里的 DEFAULT_TABLESPACE 字段,误以为它会随 ALTER DATABASE 改变 —— 实际不会。这个字段只反映用户创建时指定或继承的默认值,和 PDB 级默认表空间是两套机制。

  1. 正确验证方式:SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'DEFAULT_PERMANENT_TABLESPACE'
  2. 返回值应为你刚设的表空间名(如 USERS),不是 SYSTEM
  3. 新建测试用户不指定表空间:CREATE USER testuser IDENTIFIED BY pwd,再查 DBA_USERS 中该用户的 DEFAULT_TABLESPACE —— 它仍显示原值,但该用户建表时若不写 TABLESPACE,就会落到你设的 PDB 默认表空间里
  4. 注意:SYSTEMSYSAUX 表空间不能设为 PDB 默认表空间(Oracle 显式禁止)

真正容易被忽略的是:PDB 默认表空间控制的是“无显式指定时的落库位置”,而每个用户自己的 DEFAULT_TABLESPACE 是独立属性;两者共存,优先级是「用户级 > PDB 级」,但用户级只对那个用户生效,PDB 级则兜底所有未覆盖的情况。

热门栏目