1、问题说明
先上截图,朋友问我他这边有个客户,Expdp导出数据报错如下图所示是什么毛病
既然是提示表空间无法扩展,那么问题就很明显了
查看一下,这个表空间可用空间严重不足了
这个截图来自于1个国外大佬写的巡检脚本,适合10G/11G数据库的环境,有需要的小伙伴可以恢复在我公众号里点击“巡检脚本”获取。
我一般是放在/home/oracle目录下,然后按如下执行
sqlplus / as sysdba
@/home/oracle/dba_snapshot_database.sql
执行后会自动在/home/oracle目录下生成html报告。
回到刚才的问题。一切的现像也符合官方文档Data Pump Export/Import (EXPDP/IMPDP) = ORA-39171 ORA-1691 (Doc ID 1957683.1)的说法
The default tablespace of the schema that runs the expdp (or impdp) is not large enough to hold the LOB segments used in the so-called Master Table created during the Data Pump job.
2、处理
这里官方文档给出来两个办法:
1、给执行导出任务用户的默认表空间扩容,来解决这个问题。
2、停止这个任务,再创建一个默认表空间比较大的用户,该用户的权限如下,使用该用户再执行EXPDP的任务
--创建用户
connect / as sysdba
create user expdp_user identified by <password> default tablespace users;
alter user expdp_user quota unlimited on users;
grant create session, create table, dba to expdp_user;
grant read, write on directory my_dir to expdp_user;
--执行导出
expdp expdp_user/<password> directory=my_dir dumpfile=expdp_f%U.dmp logfile=expdp_f.log reuse_dumpfiles=y full=y parallel=5
当然,这种情况还是选择第1个方法比较靠谱,直接扩容避免不必要的麻烦。
再附几个查询表空间使用情况的脚本
查询表空间使用情况SQL
set pagesize 200;
set linesize 100;
SELECT Upper(F.TABLESPACE_NAME) "tablespace_name",
D.TOT_GROOTTE_MB "tablespace_total_MB",
D.TOT_GROOTTE_MB - F.TOTAL_BYTES "usedspace_M",
To_char(Round(( D.TOT_GROOTTE_MB - F.TOTAL_BYTES ) / D.TOT_GROOTTE_MB * 100, 2), '990.99')
|| '%' "use_prescent",
F.TOTAL_BYTES "free_space_M",
F.MAX_BYTES "max_block_M"
FROM (SELECT TABLESPACE_NAME,
Round(Sum(BYTES) / ( 1024 * 1024 ), 2) TOTAL_BYTES,
Round(Max(BYTES) / ( 1024 * 1024 ), 2) MAX_BYTES
FROM SYS.DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F,
(SELECT DD.TABLESPACE_NAME,
Round(Sum(DD.BYTES) / ( 1024 * 1024 ), 2) TOT_GROOTTE_MB
FROM SYS.DBA_DATA_FILES DD
GROUP BY DD.TABLESPACE_NAME) D
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
ORDER BY 1;
查询PDB总容量
show pdbs;
set pagesize 100;
select con_id, sum(bytes)/1024/1024/1024 as GB from cdb_data_files group by con_id order by con_id;
查旬CDB总数据量
select sum(bytes)/1024/1024/1024 as GB from cdb_data_files;