Bu hatayı db link ile remote db den bir distributed query çekmek isterken aldım.
SELECT o.OWNER, o.OBJECT_NAME, o.OBJECT_TYPE, os.source_size
FROM dba_objects@db_link o, dba_object_size@db_link os
WHERE o.OWNER=os.owner
and o.OBJECT_NAME = os.name
and o.OBJECT_TYPE = os.type
and o.object_name = upper(p_OBJECT_NAME)
LINE/COL ERROR
-----------------------------------------------------------------
ORA-04052: error occurred when looking up remote object
SYS.IDL_UB2$@DB_LINK
ORA-00604: error occurred at recursive SQL level 1
ORA-06552: PL/SQL: Compilation unit analysis terminated
ORA-06553: PLS-201: identifier 'UNDEFINED' must be decl
workarounds olarak bir çözüm üretmek gerekirse
1-) Local db üzerinden bir view yaratabiliriz.
On local
Create or replace view remote_obje
SELECT o.OWNER, o.OBJECT_NAME, o.OBJECT_TYPE, os.source_size
FROM dba_objects@db_link o,dba_object_size@db_link os
WHERE o.OWNER=os.owner
and o.OBJECT_NAME = os.name
and o.OBJECT_TYPE = os.type
and o.object_name = upper(p_OBJECT_NAME);
2-)Ya da remote db üzerinde bu view yaratıp sorgumuzu yapabiliriz.
on destination
Create or replace view remote_obje
SELECT o.OWNER, o.OBJECT_NAME, o.OBJECT_TYPE, os.source_size
FROM dba_objects o, dba_object_size os
WHERE o.OWNER=os.owner
and o.OBJECT_NAME = os.name
and o.OBJECT_TYPE = os.type
and o.object_name = upper(p_OBJECT_NAME);
SRVCTL komutları ile Oracle instance yönetimi
Server Control Utility(SRVCTL) komutları ile Oracle 10.1 RAC
sürümünden itibaren alttakileri yapabiliriz.
- ASM instance işlemleri
- Veritabanını başlatmak ve durdurmak
- Veritabanının konfigürasyonunu kontrol etmek
- Veritabanının durumunu kontrol etmek
- Mevcut veritabanı konfigürasyonunu değiştirmek veya kaldırmak
- Yeni bir veritabanı konfigürasyonu eklemek
- Veritabanını etkinleştirmek veya devredışı bırakmak
******* +ASM instance için *******
ASM instance eklemek/kaldırmak için;
$ srvctl add asm -n -i -o
$ srvctl remove asm -n
[ -i ]
ASM instance start-stop
$ srvctl start asm -n
[-i ][-o ]
$ srvctl stop asm -n
[-i ][-o ]
**başlatma_seçenekleri
mount,nomount veya open olmaktadır. Varsayılan open’dır.**
ASM instance check status
[oracle@rac1 oracle] $ srvctl status
asm -n rac1
ASM instance +ASM1 is running on node
rac1
[oracle@rac1 oracle] $ srvctl status
asm -n rac2
ASM instance +ASM1 is not running on
node rac2
ASM instance mevcut konfigürasyonunu kontrol etmek için;
$ srvctl config asm
[oracle@rac1 ~]$ srvctl config
asm
ASM home: /u01/app/11.2.0/grid
ASM listener: LISTENER
SRVCTL komutuyla aynı zamanda mevcut ASM instance etkinleştirmek veya
devredışı bırakmak.
$ srvctl enable asm -n
[ -i ]
$ srvctl disable asm -n
[ -i ]
******* ORACLE instance için *******
SRVCTL komutuyla veritabanının konfigürasyonunu kontrol etmek;
$ srvctl config database -d RAC -a
[oracle@rac1 dbs]$ srvctl
config database -d racdb
Database unique name: racdb
Database name:
Oracle home:
/u01/app/racdb/product/11.2.0/dbhome_1
Oracle user: oracle
Spfile:
+ORADATA/racdb/spfileracdb.ora
Domain:
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Server pools: racdb
Database instances:
Disk Groups:
ORADATA,ORAFRA,ORAREDO1,ORAREDO2
Mount point paths:
Services:
Type: RAC
Database is administrator managed
SRVCTL komutuyla veritabanının durumunu
kontrol etmek;
$ srvctl status database -d racdb
[oracle@rac1 ~]$ srvctl status
database -d racdb
Instance racdb1 is running on node rac1
Instance racdb2 is running on node rac2
SRVCTL komutuyla veritabanını
başlatmak/durdurmak için;
[oracle@rac1 oracle]$ srvctl start database –d racdb
[oracle@rac1 oracle]$ srvctl stop database –d racdb
SRVCTL komutuyla veritabanını eklemek için;
[oracle@rac1 oracle]$ srvctl add database -d TEST -o $ORACLE_HOME
Bir Örnek yaparsak:
ð Öncesinde config ile kontrol
edelim mevcutta varmı?
[oracle@rac1 dbs]$ srvctl
config database -d racdb
PRCD-1120 : The resource for database racdb could not be found.
PRCR-1001 : Resource ora.racdb.db
does not exist
ð Şimdi yeni Database i
ekleyelim
[oracle@rac1 dbs]$ srvctl add
database -d racdb -o /u01/app/oracle/product/11.2.0/dbhome_1 -p
+ORADATA/oracdb/spfileracdb.ora -y AUTOMATIC -a
"ORADATA,ORAFRA,ORAREDO1,ORAREDO2"
ð Kontrol edelim
[oracle@rac1 dbs]$ srvctl
config database -d racdb
Database unique name: racdb
Database name:
Oracle home:
/u01/app/oracle/product/11.2.0/dbhome_1
Oracle user: oracle
Spfile:
+ORADATA/racdb/spfileracdb.ora
Domain:
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Server pools: racdb
Database instances:
Disk Groups:
ORADATA,ORAFRA,ORAREDO1,ORAREDO2
Mount point paths:
Services:
Type: RAC
Database is administrator managed
SRVCTL komutuyla mevcut veritabanı konfigürasyonunu değiştirmek için;
[oracle@rac1 oracle]$ srvctl modify database
-d racdb -p /u03/oradata/racdb/spfileRACDB.ora
**Üstteki örnekte servis parametre dosyasını başka bir paylaşımlı
lokasyona taşıyoruz.**
SRVCTL komutuyla veritabanı konfigürasyonunu kaldırmak için;
[oracle@ilker oracle]$ srvctl
remove database -d USTA –f
[oracle@s0134ilker admin]$ srvctl
remove database -d USTA
Remove the database oceandb? (y/[n])
y
ð Kontrol edelim
[oracle@ilker admin]$ srvctl status database -d USTA -v
PRCD-1120 : The resource for database USTA could not be found.
PRCR-1001 : Resource ora.usta.db does not exist
SRVCTL komutuyla instance stop start
$ srvctl stop instance -d
-n -o immediate
[oracle@predb02 ~]$ srvctl
stop instance -d PREDB -n predb02
[oracle@predb02 ~]$ srvctl start instance -d PREDB -n predb02
SRVCTL komutuyla instance & Database ekleme:
srvctl add instance -d
-i < instance names> -n
Örnek:
[oracle@db11 dbs]$ srvctl add
instance -d racdb -i racdb1 -n db11
[oracle@db11 dbs]$ srvctl add
instance -d racdb -i racdb2 -n db12
[oracle@db11 dbs]$ srvctl
config database -d racdb
Database unique name: racdb
Database name:
Oracle home:
/u01/app/oracle/product/11.2.0/dbhome_1
Oracle user: oracle
Spfile:
+ORADATA/racdb/spfileracdb.ora
Domain:
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Server pools: oceandb
Database instances: racdb1, racdb2
Disk Groups:
ORADATA,ORAFRA,ORAREDO1,ORAREDO2
Mount point paths:
Services:
Type: RAC
Database is administrator managed
SRVCTL komutuyla service status, stop, start
srvctl status service -d dbname
srvctl config service -d dbname
srvctl start service -d dbname -s servicename
srvctl stop service -d dbname -s servicename
SRVCTL komutuyla service yönlendirme
$ srvctl relocate service -d dbname -s servicename -i instancename -t newinstancename [-f]
Örnek: Rac1 instance dan Rac2 instance yönlendirme
$ srvctl relocate service -d racdb -s pusula -i racdb1 -t racdb2 -f
ORACLE Log Minner
Log Minner redo logların kullanılması ile analiz
yapılabilmesi, okuma yapılabilmesi hatta recover işlemlerin yapılmasını bize
sağlar. Az bilinse de zaman zaman hayat kurtaracak operasyonları bu sayede
çözebiliriz.
Log Minner database seviyesinde yapılan bazı dml hatalarının
geri alınmasına da olanak sağlar. Bunun yanında database üzerinde yapılan
işlemlerin audit’lenmesine de olanak
sağlar. Kullanıcıların yaptığı bir işlemin izinide sürebilirsiniz.
Şimdi nasıl konfigüre ediyoruz, içeriği nedir ve yaptığımız
küçük bir örnek ile detaylandıralım.
Log Minner kurulum ile birlikte gelen ve bir package create
edilmesi ile kullanılan bir opsiyondur. Bu package $ORACLE_HOME/rdbms/admin
dizininde dbmslm.sql dir.
Log minnerın konfigüre edilmesi sırasında create edilen
package içeriğinin özetine fikrimiz olması adına bir bakalım.
[oracle@s0134devdb0
admin]$ cat dbmslm.sql
create or
replace PACKAGE dbms_logmnr IS
--------------------
-- OVERVIEW
--
This package contains the procedures used by LogMiner ad-hoc query
--
interface that allows for redo log stream analysis.
--
There are three procedures and two functions available to the user:
--
dbms_logmnr.add_logfile() : to
register logfiles to be analyzed
--
dbms_logmnr.remove_logfile() : to remove logfiles from being analyzed
--
dbms_logmnr.start_logmnr() : to
provide window of analysis and
-- meta-data
information
--
dbms_logmnr.end_logmnr() : to
end the analysis session
--
dbms_logmnr.column_present() : whether a particular column value
-- is presnet in
a redo record
--
dbms_logmnr.mine_value() :
extract data value from a redo record
--------------------------
--
PROCEDURE INFORMATION:
-- #1
dbms_logmnr.add_logfile():
--
DESCRIPTION:
--
Registers a redo log file with LogMiner. Multiple redo logs can be
--
registered by calling the procedure repeatedly. The redo logs
--
do not need to be registered in any particular order.
--
Both archived and online redo logs can be mined. If a successful
--
call to the procedure is made a call to start_logmnr() must be
--
made before selecting from v$logmnr_contents.
......
......
......
-------------
--
PROCEDURES
---------------------------------------------------------------------------
--
Initialize LOGMINER
-- Supplies
LOGMINER with the list of filenames and SCNs required
-- to
initialize the tool. Once this procedure
completes, the server is ready
-- to
process selects against the v$logmnr_contents fixed view.
---------------------------------------------------------------------------
PROCEDURE
start_logmnr(
startScn IN
NUMBER default 0 ,
endScn IN
NUMBER default 0,
startTime IN
DATE default '',
endTime IN
DATE default '',
DictFileName IN
VARCHAR2 default '',
Options IN
BINARY_INTEGER default 0 );
PROCEDURE
add_logfile(
LogFileName IN
VARCHAR2,
Options IN
BINARY_INTEGER default ADDFILE );
PROCEDURE
end_logmnr;
FUNCTION
column_present(
sql_redo_undo IN
NUMBER default 0,
column_name IN
VARCHAR2 default '') RETURN BINARY_INTEGER;
FUNCTION
mine_value(
sql_redo_undo IN
NUMBER default 0,
column_name IN
VARCHAR2 default '') RETURN VARCHAR2;
PROCEDURE
remove_logfile(
LogFileName IN
VARCHAR2);
---------------------------------------------------------------------------
pragma
TIMESTAMP('1998-05-05:11:25:00');
END;
/
grant
execute on dbms_logmnr to execute_catalog_role;
create or
replace public synonym dbms_logmnr for sys.dbms_logmnr;
İçeriğinde bazı procedure, function
ve neler yaptığını görebiliyoruz. Sonunda bazı yetkiler veriyor ve kolay erişim
için bir public synonym yaratıyor.
Bunun öncesinde Log minner’ın
çalışması için supplemental loggingin
açık olması gerekiyor. supplementalloggingin ne olduğunu neye yarayıp hangi seviyelerde olduğunu diğer yazımda
belirtmiştim. Şimdi kontrol edip eğer enable değilse minimal seviyede loggingi
açalım
SQL> select SUPPLEMENTAL_LOG_DATA_MIN from v$database;
SUPPLEMENTAL_LOG_DATA_MIN
NO
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
Database altered.
Database altered.
Şimdi yukarıda içeriğine baktığımı
dbms_logmnr paketi yaratalım
[oracle@
s0134devdb0 admin]$ pwd
/u01/app/oracle/product/11.2.0/dbhome_2/rdbms/admin
[oracle@
s0134devdb0 admin]$ sqlplus / as sysdba
SQL*Plus:
Release 11.2.0.4.0 Production on Wed Apr 6 11:27:21 2016
Copyright
(c) 1982, 2013, Oracle. All rights
reserved.
Connected
to:
Oracle
Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the
Partitioning and Automatic Storage Management options
SQL>
@/u01/app/oracle/product/11.2.0/dbhome_2/rdbms/admin/dbmslm.sql
Package
created.
Grant
succeeded.
Synonym
created.
SQL>
İlgili kullanıcıyı yetkilendirelim.
SQL>
GRANT EXECUTE_CATALOG_ROLE TO ilker;
Grant
succeeded.
SQL>
Log minner redologları okuyan bir
paket. Bu yüzden log minnera mevcut loğları tanıtalım.
Öncesinde log dosyalarının
bilgilerine bakıyoruz
SQL>
SELECT distinct member LOGFILENAME FROM V$LOGFILE;
LOGFILENAME
---------------------------------------------------------------------------------------------
+ORADATA/ocdev03/onlinelog/group_3.259.815671587
+ORADATA/ocdev03/onlinelog/group_1.257.815671585
+ORADATA/ocdev03/onlinelog/group_2.258.815671587
+ORAFRA/ocdev03/onlinelog/group_3.259.815671589
+ORAFRA/ocdev03/onlinelog/group_4.260.815671589
+ORADATA/ocdev03/onlinelog/group_4.260.815671589
+ORAFRA/ocdev03/onlinelog/group_1.257.815671585
+ORAFRA/ocdev03/onlinelog/group_2.258.815671587
8 rows
selected.
SQL>
Görüldüğü gibi +ASM yapısında
yedekli redo larım var.
Şimdi bunu package ekleyelim
11:38:39
SQL> BEGIN
DBMS_LOGMNR.ADD_LOGFILE('+ORADATA/ocdev03/onlinelog/group_1.257.815671585');
DBMS_LOGMNR.ADD_LOGFILE('+ORADATA/ocdev03/onlinelog/group_2.258.815671587');
DBMS_LOGMNR.ADD_LOGFILE('+ORADATA/ocdev03/onlinelog/group_3.259.815671587');
DBMS_LOGMNR.ADD_LOGFILE('+ORADATA/ocdev03/onlinelog/group_4.260.815671589');
END;
/
PL/SQL procedure successfully completed
Executed in 0.453 seconds
11:38:42 SQL>
Böylelikle
Log_Minner konfigürasyonu nu tamamlamış olduk.
Şimdi
Start edelim. (LogMiner'ı
başlatmak için birden fazla opsiyon bulunmaktadır. Belirli bir SCN numarası,
zaman aralığı verilerek ya da bütün logları kullanarak analiz
yaptırabiliriz.)
SQL> BEGIN
DBMS_LOGMNR.START_LOGMNR(options
=> dbms_logmnr.dict_from_online_catalog);
END;
/
PL/SQL procedure successfully completed
Executed in 1.359 seconds
SQL>
Sonuçlar
için v$logmnr_contents viewini
kullanırız.
Log_Minner
kapatılması.
SQL>
BEGIN
DBMS_LOGMNR.end_logmnr;
END;
/
PL/SQL procedure successfully completed
Executed in 1.359 seconds
SQL>
Bunun
üzerinden şöyle bir senaryo ile örnek verebiliriz.
İstemeden
silinen bir datanız oldu. Yada kimin sildiğini bulmanız gerekiyor. Bunun için
database bir yere restore edip buradan recover etmenize gerek yok J Zaman
aralığınız yaklaşık belli ise faydalı. Eğer yoksa dert değil schema ve obje
ismi (Tablo) varsa işimizi yine görecektir.
- Hemen yeni bir session açıp loglarımızı listeliyoruz.
- ilgili logları log_minnera aktarıyoruz.
- Istersek opsiyona göre istersek tüm logları kullanarak log_minnerı start ediyoruz.
- Evet şimdi Analiz edip iz sürebiliriz. Elimizde ki bilgiler ışığında v$logmnr_contents den schema ve tablo ismini varsa tarih aralığını, geçen dml cümleciğini filtreleyip hedefimize ulaşabiliriz
Ben şöyle bir sql ile örnek verdim:
SELECT
username,
TO_CHAR (timestamp, 'mm/dd/yy hh24:mi:ss') timestamp,
seg_type_name,seg_name,
table_space,
session# SID,
serial#,
operation,
sql_redo,
sql_undo,
session_info
FROM v$logmnr_contents
where seg_name = ''
and username = ''
böylelikle ilgili kayıtlara
ulaşabiliriz.
İyi Çalışmalar diliyorum.
Usta
ORA-15033 disk belongs to diskgroup
ORA-15033: disk belongs
to diskgroup
Diskgroup üzerinde yeni bir disk eklerken ve sonrasında
alınan hata
SQL> ALTER DISKGROUP DATA ADD DISK 'ORCL:ORADISK10' SIZE 1023 M;
*
ERROR at line 1:
ORA-15032: not all alterations performed
ORA-15033: disk 'ORCL:ORADISK10'
belongs to diskgroup
"DATA"
Cause: Disk pathnin doğru
olduğundan yada bu diskin ayrı bir disk grup üzerinde olup olmadığı kontrol
edilmeli. Yada bu disk daha önce eklenip
silindi gibi bir durum oluşmuş olabilir.
Action: Disk path ve doğru olduğunu kontrol edin. Başka bir
disk grup ta kullanılmadığından emin olun. Bunlara emin olduktan sonra workaraund olarak FORCE seçeği ile ekleme seçeneğini
deneyebilirsiniz.
SQL> ALTER DISKGROUP DATA ADD DISK 'ORCL:ORADISK10' SIZE 1023 M force;
Diskgroup altered.
SQL>
Kaydol:
Kayıtlar (Atom)