首页 > 数据库 >Oracle impdp只导入元数据占用大量空间以及如何删除空段

Oracle impdp只导入元数据占用大量空间以及如何删除空段

时间:2024-07-08 17:10:28浏览次数:12  
标签:ZKM 00 impdp name 49 16 35 Oracle 空段

 

Oracle impdp只导入元数据占用大量空间以及如何删除空段

 

从某个库导出整个库的元数据,在另外一个新库导入元数据,发现导入时间久并且占用了大量空间。

有好几张的空表甚至能占用十几二十G大小的空间,看了一下都是按天分区的间隔分区表,每个分区会有8M的大小。

 

通过在源库使用dbms_metadata.get_ddl包查看某张表的ddl(不要用PLSQL Developer工具看)可以发现原因,

1、表的ddl中带了子句“SEGMENT CREATION IMMEDIATE”,即会立刻分配一个段给到表(或者分区)

2、表的ddl中分区表的每个分区的storage的初始化大小initial为8388608,即8k

导致在新库导入元数据的时候,也会分配空间,并且是每个分区都是8k。

 

那么现在又有另外的两个问题:

1、数据库参数deferred_segment_creation为默认值true,表示创建空表的时候不会分配空间,为什么ddl中会带“SEGMENT CREATION IMMEDIATE”

2、默认的ASSM管理表空间中,默认情况下,普通表的段里边的区大小是0~15号都是64k大小,而分区表是否每个分区则是8M。

 

先解答这两个疑问,

第一个问题很好解答,只要表里边曾经存在过数据,那么ddl的属性会自动变成“SEGMENT CREATION IMMEDIATE”,无论deferred_segment_creation是不是true

测试如下(需要使用非SYS用户):

16:27:59 SYS@xxxxdb(79)> show parameter deferred_segment_creation

NAME                                 TYPE                              VALUE
------------------------------------ --------------------------------- ------------
deferred_segment_creation            boolean                           TRUE
16:28:02 SYS@xxxxdb(79)> conn zkm/zkm
Connected.
16:28:50 ZKM@xxxxdb(79)> create table test(id int,name varchar2(20));

Table created.

Elapsed: 00:00:00.02


16:29:07 SYS@szceb2(81)> select dbms_metadata.get_ddl('TABLE','TEST','ZKM') from dual;

DBMS_METADATA.GET_DDL('TABLE','TEST','ZKM')
--------------------------------------------------------------------------------

  CREATE TABLE "ZKM"."TEST"
   (    "ID" NUMBER(*,0),
        "NAME" VARCHAR2(20)
   ) SEGMENT CREATION DEFERRED
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
 NOCOMPRESS LOGGING
  TABLESPACE "USERS"


16:29:46 ZKM@xxxxdb(79)> insert into test values(1,'zkm');

1 row created.

Elapsed: 00:00:00.01

16:29:08 SYS@szceb2(81)> select dbms_metadata.get_ddl('TABLE','TEST','ZKM') from dual;

DBMS_METADATA.GET_DDL('TABLE','TEST','ZKM')
--------------------------------------------------------------------------------

  CREATE TABLE "ZKM"."TEST"
   (    "ID" NUMBER(*,0),
        "NAME" VARCHAR2(20)
   ) SEGMENT CREATION IMMEDIATE
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXT
ENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"

 

 

第二个问题测试,

16:49:22 ZKM@xxxxdb(79)> CREATE TABLE test
16:49:35   2   (    "USERNAME" VARCHAR2(30) NOT NULL ENABLE,
16:49:35   3        "USER_ID" NUMBER NOT NULL ENABLE,
16:49:35   4        "ACCOUNT_STATUS" VARCHAR2(32) NOT NULL ENABLE,
16:49:35   5        "LOCK_DATE" DATE,
16:49:35   6        "EXPIRY_DATE" DATE,
16:49:35   7        "DEFAULT_TABLESPACE" VARCHAR2(30) NOT NULL ENABLE,
16:49:35   8        "TEMPORARY_TABLESPACE" VARCHAR2(30) NOT NULL ENABLE,
16:49:35   9        "CREATED" DATE NOT NULL ENABLE,
16:49:35  10        "INITIAL_RSRC_CONSUMER_GROUP" VARCHAR2(30),
16:49:35  11        "EXTERNAL_NAME" VARCHAR2(4000),
16:49:35  12        "CREATE_TIME" DATE
16:49:35  13   )
16:49:35  14  PARTITION BY RANGE ("CREATE_TIME") INTERVAL(NUMTODSINTERVAL(1,'DAY'))
16:49:36  15   (PARTITION "P_INIT"  VALUES LESS THAN (TO_DATE('2024-07-08 00:00:00', 'YYYY-MM-DD HH24:MI:SS')));

Table created.

Elapsed: 00:00:00.04
16:49:37 ZKM@xxxxdb(79)> select extent_id,blocks,sys.format_bytes(bytes) sizes from user_extents where segment_name='TEST' order by extent_id;

no rows selected

Elapsed: 00:00:00.02
16:49:44 ZKM@xxxxdb(79)> INSERT INTO TEST SELECT T.*,SYSDATE FROM USER_USERS T WHERE ROWNUM=1;

1 row created.

Elapsed: 00:00:00.06
16:50:00 ZKM@xxxxdb(79)> select extent_id,blocks,sys.format_bytes(bytes) sizes from user_extents where segment_name='TEST' order by extent_id;

 EXTENT_ID     BLOCKS   SIZES
