问题描述
有一个叫做 Docker 的 schema,里面有名为 TABLE2、TABLE3 的表。
示例
SELECT * FROM all_all_tables WHERE TABLE_name= 'TABLE3';
此外,Docker 架构属于 DEFAULT TABLESPACE SYstem 表空间。
select
username,default_tablespace from dba_users WHERE USERNAME = 'DOCKER';
以下语法用于更改架构的默认表空间。 (TS3 表空间已经存在)
ALTER USER docker DEFAULT tablespace TS3;
然后,当我再次搜索时,发现DEFAULT TABLESPACE被更改了。
select
username,default_tablespace from dba_users WHERE USERNAME = 'DOCKER';
而且,当然,我还以为指定了 TABLE2 和 TABLE3 的表空间也会被改成 TS3,然后执行了下面的语句。
然而,表的表空间是SYstem,而不是TS3。我很好奇为什么它没有改变,我想知道如何改变。 SELECT * FROM all_all_tables WHERE TABLE_name='TABLE3';
解决方法
默认表空间就是这样——创建段时的默认值(通常是表或索引,但段可以是表的分区、物化视图或任何其他需要空间的东西)并且不要'不指定表空间。创建段并将其分配给特定表空间后,除非您移动它,否则它将保留在该表空间中。
假设您使用的是 12.2 或更高版本,因此可以选择在线移动(在其他版本中,您需要删除 online
关键字)
alter table table3
move online tablespace ts3;
您需要为每张桌子都这样做。如果 system
表空间中还有索引,您也需要移动这些索引
alter index index_name
rebuild online tablespace ts3;
根据涉及的表和索引的数量,您可能需要编写一些动态 SQL 来为您生成各种 alter table
和 alter index
语句。