ревизия БД на Oracle
От: Anton Batenev Россия https://github.com/abbat
Дата: 06.09.05 08:43
Оценка:
Hello All!

Сложилась такая ситуация, что мне на новом месте работы достался в наследство проект, который до меня несколько лет разрабатывался, латался, дорабатывался и т.д. большим количеством разработчиков. Поскольку "каждая метла метет по своему", то как в программной части, так и в базе накопилось как большое количество мусора (таблицы, вьюшки, процедуры и функции), которые не используются в проекте, висят мертвым грузом и только мешают, а так же, которые используются, но абсолютно не документированы (и написаны без какого-либо форматирования текста как курица лапкой). Хотелось бы провести всему этому ревизию и жестокое глумление на предмет удаления мусора, документирования и форматирования существующей части. Дабы не тратить уйму времени на открытие каждого объекта БД ручками и просмотр связей / форматирование / документирование, хотелось бы все это вытащить из базы в txt, прогнать форматтером, анализатором, задокументировать, положить в репозиторий и прочее.

Итак, вопросы:

* как получить за максимально короткое время и количество операций скрипты для создания всех таблиц, вьюшек, функций и процедур? По сути, заскриптовать всю базу, чтобы потом этот скрипт можно было просто выполнить для создания всей структуры с нуля?
* как найти все "мертво-висящие" объекты? я понимаю, что данная задача не совсем тривиальна, но может у кого есть идеи на этот счет?
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re: ревизия БД на Oracle
От: wildwind Россия  
Дата: 06.09.05 09:31
Оценка: 12 (1)
Здравствуйте, Anton Batenev, Вы писали:

AB>* как получить за максимально короткое время и количество операций скрипты для создания всех таблиц, вьюшек, функций и процедур? По сути, заскриптовать всю базу, чтобы потом этот скрипт можно было просто выполнить для создания всей структуры с нуля?


Это позволяют сделать такие утилиты, как EM, SQL Navigator, PL/SQL Developer, TOAD и т.п. Можно даже в SQL*Plus, используя пакет dbms_metadata.

AB>* как найти все "мертво-висящие" объекты? я понимаю, что данная задача не совсем тривиальна, но может у кого есть идеи на этот счет?


Ты далеко не первый, кто этим озаботился. Представления user_dependencies, all_dependencies покажут зависимости объектов схемы. Зависимости в клиентском коде конечно надо искать самому, но это тоже не большая проблема.
Re[2]: ревизия БД на Oracle
От: Anton Batenev Россия https://github.com/abbat
Дата: 06.09.05 10:00
Оценка:
Здравствуйте, wildwind, Вы писали:

AB>>* как получить за максимально короткое время и количество операций скрипты для создания всех таблиц, вьюшек, функций и процедур? По сути, заскриптовать всю базу, чтобы потом этот скрипт можно было просто выполнить для создания всей структуры с нуля?

W>Это позволяют сделать такие утилиты, как EM, SQL Navigator, PL/SQL Developer, TOAD и т.п. Можно даже в SQL*Plus, используя пакет dbms_metadata.

Хм... что-то я не могу найти как скриптовать объекты не по одному в PL/SQL Developer. Не там ищу? Или только по одному?

AB>>* как найти все "мертво-висящие" объекты? я понимаю, что данная задача не совсем тривиальна, но может у кого есть идеи на этот счет?

W>Ты далеко не первый, кто этим озаботился. Представления user_dependencies, all_dependencies покажут зависимости объектов схемы. Зависимости в клиентском коде конечно надо искать самому, но это тоже не большая проблема.

Еще, а можно ли узнать дату последнего обращения к объекту? (внесения / изменения / удаления) данных в таблице, вызова view / функции?
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[3]: ревизия БД на Oracle
От: wildwind Россия  
Дата: 06.09.05 10:33
Оценка: 12 (1)
Здравствуйте, Anton Batenev, Вы писали:

AB>Хм... что-то я не могу найти как скриптовать объекты не по одному в PL/SQL Developer. Не там ищу?


А где ищешь? Tools/Export user objects.

AB>Еще, а можно ли узнать дату последнего обращения к объекту? (внесения / изменения / удаления) данных в таблице, вызова view / функции?


Стоп, не надо все в одну кучу. Обращения бывают разные. Изменения структуры, метаданных отражаются в xxx_objects.last_ddl_time. Изменение данных, вызовы функций — это называется аудит.
Re: ревизия БД на Oracle
От: Аноним  
Дата: 06.09.05 17:42
Оценка: 12 (1)
AB>* как получить за максимально короткое время и количество операций скрипты для создания всех таблиц, вьюшек, функций и процедур? По сути, заскриптовать всю базу, чтобы потом этот скрипт можно было просто выполнить для создания всей структуры с нуля?

Из Кайт. Oracle для профессионалов, том 1. Глава 6.

getaview.sql

