oracle表空间不存在报错,Oracle表空间不存在问题

一、问题引出

01068763cd5882ab5cbf3024d720544d.png

相信大家对如上报错应该不陌生(ORA-00959:表空间XXX不存在)。

二、问题分析

问题原因:涉及到源库(导出库)中的表、索引、LOB字段的表空间在目的库(导入库)中不存在的问题。

解决思路:所以该问题正确解决方式应该分三步:

表的表空间迁移。

索引的表空间迁移。

LOB字段的表空间迁移。

三、解决方法

3.1、表的表空间迁移

首先,我们需要知道该用户名下有哪些表空间,总不能等到我都导出库了,等导入报错后再确认吧?,这样太费事了,可以根据下条sql语句查出:

-- 查看用户的表被存储在哪些表空间中(需要修改表空间的表即在这些表空间中)

SELECT * FROM dba_users where username = upper('&inputUserName');

然后,根据需要修改表所属的表空间:

SELECT 'alter table '||TABLE_NAME||' move tablespace dstTableSpace;'

FROM USER_TABLES WHERE status = 'VALID' AND TABLESPACE_NAME = upper('&srcTablespace');

Tips:我们还可以查看下在用户不同表空间下各有多少张表:

SELECT count(*) FROM dba_segments where tablespace_name = '&表空间1' and owner = '&用户名' and segment_type = 'TABLE'

UNION

SELECT count(*) FROM dba_segments where tablespace_name = '&表空间2' and owner = '&用户名' and segment_type = 'TABLE';

3.2、索引的表空间迁移

由3.1步知道有哪些表空间后,可以用如下sql语句批量进行索引的表空间迁移。

SELECT 'alter index '|| INDEX_NAME ||' rebuild tablespace index_DstTablespace;' FROM user_indexes where table_owner=upper('&username');

Tips:同3.1,我们也可以知道在用户不同表空间下各有多少索引:

SELECT count(*) FROM dba_segments where tablespace_name = '&表空间1' and owner = '&用户名' and segment_type = 'INDEX'

UNION

SELECT count(*) FROM dba_segments where tablespace_name = '&表空间2' and owner = '&用户名' and segment_type = 'INDEX';

3.3、LOB字段的表空间迁移

1、查看有哪些blob字段

SELECT a.table_name, a.column_name, a.segment_name, b.tablespace_name, b.bytes -- b.btypes为lob字段总大小

FROM user_lobs a, user_segments b

where a.segment_name = b.segment_name;

2、再逐个或批量修改CLOB、BLOB字段所属表空间

-- 注意是LOB(col_lob1, col_lob2...)

ALTER TABLE TEST2 MOVE TABLESPACE table_DstTablespace LOB(col_lob1,col_lob2) STORE AS(TABLESPACE lob_DstTablespace);

最后

有可能还会遇到如下问题:ORA-14063:唯一/主约束条件关键字中存在无用索引:

1c8f42b6cc6bd47d269c8b3512adabe2.png

解决方法:rebuild无效索引。

-- 查看有哪些索引是无效的

SELECT tablespace_name,

index_name,

table_name,

table_owner,

index_type,

status

FROM user_indexes

where status <> 'VALID';

-- 批量重构无效索引

select 'alter index ' || index_name || ' rebuild;'

from user_indexes

where tablespace_name = '&tablespaceName'

and status <> 'VALID' --(过滤无效索引后重建)

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是在Oracle中创建数据表空间的步骤: 1. 使用SYS或SYSTEM用户登录到Oracle数据库。 2. 执行以下SQL语句创建一个新的表空间: ```sql CREATE TABLESPACE tablespace_name DATAFILE 'tablespace_file_location' SIZE tablespace_size AUTOEXTEND ON; ``` 其中,`tablespace_name`是你想要创建的表空间的名称,`tablespace_file_location`是表空间数据文件的路径和名称,`tablespace_size`是表空间的大小,可以使用K、M、G等单位。 例如,以下SQL语句将创建一个名为`my_tablespace`的表空间,数据文件位于`/u01/app/oracle/oradata/mydb/my_tablespace.dbf`,大小为100MB: ```sql CREATE TABLESPACE my_tablespace DATAFILE '/u01/app/oracle/oradata/mydb/my_tablespace.dbf' SIZE 100M AUTOEXTEND ON; ``` 3. 如果需要,可以为表空间指定其他选项,例如设置表空间的默认存储参数: ```sql CREATE TABLESPACE tablespace_name DATAFILE 'tablespace_file_location' SIZE tablespace_size AUTOEXTEND ON DEFAULT STORAGE ( INITIAL initial_extent NEXT next_extent MAXEXTENTS max_extents PCTINCREASE percent_increase ); ``` 其中,`initial_extent`是表空间的初始大小,`next_extent`是表空间的下一个增量大小,`max_extents`是表空间的最大大小,`percent_increase`是表空间的增长百分比。 例如,以下SQL语句将创建一个名为`my_tablespace`的表空间,数据文件位于`/u01/app/oracle/oradata/mydb/my_tablespace.dbf`,大小为100MB,初始大小为10MB,下一个增量大小为5MB,最大大小为200MB,增长百分比为20%: ```sql CREATE TABLESPACE my_tablespace DATAFILE '/u01/app/oracle/oradata/mydb/my_tablespace.dbf' SIZE 100M AUTOEXTEND ON DEFAULT STORAGE ( INITIAL 10M NEXT 5M MAXEXTENTS 20 PCTINCREASE 20 ); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值