Có thể có những trường hợp cần thiết phải điều tra những thay đổi gần đây đối với cơ sở dữ liệu và báo cáo những gì đã được thay đổi, khi nào và bởi ai. Trong nhiều năm, gói DBMS_LOGMNR của Oracle đã có sẵn cho các tác vụ như vậy nhưng các lệnh gọi của nó vẫn chưa được đề cập đầy đủ. Các phương pháp thông thường sử dụng thủ tục ADD_LOGFILE () để chuẩn bị Trình khai thác nhật ký sử dụng với lệnh gọi cơ bản tới thủ tục START_LOGMNR. Điều này khởi động tiện ích với SCN hiện tại là điểm bắt đầu. Có một cách khác để bắt đầu Khai thác nhật ký, bằng cách chọn một SCN bắt đầu hợp lệ và cung cấp nó cho lệnh gọi START_LOGMNR (). Trong bài viết này, bạn sẽ thấy điều này có thể được thực hiện như thế nào và trong quá trình này, hãy tiết lộ một lĩnh vực có thể cần quan tâm đến việc phân bổ PGA.
Nhìn vào một tập lệnh 'đơn giản như vani' để bắt đầu Log Miner, các lệnh gọi thủ tục thông thường được thực hiện để khởi động Log Miner với SCN hiện tại:
---- run_logmnr.sql ---- Thêm tệp nhật ký và đặt DBMS_LOGMNR thành-- liên tục khai thác tệp lưu trữ - đặt kích thước dòng 200 trimspool trên kích thước trang 0 ---- Thêm tệp nhật ký hiện có ---- Bỏ qua tệp nhật ký chờ- -chọn 'execute dbms_logmnr.add_logfile (' '' || thành viên || '' ')' từ v $ logfile ở nơi nhập <> 'STANDBY' và thành viên trong (chọn tối thiểu (thành viên) từ nhóm v $ logfile theo nhóm #) /tmp/add_logfiles.sql/spool off @ / tmp / add_logfiles ---- Bắt đầu logmnr ở chế độ khai thác liên tục - thực thi dbms_logmnr.start_logmnr (tùy chọn => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + DBMS_LOGMNR.CONTINLưu ý rằng tất cả các bản ghi làm lại hiện có đều được thêm vào trước khi bắt đầu Khai thác bản ghi. Có một phương thức khác cung cấp SCN bắt đầu cho lệnh gọi start_logmnr, miễn là cơ sở dữ liệu đang chạy ở chế độ ARCHIVELOG:
BEGIN DBMS_LOGMNR.START_LOGMNR (startScn =>, endScn => , OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + DBMS_LOGMNR.COMMITTED_DATA_ONUSLY + DBMS_LOGMNR.CONTINR.CONTIN) Điều thú vị là SCN kết thúc không cần thiết để bắt đầu phiên Khai thác nhật ký. Cơ sở dữ liệu phải ở chế độ ARCHIVELOG để có thể chỉ định tùy chọn CONTINUOUS_MINE vì Log Miner sẽ tự động thêm mọi tệp nhật ký được lưu trữ sẵn có khi nó chạy. Sử dụng phương pháp này cho phép một SCN cụ thể được sử dụng để bắt đầu bất kỳ tìm kiếm nào; chỉ định tìm kiếm trong dấu ngoặc SCN kết thúc để chỉ một tập hợp con dữ liệu giới hạn được trả lại cho chế độ xem V $ LOGMNR_CONTENTS và cung cấp điểm dừng cho tìm kiếm để truy vấn của chế độ xem có thể kết thúc.
Một nhiệm vụ đơn giản là theo dõi tiến trình của Log Miner bằng cách kiểm tra nhật ký cảnh báo cơ sở dữ liệu khi các mục được đánh dấu bằng ‘LOGMINER’ được đăng ký. Một mục hoàn chỉnh sẽ bao gồm một dòng BEGIN và một dòng KẾT THÚC, như được hiển thị bên dưới:
Thứ Hai tháng 10 07 12:48:22 2019LOGMINER:Kết thúc logfile khai thác cho phiên -2147482111 luồng 1 chuỗi 9776, /oracle/archive/awcis/awcis_0000009776_0001_1008544071.arcMon Tháng 10 07 12:48:22 2019LOGMINER:Bắt đầu khai thác logfile cho phiên - 2147482111 chuỗi 1 chuỗi 9777, /oracle/archive/awcis/awcis_0000009777_0001_1008544071.arcMon 10 tháng 10 07 12:48:36 2019LOGMINER:Kết thúc tệp nhật ký khai thác cho phiên -2147482111 chuỗi 1 chuỗi 9777, /oracle/archive/awcis/awcison 12/07001arcison :48:36 2019LOGMINER:Bắt đầu khai thác logfile cho phiên -2147482111 chuỗi 1 chuỗi 9778, /oracle/archive/awcis/awcis_0000009778_0001_1008544071.arcMon Tháng 10 07 12:48:49 2019LOGMINER:Kết thúc tệp nhật ký khai thác cho phiên -2147482111 chuỗi 1 oracle / archive / awcis / awcis_0000009778_0001_1008544071.arcMon Oct 07 12:48:49 2019LOGMINER:Bắt đầu khai thác logfile cho phiên -2147482111 chuỗi 1 trình tự 9779, /oracle/archive/awcis/awcis_0000009779_0001_1008544071.arcĐối với các phiên Oracle cục bộ, các số là số nguyên dương; đối với các phiên từ xa, được khởi tạo bởi các tiện ích như Perl, Python, C / C ++ hoặc các ngôn ngữ khác, số nguyên âm sẽ được nhìn thấy (các mục nhập hiển thị ở trên được khởi tạo bằng tập lệnh Python). Tên tệp nhật ký sẽ xoay vòng qua cả nhật ký làm lại trực tuyến và các bản sao lưu trữ sẵn có.
Khởi động Trình khai thác nhật ký theo cách này cũng có thể gây ra các lỗi như 'thiếu tệp nhật ký' khi phạm vi SCN hoặc SCN bắt đầu đã chọn không còn khả dụng trong luồng làm lại. Các truy vấn chạy lâu có thể gặp lỗi như vậy. Ngoài ra, nếu SCN nằm ngoài phạm vi đối với các tệp nhật ký có sẵn Log Miner sẽ không khởi động, ném:
LỖI tại dòng 1:ORA-01292:không có tệp nhật ký nào được chỉ định cho phiên LogMiner hiện tạiORA-06512:tại "SYS.DBMS_LOGMNR", dòng 58ORA-06512:tại dòng 2Để giúp loại bỏ các lỗi như vậy, việc chọn FIRST_CHANGE # từ chế độ xem V $ LOG sẽ cung cấp các điểm bắt đầu hợp lệ cho phiên Khai thác nhật ký; sử dụng một truy vấn tương tự đối với V $ ARCHIVED_LOG sẽ trả về tất cả các SCN bắt đầu có sẵn cho các bản sao làm lại đã lưu trữ.
Đây không phải là sự phức tạp duy nhất khi sử dụng Log Miner theo cách này. Tùy thuộc vào lượng thông tin được trả về, quy trình Logmminer có thể phân bổ lượng lớn bộ nhớ PGA, điều này có thể, nếu pga_aggregate_limit nhỏ, sẽ gây ra lỗi sau:
ORA-04036:Bộ nhớ PGA mà phiên bản sử dụng vượt quá PGA_AGGREGATE_LIMITmay mắn thay đây không phải là một lỗi nghiêm trọng. Khi tài nguyên PGA không còn cần thiết, bộ nhớ có thể được giải phóng trở lại cơ sở dữ liệu để sử dụng ở nơi khác. Tuy nhiên, có thể mất nhiều thời gian hơn mong muốn để bộ nhớ đó được giải phóng trở lại nhóm bộ nhớ. Một tùy chọn là đặt pga_aggregate_limit cao hơn tổng các phiên Khai thác nhật ký có thể ngăn lỗi xảy ra. Làm thế nào để bạn biết bộ nhớ nào được cấp cho các phiên đó? Một dạng xem, V $ PROCESS_MEMORY_DETAIL, có sẵn trong cơ sở dữ liệu. Nhưng cố gắng truy vấn chế độ xem này mà không có một số chuẩn bị sẽ trả về:
không có hàng nào được chọn.Đây là một vấn đề tương đối nhỏ, nhưng nó yêu cầu sử dụng tiện ích oradebug. Các bước sau sẽ tải dữ liệu vào V $ PROCESS_MEMORY_DETAIL:
---- Đặt số nhận dạng phiên hiện tại - oradebug setmypid ---- Sử dụng PID của quy trình mong muốn - kết xuất dữ liệu bộ nhớ ---- Điều này điền V $ PROCESS_MEMORY_DETAIL - oradebug pga_detail_get- --- Truy vấn chế độ xem để nhận dữ liệu mong muốn - chọn * Từ v $ process_memory_detail; ---- Để điền lại chế độ xem với dữ liệu mới hơn - chỉ cần thực hiện câu lệnh oradebug pga_detail_get-- - oradebug pga_detail_get Một tập lệnh để thực hiện những hành động này được hiển thị bên dưới:
---- Thiết lập môi trường cho các lệnh gọi oradebug - oradebug setmypidset echo off trimspool onset xác minh offundefine p_1undefine p_2undefine s1undefine s2variable p1 numbervariable p2 numbercolumn sys_date new_value sysdt noprintselect to_char (sysdate - dual --RMMDISS ') - Nhận id quy trình của phiên- cột pid new_value p_1chọn pid từ v $ process trong đó addr in (chọn paddr từ v $ session nơi tên người dùng =' ' và sid =(chọn max (sid) Từ v $ session nơi tên người dùng =' ')); begin:p1:=&p_1; end; / ---- Kết xuất chi tiết quy trình vào v $ process_memory_detail - oradebug kết xuất pga_detail_get &p_1spool &p_1._pga_stats_ &sysdt..log --- - Nhận thông tin phiên cho --COLUMN alme HEADING "Allocated MB" FORMAT 99999D9COLUMN usme HEADING "used MB" FORMAT 99999D9COLUMN frme HEADING "Freable MB" FORMAT 99999D9COLUMN mame HEADING "Max MB" FORMAT 99999D9COLUMN Định dạng chương trình tên người dùng a25COLUMN ĐỊNH DẠNG a22COLUMN sid FORMAT a5COLUMN spid FORMAT a8column định dạng pid_remote a12SET LINESIZE 300SELECT 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_frerable_mem / 1024/1024) frme, ROUND (pga_max_mem / 1024/1024) $ sme phiên v $ process pWHERE p.addr =s.paddrAND s.username =' ' ĐẶT HÀNG BẰNG pga_max_mem, logon_time; ---- Ngủ 30 giây ---- Lấy lại thông tin phiên - executive dbms_lock.sleep (30) cột sid new_value s1 noprintSELECT s.username, SUBSTR (s.sid, 1,5) sid, p.spid, logon_time, SUBSTR (s.program, 1,22) chương trình, s.process pid_remote, s.status, ROUND ( pga_used_mem / 1024/1024) usme, ROUND (pga_alloc_mem / 1024/1024) alme, ROUND (pga_frerable_mem / 1024/1024) frme, ROUND (pga_max_mem / 1024/1024) mameFROM v $ session s, v $ process pWHERE p.addr =s.paddrAND s.username =' ' ĐẶT HÀNG BẰNG pga_max_mem, logon_time; executive dbms_lock.sleep (10) chọn max (sid) sid từ v $ phiên có tên người dùng =' '; ---- Nhận thông tin bộ nhớ quy trình - HEADING danh mục COLUMN "Danh mục" COLUMN được phân bổ HEADING "Các byte được phân bổ" COLUMN được sử dụng HEADING "Các byte đã sử dụng" COLUMN max_allocated HEADING "Các byte được phân bổ tối đa" SELECT pid, category, được cấp phát, đã sử dụng, max_allocatedFROM v $ process_memoryWHERE pid in (CHỌN pid TỪ v $ process WHERE addr in (select paddr FROM v $ session WHERE sid =&&s1)); thi hành dbms_lock.sleep (10) CHỌN pid, danh mục, cấp phát, sử dụng, max_allocatedFROM v $ process_memoryWHERE pid in (SELECT pid FROM v $ process WHERE addr in (select paddr FROM v $ session WHERE sid =&&s1)); execute dbms_lock.sleep (10) select pid from v $ process whe re addr in (select paddr from v $ session where username =' ' and sid =(select max (sid) from v $ session where username =' ')); ---- Lưu lần đầu tiên của thống kê pga - TẠO BẢNG tab1 ASSELECT pid, category, name, heap_name, byte, phân bổ_count, heap_descriptor, parent_heap_descriptorFROM v $ process_memory_detailWHERE pid =&p_1AND category ='Other'; ---- Nhận đường dẫn thứ hai của số liệu thống kê pga - oradebug dump pga &p_1exec dbms_lock.sleep (120) ---- Lưu lần thứ hai của số liệu thống kê pga - TẠO BẢNG tab2 ASSELECT pid, category, name, heap_name, byte, phân bổ_count, heap_descriptor, parent_heap_descriptorFROM v $ process_memory_detailWHERE pid =&p_1AND category ='Other';AND category ='Other';AND. ---- Bắt đầu báo cáo cuối cùng ---- Thông tin đống PGA - Danh mục COLUMN HEADING "Danh mục" COLUMN name HEADING "Name" COLUMN heap_name HEADING "Heap name" COLUMN q1 HEADING "Memory 1" Định dạng 999.999.999.999COLUMN q2 HEADING "Memory 2 "Định dạng 999,999.999,9 99COLUMN diff HEADING "Difference" Định dạng S999.999.999.999 DÒNG BỘ 150SELECT tab2.pid, tab2.category, tab2.name, tab2.heap_name, tab1.bytes q1, tab2.bytes q2, tab2.bytes-tab1.bytes diffFROM tab1, tab2WHERE tab1.category =tab2.categoryAND tab1.name =tab2.nameAND tab1.heap_name =tab2.heap_nameand tab1.pid =tab2.pidAND tab1.bytes <> tab2.bytesORDER THEO 1, 7 DESC; ---- Thông tin PGA của Logminer- -COLUMN heap_name HEADING "heap name" COLUMN name HEADING "Loại" COLUMN phân bổ_count HEADING "Đếm" COLUMN byte HEADING "Tổng" COLUMN trung bình HEADING "Average" FORMAT 99999D99SELECT pid, heap_name, name, phân bổ_count, byte, byte / phân bổ_count avgFROM tab2 như 'Logminer%'; spool offdrop table tab1 purge; drop table tab2 Purge; Lưu mã này dưới dạng tập lệnh và chỉnh sửa văn bản để thay thế các chuỗi
bằng tài khoản người dùng đang chạy Log Miner. Tập lệnh nhắm mục tiêu cụ thể vào bộ nhớ Logminer để nó có thể được theo dõi về sự gia tăng. Nó cũng có thể được sửa đổi để tìm kiếm bất kỳ vùng bộ nhớ có vấn đề nào khác. Nhận xét các lệnh ‘drop table’ để bảo toàn tab1 và tab2 để nghiên cứu thêm, nếu muốn vì các vùng bộ nhớ khác có thể được quan tâm. Ngoài ra, hãy kiểm tra hỗ trợ của Oracle để biết các vấn đề liên quan đến PGA đã biết. Các báo cáo như vậy có thể sẽ có các truy vấn để sử dụng để điều tra các khu vực vấn đề cụ thể bằng cách sử dụng V $ PROCESS_MEMORY_DETAIL. Để giải quyết vấn đề, những truy vấn bổ sung đó có thể được thêm vào mã hiển thị ở trên để báo cáo về tất cả các vùng nghi ngờ của bộ nhớ quy trình. Dữ liệu này sẽ là công cụ để chứng minh sự cần thiết của việc áp dụng các bản vá lỗi cụ thể một lần cho cơ sở dữ liệu. Log Miner có thể là một công cụ rất hữu ích trong việc điều tra các hành động trong quá khứ hiện tại và tương đối gần đây đối với cơ sở dữ liệu. Có thể cần theo dõi phân bổ PGA trong khi các phiên Khai thác nhật ký đang hoạt động để có thể thực hiện hành động ngăn chặn như tăng pga_aggregate_limit và các phiên sẽ không bị chấm dứt đột ngột. “Đã báo trước là được báo trước”, như câu nói của chúng ta, và mặc dù các DBA không có bốn cánh tay nhưng biết những gì có thể ở phía trước luôn là kiến thức đáng có.
Xem tất cả các bài viết của David Fitzjarrell