REM getaview.sql
set heading off
set long 99999999
set feedback off
set linesize 1000
set trimspool on
set verify off
set termout off
set embedded on
column column_name format Al000
column text format Al000
spool &1..sql
prompt create or replace view 41 (
select decode (column_id,l,'',',') || column_name column_name
from user_tab_colunms
where table_name = upper('&1')
order by column_id
/
prompt ) as
select text
from user_views
where view_name = upper('&1')
/
prompt /
spool off
set termout on
set heading on
set feedback on
set verify on


getallviews.sql

set heading off
set feedback off
set linesize 1000
set trimspool on
set verify off
set termout off
set embedded on
spool tmp.sql
select '@getaview ' || view_name
from user_views
/
spool off
set termout on
set heading on
set feedback on
set verify on
@tmp


gettrig.sql

set echo off
set verify off
set feedback off
set termout off
set heading off
set pagesize 0
set long 99999999
spool &1..sql
select
'create or replace trigger " ' ||
trigger_name || '"' || chr(10)||
decode(substr(trigger_type, 1, 1),
'A', 'AFTER', 'B', 'BEFORE', 'I', 'INSTEAD OF') ||
chr(10) ||
triggering_event || chr (10) ||
'ON "' || table_owner || '"."' ||
table_name || "" || chr(10) ||
decode(instr( trigger_type, 'EACH ROW), 0, null,
'FOR EACH ROW) || chr(10),
trigger_body
from user_triggers
where trigger_name = upper('&1')
/
prompt /
spool off
set verify on
set feedback on
set termout on
set heading on


Думаю, куда копать ясно. Там же описано как используя IMP/EXP выковырнуть скрипт для создания таблиц.
Re[4]: ревизия БД на Oracle
От: Anton Batenev Россия https://github.com/abbat
Дата: 07.09.05 01:19
Оценка:
Здравствуйте, wildwind, Вы писали:

AB>>Хм... что-то я не могу найти как скриптовать объекты не по одному в PL/SQL Developer. Не там ищу?

W>А где ищешь? Tools/Export user objects.

Ага, нашел!

AB>>Еще, а можно ли узнать дату последнего обращения к объекту? (внесения / изменения / удаления) данных в таблице, вызова view / функции?

W>Стоп, не надо все в одну кучу. Обращения бывают разные. Изменения структуры, метаданных отражаются в xxx_objects.last_ddl_time. Изменение данных, вызовы функций — это называется аудит.

Интересует изменение. Есть идея проверить даты внесения / изменения / удаления данных в таблицах и, где последнее подобное обращение было достаточно давно, то можно сделать предположение о том, что это мусор (предварительно проверив, естественно). Требуется ли как-то включать аудит? Как? Где можно посмотреть данные об использовании?

P.S. Большое спасибо всем ответившим!
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[5]: ревизия БД на Oracle
От: wildwind Россия  
Дата: 07.09.05 07:37
Оценка:
Здравствуйте, Anton Batenev, Вы писали:

AB>Интересует изменение. Есть идея проверить даты внесения / изменения / удаления данных в таблицах и, где последнее подобное обращение было достаточно давно, то можно сделать предположение о том, что это мусор (предварительно проверив, естественно).


Забудь об этой идее. Такого предположения делать нельзя.

AB>Требуется ли как-то включать аудит? Как? Где можно посмотреть данные об использовании?


По умолчанию СУБД ничего не отслеживает, так как это дополнительная нагрузка. То есть данных о том, что и как изменялось до тебя, нигде нет. Про аудит читай документацию. Он включается для конкретного объекта и конкретных операций.
Re: ревизия БД на Oracle
От: iac Россия  
Дата: 07.09.05 08:49
Оценка:
Здравствуйте, Anton Batenev, Вы писали:

AB>* как получить за максимально короткое время и количество операций скрипты для создания всех таблиц, вьюшек, функций и процедур? По сути, заскриптовать всю базу, чтобы потом этот скрипт можно было просто выполнить для создания всей структуры с нуля?


Рекомендую использовать пакет ERWin, сейчас последняя версия (AllFusion ERwin Data Modeler 4.1.4 SP2).
И с его помощью выполнить обратное моделирование. В итоге получится Полное мета описание всей схемы пользователя, включая графическое представление объектов и связей между ними. В дальнейшем из ERWinа можно получить и скрипт для генерации всей схемы.

AB>* как найти все "мертво-висящие" объекты? я понимаю, что данная задача не совсем тривиальна, но может у кого есть идеи на этот счет?


Если считать "мертво-висящими" те обыекты, которые не используются, то можно:
— включить аудит в oracle на уровне объектов и прогнать всю накопленную функциональность в качестве теста и проанализировать рез-ты аудита на предмет обращения к объектам.
— прогнать всю функциональность армов и не перегружая базу просмотреть выполнявшиеся запросы
select * from v$sql
(shared pool должен быть достаточно большим)
— Циклический поиск каждого объекта в каталоге с исходным кодом.
Затем надо крепко подумать над результатами таких изысканий прежде чем что-то делать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.