Disable Transparent Huge Pages

Transparent Huge Pages kurulum sırasında default var (enabled) olarak gelen bir özellik. Fakat bu özelliğin disable edilmesi öneriliyor. “Doc ID 1557478.1”

Transparent Huge Pages özellikle Oracle RAC ortamında, enable olması bilinmeyen node rebootlarına ve performans sorunlarına yol açıyor. Bunun yanında Huge Pages kullanımı yapılıyor ise Transparent Huge Pages disabled olmalıdır. 

Şimdi nasıl disable edeceğimize bakalım. Doc ID 1557478.1”  göre 2 farklı yönden workaround uygulanabilirsiniz. Ben aşağıdaki gibi uyguladım.  

1-) Transparent huge pages parametresini kontrol edelim
[root@s0db01  ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never

2-) Aynı şekilde AnonHugePages değeride disabled olduğunda 0 olmalı. Şuan aşağıdaki gibi
[root@s0db01  ~]# cat /proc/meminfo
MemTotal:       66087116 kB
MemFree:          373444 kB
Buffers:          311244 kB
Cached:         29615640 kB
SwapCached:            8 kB
…
…
…
AnonHugePages:    423936 kB
HugePages_Total:   15360
HugePages_Free:     7092
HugePages_Rsvd:     2485
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:        5360 kB
DirectMap2M:    67100672 kB
[root@s0db01  ~]#

Gördüğümüz üzere disable edilmemiş. Şimdi Disable işlemini gerçekleştirelim 

3-) grub.conf da Transparent Huge Pages disable edelim. Support.Oracle da  

grub.conf  içerisine girip güncellemeyi yapalım 

[root@s0db01  ~]# vi /etc/grub.conf










Güncelleme sonrası reboot ediyoruz. Sonra kontrol edelim
 



Oracle supplemental logging

Soru: Supplemantal logging nedir? Ve nasıl çalışır
Cevap: Database level suplemental logging, Capture edilecek database üzerinde enable edilmesi gereken bir konfigürasyondur. Bu sayede redo log izlenir ve yapılan  x bir değişiklik capture edilmiş olur.

İki çeşit olarak ayrılabilir. Minimal supplemental logging ve identification key logging. Oracle en azından minimal supplemental loging’i logMiner için enable edilmesini öneriyor.
Minimal Supplemental Logging minimal oranda bilgi capture edilmiş olur

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
Database altered.

Database level identification key level ise daha kapsamlıdır.  İçeriği ve Oracle örneklerine bakarsak 

ALL system-generated unconditional supplemental log group
This option specifies that when a row is updated, all columns of that row  are placed in the redo log file.

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
  • PRIMARY KEY system-generated unconditional supplemental log group

This option causes the database to place all columns of a row's primary key in the redo log file whenever a row containing a primary key is updated (even if no value in the primary key has changed).
If a table does not have a primary key, but has one or more non-null unique index key constraints or index keys, then one of the unique index keys is chosen for logging as a means of uniquely identifying the row being updated.
If the table has neither a primary key nor a non-null unique index key, then all columns except LONG and LOB are supplementally logged; this is equivalent to specifying ALL supplemental logging for that row. Therefore, Oracle recommends that when you use database-level primary key supplemental logging, all or most tables be defined to have primary or unique index keys.
To enable primary key logging at the database level, execute the following statement:

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
  •  UNIQUE system-generated conditional supplemental log group

This option causes the database to place all columns of a row's composite unique key or bitmap index in the redo log file if any column belonging to the composite unique key or bitmap index is modified. The unique key can be due to either a unique constraint or a unique index.
To enable unique index key and bitmap index logging at the database level, execute the following statement:
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (UNIQUE) COLUMNS;
  • FOREIGN KEY system-generated conditional supplemental log group

This option causes the database to place all columns of a row's foreign key in the redo log file if any column belonging to the foreign key is modified.

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (FOREIGN KEY) COLUMNS;

İyi çalışmalar, 
Usta

ORA-04052 Remote query fail

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.

Ş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

Ara