YandexDirect

21 мая 2018

Экспорт и удаление из системной таблицы SYS.AUD$

Для удаления из таблицы AUD$ для начала экспортируем данные в файл, для этого мы будем использовать утилиту exp.

Для экспорта из схемы SYS НЕЛЬЗЯ использовать утилиту expdp.

Создаем файл параметров export_aud.par


$vi export_aud.par

buffer=2000000 

FILE=AUD_01012018_31012018.dmp

LOG=AUD_01012018_31012018.log

TABLES=SYS.AUD$

FEEDBACK=100000

query="where ntimestamp# between TO_DATE('01.01.2018','dd.mm.yyyy') AND TO_DATE('31.01.2018','dd.mm.yyyy')"




FEEDBACK=100000 -- этот параметр говорит, через каждые 100 тыс экспортированных записей будет отображаться точка (.)
query="where ntimestamp# between TO_DATE('01.01.2018','dd.mm.yyyy') AND TO_DATE('31.01.2018','dd.mm.yyyy')" - этот параметр означает делать выборку по условию из таблицы SYS.AUD$ , в данном случае выбираем данные за январь 2018 года.


exp <username> parfile=/tmp/path/export_aud.par



Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,

Data Mining and Real Application Tes

Export done in US7ASCII character set and AL16UTF16 NCHAR character set

server uses CL8MSWIN1251 character set (possible charset conversion)


 About to export specified tables via Conventional Path ...

Current user changed to SYS

. . exporting table                           AUD$

...........................................................................

...................................

                                                     11028834 rows exported

EXP-00091: Exporting questionable statistics.

Export terminated successfully with warnings.
Смотрим когда собиралась статистика для таблицы AUD$:




sql>select LAST_ANALYZED,owner, table_name,num_rows from dba_tables where table_name='AUD$';


 LAST_ANALYZED OWNER TABLE_NAME NUM_ROWS




29.03.2018 14:52:56 SYS                 AUD$                  357923057
Собираем статистику:


sql>exec dbms_stats.gather_table_stats (ownname=>'SYS', tabname=>'AUD$' , estimate_percent=>10, cascade=>TRUE, degree=>5);






 sql>select LAST_ANALYZED,owner, table_name,num_rows from dba_tables where table_name='AUD$';


 LAST_ANALYZED OWNER TABLE_NAME NUM_ROWS


 22.05.2018 18:20:00 SYS AUD$ 398420120


Теперь можно удалить данные из таблицы, выполняем удаление с условием:




sql>delete from sys.aud# where ntimestamp# between TO_DATE('01.01.2018','dd.mm.yyyy') AND TO_DATE('31.01.2018','dd.mm.yyyy');




sql>commit;
Либо применяем альтернативный вариант удаления в цикле:



BEGIN

  LOOP

    delete from sys.aud$ where ntimestamp# between TO_DATE('01.01.2018','dd.mm.yyyy') AND TO_DATE('31.01.2018','dd.mm.yyyy') AND ROWNUM <= 1000;

    dbms_output.put_line(sql%rowcount);

    EXIT WHEN SQL%ROWCOUNT = 0;

    COMMIT;

   END LOOP;




END;
После удаления необходимо еще раз собрать статистику:


sql>exec dbms_stats.gather_table_stats (ownname=>'SYS', tabname=>'AUD$' , estimate_percent=>10, cascade=>TRUE, degree=>5);



Комментариев нет:

Отправить комментарий

Общее·количество·просмотров·страницы