Для удаления из таблицы AUD$ для начала экспортируем данные в файл, для этого мы будем использовать утилиту exp.
Для экспорта из схемы SYS НЕЛЬЗЯ использовать утилиту expdp.
Создаем файл параметров export_aud.par
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 года.
Теперь можно удалить данные из таблицы, выполняем удаление с условием:
Для экспорта из схемы 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);
Комментариев нет:
Отправить комментарий