---------- ---------- ----------
         0       1024      8 MiB

Elapsed: 00:00:00.04

 

那么,impdp如何导入元数据的时候不要常见段呢?可以使用transform=segment_attributes:N,忽略“SEGMENT CREATION IMMEDIATE”,

eg:

impdp \' / as sysdba \' directory=dir20240704 dumpfile=metadata_DB.dmp logfile=imp_metadata_DB.log cluster=n schemas=user1,user2,user3 exclude=statistics,db_link table_exists_action=skip content=metadata_only transform=segment_attributes:N

 

对于已经分配了空间的空闲段,可以使用如下脚本来进行回收空间,

BEGIN
DBMS_SPACE_ADMIN.drop_empty_segments (
schema_name => 'schema',
table_name => 'table_name',
partition_name => 'partition_name');
END;
/

 

如果上边的参数为null,表示通配符,所有的空段都会被删除,比如直接执行下边的语句,会删除整个库里边的空段。

https://www.cnblogs.com/PiscesCanon/p/18290344

BEGIN
DBMS_SPACE_ADMIN.drop_empty_segments (
schema_name => '',
table_name => '',
partition_name => '');
END;
/

 

也可以只指定schema_name为某个用户,即删除某个用户下的所有空段。

 

标签:ZKM,00,impdp,name,49,16,35,Oracle,空段
From: https://www.cnblogs.com/PiscesCanon/p/18290344

相关文章

  • Oracle PL/SQL 循环批量执行存储过程
    1.查询存储过程        根据数据字典USER_OBJECTS查询出所有存储过程。2.动态拼接字符串(参数等)    根据数据字典USER_ARGUMENTS动态拼接参数。3.动态执行    利用EXECUTEIMMEDIATE动态执行无名块。4.输出执行信息    利用DBMS_OUT......
  • oracle控制台创建表空间,用户名
    1、打开doc命令行窗口,通过sqlplus/assysdba输入用户名密码进入>sql2、将下列的”用户名“、”密码“、”表空间名“替换称自己的,不允许出现中文,尽量用大写,避免奇怪的问题---删除用户dropuser用户名cascade;--删除表空间droptablespace表空间名includingcontentsan......
  • windows版Oracle11g安装记录
    一、下载Oracle 11g数据库安装包已上传至博客园文件中二、安装Oracle11g下载下来是下图这样的两个压缩包:1、解压这两个压缩包到同一个文件夹(切记路径文件不可有中文、空格和不规则字符。):2、将解压好的win64_11gR2_database_2of2\database\stage\Components下的所有文件拷......
  • oracle 表数据指定表字段,并筛选出重复项
    之前线上遇到了个问题,需要临时处理一下同步过来的数据,删除重复项,当时没写出来这个sql,泪目.....正好空下来了,理一下怎么写这个sqlsql主要用到的还是row_number这个函数,他会为根据指定条件,每行数据分配一个序号语法格式:row_number()over(partitionby分组列orderby排序列d......
  • Oracle死锁解决方式
    死锁是指在Oracle数据库中,两个或多个事务相互等待对方持有的锁资源,导致它们无法继续执行下去,从而形成死锁现象解决方式如下:查询死锁信息:selectSID,USERNAME,LOCKWAIT,STATUS,MACHINE,PROGRAM,EVENTfromV$SESSIONwhereSIDin(selectSESSION_IDfromV$LOCKED_OBJECT)......
  • Oracle数据库高可用性研究与分析(毕业论文)
    摘要本文深入研究了Oracle数据库的高可用技术,重点探讨了RAC(实时应用集群)、DataGuard、ASM(自动存储管理)以及RMAN(恢复管理器)等核心组件的原理与框架。通过构建一套以“RAC+RMAN”为核心的高可用架构,本文旨在为企业提供一套高性能、高可用且高稳定的数据库环境。该架构不仅......
  • Oracle语法
    OracleOracle数据和Mysql数据库都是十分常见的数据库,使用都很广泛,使用过的人会发现在写sql语句时两者之间大多数语法是相通的,但是也有一些地方语法不一样,今天我们一起来浅聊一下它们的区别吧1.dual1.oracle中select语句后边的from是不能省略的,如果没有实际的表,可以用dual作为fr......
  • Oracle PL / SQL INTERVAL数据类型
    INTERVALYEARTOMONTH数据类型INTERVALYEARTOMONTH存储和操作年和月的间隔。语法是:INTERVALYEAR[(precision)]TOMONTHprecision指定“years”字段中的数字位数。我们必须在0..4的范围内使用整数字面值。默认值为2。以下代码显示如何将字面值分配到INTERVALY......
  • Oracle PL / SQL变量范围
    变量范围指的是当另一个PL/SQL块可以看到声明的项目时。在函数或过程的声明部分中声明的任何项只在同一函数或过程中可见。在包主体的声明部分中声明的任何项只在同一包主体中的任何其他项内可见。在包规范中声明的任何项目对于调用方法的所有者具有执行特权的任何其他存......
  • Oracle闪回(Flashback)功能简介
        在Oracle数据库中,ASOFTIMESTAMP语法用于使用时间戳技术访问特定时间之前的数据,或者说把数据库回滚到某个时间点以前的状态。它基于Oracle的时间戳功能,允许用户查询某个表在特定时间点的快照。其语法如下:SELECT<COLUMNS>FROM<TABLE>ASOFTIMESTAMP<TIMESTAMP>......