最近因为要测试,一直在重导生产库的数据导测试库里面,由于生产库数据比较大,导入时间比较久,这种情况自己在心里已有一定的预期,但是在导入data数据时,跑了一天,进度一直没有进展,然后就纳闷了,于是查了一下库空间使用情况,
SELECT total.tablespace_name,
Round(total.MB, 2) AS Total_MB,
Round(total.MB - free.MB, 2) AS Used_MB,
Round(( 1 - free.MB / total.MB ) * 100, 2)
|| '%' AS Used_Pct
FROM (SELECT tablespace_name,
Sum(bytes) / 1024 / 1024 AS MB
FROM dba_free_space
GROUP BY tablespace_name) free,
(SELECT tablespace_name,
Sum(bytes) / 1024 / 1024 AS MB
FROM dba_data_files
GROUP BY tablespace_name) total
WHERE free.tablespace_name = total.tablespace_name;
发现原有的一个数据库undotbs1的设备不见了,这才发现原来是undo空间爆满,导致设备不可见。
新增undotbs设备即可。
但其实最好的方式还是在数据导入前做好undo空间的规划,以下是我的做法:
1. 新增一个临时的undo tablespace ( undotbs2 )
create undo tablespace UNDOTBS2 datafile '/u01/app/oracle/oradata/asp/undotbs02.dbf' size 20M extent management local;
2. 设置使用新增的undo tablespace.(共存)
alter system set undo_tablespace=UNDOTBS2 scope=both;
3. 删除旧的设备undotbs1
drop tablespace UNDOTBS1 including contents and datafiles cascade constraints;
4. 重建undotbs1
create undo tablespace UNDOTBS1 DATAFILE '/u01/app/oracle/oradata/asp/undotbs01_1.dbf' SIZE 2048M autoextend on next 100m maxsize unlimited;
alter tablespace UNDOTBS1 add DATAFILE '/u01/app/oracle/oradata/asp/undotbs01_2.dbf' SIZE 2048M autoextend on next 100m maxsize unlimited;
5. 设置使用新的undotbs1(共存)
alter system set undo_tablespace=UNDOTBS1 scope=both;
6. 删除临时undo tablespace (删除undotbs2表空间)
drop tablespace UNDOTBS2 including contents and datafiles cascade constraints;
画外音:
1、在Oracle数据库里面,数据库表空间自增长最大只能到32G,并不是无限增长;
2、如果在一个给定的已知数据量较大的数据库环境下,在创建数据块时,最好创建多个固定大小的数据块,以便后期扩容;
3、如果在一个未知数据量的数据库环境下,在创建数据块时,可以采用创建少数个可自增长的数据库表空间。