Oracle
 sql >> база данни >  >> RDS >> Oracle

Използване на LogMiner за намиране на текущи промени

Може да има случаи, когато е необходимо да се проучат последните промени в базата данни и да се докладва какво е променено, кога и от кого. От години пакетът DBMS_LOGMNR на Oracle е наличен за такива задачи, но извикванията му не са напълно обхванати. Конвенционалните методи използват процедурата ADD_LOGFILE(), за да подготвят Log Miner за използване с основно извикване на процедурата START_LOGMNR. Това стартира помощната програма с текущия SCN като начална точка. Има и друг начин да стартирате Log Miner, като изберете валиден начален SCN и го предоставите на повикването START_LOGMNR(). В тази статия ще видите как може да се направи това и в процеса ще разкриете възможна проблемна област с разпределението на PGA.

Разглеждайки скрипт „обикновен ванилия“ за стартиране на Log Miner, се правят обичайните извиквания на процедури, които стартират Log Miner с текущия SCN:

---- run_logmnr.sql---- Добавете лог файлове и задайте DBMS_LOGMNR да-- непрекъснато копаене на архивни регистри--задайте размер на редове 200 trimspool на pagesize 0---- Добавяне на съществуващите лог файлове---- Пропускане на резервни лог файлове- -select 'exec dbms_logmnr.add_logfile('''||member||''')'от v$logfile, където въведете <> 'STANDBY'и член в (изберете min(член) от v$logfile група по група#)spool /tmp/add_logfiles.sql/spool off@/tmp/add_logfiles---- Стартирайте logmnr в непрекъснат режим на копаене--exec dbms_logmnr.start_logmnr(options => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG> + DBMSDINLOGOLOGMUSNR.DBMSTINLOGOLOGMUSNR.DBMSTINLOGOLOGMUSDMBS_DOBM_LOGMNR.Dbms_logmnr.start_logmnr 

Имайте предвид, че всички налични регистрационни файлове за повторно изпълнение се добавят преди стартиране на Log Miner. Съществува друг метод, който предоставя начален SCN на извикването start_logmnr, стига базата данни да работи в режим ARCHIVELOG:

BEGIN DBMS_LOGMNR.START_LOGMNR( startScn => <стартиране на SCN>, endScn => <стоп на SCN>, OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + DBMS_LOGMNR.COMMITTED_DATA_ONLY + DBMS_LOGONUS;.MINETI_LOGONUS;. 

Интересното е, че крайният SCN не е необходим, за да започне сесия на Log Miner. Базата данни трябва да е в режим ARCHIVELOG, за да може да се посочи опцията CONTINUOUS_MINE, защото Log Miner автоматично ще добавя всеки наличен архивиран лог файл, докато работи. Използването на този метод позволява използването на специфичен SCN за стартиране на всяко търсене; задаване на крайното търсене в SCN скоби, така че само ограничен подмножество от данни да се връща към изгледа V$LOGMNR_CONTENTS и осигурява точка на спиране на търсенето, така че заявката на изгледа може да приключи.

Лесна задача е да наблюдавате напредъка на Log Miner, като проверявате дневника за предупреждения на базата данни, когато се регистрират записи, маркирани с „LOGMINER“. Пълният запис ще включва ред BEGIN и END, както е показано по-долу:

Mon Oct 07 12:48:22 2019LOGMINER:Край на регистрационния файл за копаене за сесия -2147482111 нишка 1 последователност 9776, /oracle/archive/awcis/awcis_0000009776_0001_1008544407 мин. за сесия 2147482111 нишка 1 9776, /oracle/archive/awcis/awcis_0000009776_0001_1008544407 min. 2147482111 Нишка 1 последователност 9777, /oracle/archive/awcis/awcis_0000009777_0001_1008544071.Arcmon Oct 07 12:48:36 2019logminer:End Mining Logfile за сесия -2147482111 Тема 1 последователност 9777, /oracle :48:36 2019LOGMINER:Започнете копаене на лог файл за сесия -2147482111 нишка 1 последователност 9778, /oracle/archive/awcis/awcis_0000009778_0001_1008544071.arcMon12 LOGfil2:419 мин. последователност 10:419 мин. сесия 07:19 мин. oracle/archive/awcis/awcis_0000009778_0001_1008544071.arcMon 07 октомври 12:48:49 2019LOGMINER:Започнете копаене на регистрационен файл за сесия -2147482111 нишка 1 нишка 1/последователност 977/7080/07/070709_07/07070708 

За локални сесии на Oracle числата са цели положителни числа; за отдалечени сесии, инициирани от помощни програми като Perl, Python, C/C++ или други езици, ще се видят отрицателни цели числа (показаните по-горе записи са инициирани от скрипт на Python). Имената на регистрационните файлове ще преминават през онлайн регистрационните файлове за повторно изпълнение и наличните архивирани копия.

Стартирането на Log Miner по този начин може също да доведе до грешки като „липсващ регистрационен файл“, когато избраният начален SCN или SCN диапазон вече не е наличен в потока за повторно изпълнение. Дългосрочните заявки могат да срещнат такива грешки. Освен това, ако SCN е извън обхват по отношение на наличните регистрационни файлове Log Miner няма да стартира, хвърляйки:

ГРЕШКА на ред 1:ORA-01292:не е посочен регистрационен файл за текущата сесия на LogMinerORA-06512:на „SYS.DBMS_LOGMNR“, ред 58ORA-06512:на ред 2

За да се елиминират такива грешки, избирането на FIRST_CHANGE# от изгледа V$LOG ще осигури валидни начални точки за сесия на Log Miner; използването на подобна заявка към V$ARCHIVED_LOG ще върне всички налични начални SCN за архивираните повторни копия.

Това не е единственото усложнение при използването на Log Miner по този начин. В зависимост от това колко информация трябва да бъде върната, процесът Logmminer може да задели големи количества PGA памет, която може, ако pga_aggregate_limit е малка, да изведе следната грешка:

ORA-04036:PGA памет, използвана от екземпляра, надвишава PGA_AGGREGATE_LIMIT

за щастие това не е фатална грешка. Тъй като ресурсите на PGA вече не са необходими, паметта може да бъде освободена обратно в базата данни за използване на друго място. Въпреки това, може да отнеме малко повече време от желаното, за да се освободи тази памет обратно в пула памет. Една опция е да зададете pga_aggregate_limit по-високо от сумата от сесиите на Log Miner, което може да предотврати възникването на грешката. Откъде знаете каква памет е разпределена за тези сесии? Изглед, V$PROCESS_MEMORY_DETAIL, е наличен в базата данни. Но опитът за запитване на този изглед без известна подготовка ще върне:

няма избрани редове.

Това е сравнително малък проблем, но изисква използването на помощната програма oradebug. Следните стъпки ще заредят данни във V$PROCESS_MEMORY_DETAIL:

---- Задайте идентификатора на текущата сесия-- oradebug setmypid---- Използване на PID на желания процес-- изхвърлете данните от паметта---- Това попълва V$PROCESS_MEMORY_DETAIL--oradebug pga_detail_get - --- Запитвайте изгледа, за да получите желаните данни--изберете * От v$process_memory_detail;---- За да попълните отново изгледа с по-нови данни-- просто изпълнете оператора oradebug pga_detail_get---oradebug pga_detail_get    

По-долу е показан скрипт за извършване на тези действия:

---- Настройте средата за извиквания на oradebug--oradebug setmypidset echo off trimspool onset verify offundefine p_1undefine p_2undefine s1undefine s2variable p1 numbervariable p2 numbercolumn sys_date new_value sysdt to_md'srm_date new_value sysdt to_md'srm_sysdt to_md'srm_dt'; -- Вземете идентификатора на процеса на сесията --column pid new_value p_1изберете pid от v$process, където addr е (изберете paddr от v$session, където потребителско име ='' и sid =(изберете max(sid) от v$session, където потребителско име ='<ПОЛЗВАТЕЛ>'));начало :p1 :=&p_1;end;/---- Изхвърляне на детайлите на процеса към v$process_memory_detail--oradebug dump pga_detail_get &p_1spool &p_1._pga_stats_&sysdt..log-. - Вземете информация за сесията за <ПОЛЗВАТЕЛ>--COLUMN alme HEADING "Разпределени MB" ФОРМАТ 99999D9COLUMN usme HEADING "Използвани MB" ФОРМАТ 99999D9COLUMN frme HEADING "Свободен MB" ФОРМАТ 99999DMaCOLNME99MBNUMCOLNME999999DMaCOL9 потребител. FORMAT a22COLUMN sid FORMAT a5COLUMN spid FORMAT a8column pid_remote формат a12SET LINESIZE 300SELECT s.username, SUBSTR(s.sid,1,5) sid, p.spid, logon_time, SUBSTR(s.process) програма, 1,.2 pid_remote, s.status, ROUND(pga_used_mem/1024/1024) usme, ROUND(pga_alloc_mem/1024/1024) alme, ROUND(pga_freeable_mem/1024/1024) frme_ma ROUND_$msession/1024/1024 v$process pWHERE p.addr=s.paddrAND s.username ='<ПОЛЬЗОВАТЕЛ>'ПОРЪЧАЙ ОТ pga_max_mem,logon_time;---- Спи 30 секунди---- Вземете отново информация за сесията--exec dbms_lock.sleep(30) колона sid new_value s1 noprintSELECT s.username, SUBSTR(s.sid,1,5) sid, p.spid, logon_time, SUBSTR(s.program,1,22) program , s.process pid_remote, s.status, ROUND( pga_used_mem/1024/1024) usme, ROUND(pga_alloc_mem/1024/1024) alme, ROUND(pga_freeable_mem/1024/1024) frme, ROUND(pga_max_mem/1024/1024) 1024 v$session s,v$process pWHERE p.addr=s.paddrAND s.username ='<ПОЛЗВАТЕЛ>'ПОРЪЧАЙ ОТ pga_max_mem,logon_time;exec dbms_lock.sleep(10)изберете max(sid) sid от v$session където потребителско име ='<ПОЛЗВАТЕЛ>';---- Получаване на информация за паметта на процеса--COLUMN категория HEADING "Категория"COLUMN разпределена HEADING "Разпределени байтове"COLUMN използвана HEADING "Използвани байтове"COLUMN max_allocated HEADING "Макс. разпределени байтове"SELECT pid, категория, разпределен, използван, max_allocatedFROM v$process_memoryWHERE pid in (ИЗБЕРЕТЕ pid ОТ v$process WHERE addr в (изберете paddr ОТ v$session WHERE sid =&&s1));exec dbms_lock.sleep(10)ИЗБЕРЕТЕ pid, категория, разпределен, използван, max_allocatedFROM v$process_memoryWHERE pid in (ИЗБЕРЕТЕ pid ОТ v$process WHERE addr в (изберете paddr ОТ v$session WHERE sid =&&s1));exec dbms_lock.sleep(10)изберете pid от v$process whe re addr в (изберете paddr от v$session, където потребителско име ='' и sid =(изберете max(sid) от v$session, където потребителско име =''));---- Запазване на първия пропуск на pga stats--CREATE TABLE tab1 ASSELECT pid, категория, име, heap_name, байтове, allocation_count, heap_descriptor, parent_heap_descriptorFROM v$process_memory_detailWHERE pid =&p_1AND category ='Other';---- Вземете втори пас на pga_detail_dump-orade_gettail &p_1exec dbms_lock.sleep(120)---- Запазване на второто преминаване на pga stats--СЪЗДАВАНЕ НА ТАБЛИЦА tab2 ASSELECT pid, категория, име, heap_name, байтове, брой_разпределение, heap_descriptor, parent_heap_descriptorFROM v$process_memory_detail' &WHERO_1 pid_detail'; ---- Започнете окончателни отчети---- PGA информация за хепа--Категория на КОЛОНА ЗАГОЛОВКА "Категория"Име на КОЛОНА ЗАГОЛОВКА "Име"КОЛОНА heap_name HEADING "Име на хеп"КОЛОНА q1 ЗАГЛАВКА "Първа памет" Формат 999,999,999,999,999,999,999,999 месеца "qmHEAD99 " Формат 999,999,999,9 99COLUMN diff HEADING "Разлика" Формат S999,999,999,999SET LINES 150SELECT tab2.pid, tab2.category, tab2.name, tab2.heap_name, tab1.bytes q1, tab2.bytes q2, tabF2.bytes1, tabFb1. tab1.category =tab2.categoryAND tab1.name =tab2.nameAND tab1.heap_name =tab2.heap_nameand tab1.pid =tab2.pidAND tab1.bytes <> tab2.bytes ORDER BY 1, 7 DESC;---- Logminer PGA info- -COLUMN heap_name HEADING "име на хепа" име на COLUMN HEADING "Type"COLUMN allocation_count HEADING "Брой"COLUMN байтове HEADING "Sum"COLUMN avg HEADING "Средно" FORMAT 99999D99SELECT cation_name, heapFlocation_count_name, heaploapROM като 'Logminer%';spool offdrop table tab1 purge;drop table tab2 purge;

Запазете този код като скрипт и редактирайте текста, за да замените низовете с потребителския акаунт, изпълняващ Log Miner. Скриптът е насочен специално към паметта на Logminer, така че да може да се следи за увеличения. Може също да бъде модифициран, за да търси други проблемни области на паметта. Коментирайте командите „drop table“, за да запазите tab1 и tab2 за по-нататъшно проучване, ако желаете, тъй като други области на паметта може да представляват интерес. Също така проверете поддръжката на Oracle за известни проблеми, свързани с PGA. Такива отчети вероятно ще имат заявки, които да се използват за изследване на специфични проблемни области с помощта на V$PROCESS_MEMORY_DETAIL. За удобство тези допълнителни заявки могат да бъдат добавени към кода, показан по-горе, за да докладват за всички подозрителни области на паметта на процеса. Тези данни ще помогнат за доказване на необходимостта от прилагане на специфични еднократни корекции към базата данни.

Log Miner може да бъде много полезен инструмент при разследване на текущи и сравнително скорошни минали действия към базата данни. Може да се наложи да се наблюдават разпределенията на PGA, докато сесиите на Log Miner са активни, за да може да се изпълни превантивно действие, като увеличаване на pga_aggregate_limit, и сесиите да не бъдат прекратени внезапно. „Предупреден е въоръжени“, както се казва, и въпреки че DBA нямат четири ръце, знаейки какво може да предстои, винаги си струва да притежавате знания.

Вижте всички статии от Дейвид Фицярел


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cloud Native и DevSecOps в мащаб с Capgemini Agile Innovation Platform и Oracle Cloud

  2. hibernate oracle последователността произвежда голяма празнина

  3. Можем ли да актуализираме стойностите на първичния ключ на таблица?

  4. Как да изберете колони от таблица, които имат стойности, различни от null?

  5. Как да ограничим резултатите в Oracle