Thursday, October 4, 2012

Automating management of Oracle Database generated logs on linux

Automating management of Oracle Database generated logs on linux

As you know, Oracle 11G generates *.trc and *.trm log files as well as constantly generating alert log and listener log entries. Instead of writing shell scripts, you can use the 11G ADRCI utility and the linux logrotate command to manage these logs automatically.

Using ADRCI

ADRCI is fairly simple. Just fire it up and set the parameters accordingly. Note that you need to do this for each database on the host because they have separate ADRCI Homes.

Set the database environment as usual:

. oraenv
ORACLE_SID = [PRODDB] ?
The Oracle base remains unchanged with value /u01/app/oracle

Start up adrci:

adrci

ADRCI: Release 11.2.0.2.0 - Production on Fri Oct 5 08:07:40 2012

Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.

ADR base = "/u01/app/oracle/admin/PRODDB"

Show the current settings for the log management:

adrci> show control

ADR Home = /u01/app/oracle/admin/PRODDB/diag/rdbms/PRODDB/PRODDB: ************************************************************************* ADRID SHORTP_POLICY LONGP_POLICY LAST_MOD_TIME LAST_AUTOPRG_TIME LAST_MANUPRG_TIME ADRDIR_VERSION ADRSCHM_VERSION ADRSCHMV_SUMMARY ADRALERT_VERSION CREATE_TIME -------------------- -------------------- -------------------- ---------------------------------------- ---------------------------------------- ---------------------------------------- -------------------- -------------------- -------------------- -------------------- ---------------------------------------- 1117245929 720 8760 2012-06-06 09:08:17.132534 +10:00 2012-10-01 00:02:57.274304 +10:00 1 2 80 1 2012-06-06 09:08:17.132534 +10:00

1 rows fetched

Note the figures in red – these are the defaults, in hours.

This means that trace and dump files are kept for 30 days and incidents and health reports are kept for a year.

To change these to a more reasonable level (7 days for trace and dump files, 1 month for the others):

adrci> set control (SHORTP_POLICY=168);
adrci> set control (LONGP_POLICY=720);

The SHORTP_POLICY determines how long things like core dumps and trace files are kept for.

The LONGP_POLICY determines how long incidents and some health warnings are kept for.

Once set, you need to issue a 'purge' command to enable it (see below) otherwise it will wait for the next time it checks, which could be hours.

adrci> show control

ADR Home = /u01/app/oracle/admin/PRODDB/diag/rdbms/PRODDB/PRODDB: ************************************************************************* ADRID SHORTP_POLICY LONGP_POLICY LAST_MOD_TIME LAST_AUTOPRG_TIME LAST_MANUPRG_TIME ADRDIR_VERSION ADRSCHM_VERSION ADRSCHMV_SUMMARY ADRALERT_VERSION CREATE_TIME -------------------- -------------------- -------------------- ---------------------------------------- ---------------------------------------- ---------------------------------------- -------------------- -------------------- -------------------- -------------------- ---------------------------------------- 349985628 168 720 2012-09-12 12:47:41.695214 +10:00 2012-09-30 00:09:18.714054 +10:00 2012-09-12 12:48:37.311103 +10:00 1 2 80 1 2012-07-26 09:12:35.866728 +10:00

1 rows fetched

That’s it for the dump and trace files. They will now be automatically deleted after the specified time.

Note you can also delete existing ones if there are too many using the purge command:

adrci> purge -age 10080 -type trace

Note that this figure is in minutes, not hours (wonderful!). This will delete any trace files older than 7 days.



If there is more than one database on the host, you must set the environment and adcri base accordingly before running the commands:


. oraenv

PRODDB1
adrci> set base /u01/app/oracle/admin/PRODDB1

adrci> show homes
ADR Homes:
diag/rdbms/proddb/PRODDB
diag/rdbms/proddb1/PRODDB1

adrci> show control
DIA-48448: This command does not support multiple ADR homes

If you see this, you need to set the homepath to run commands:

adrci> set homepath diag/rdbms/proddb1/PRODDB1
adrci> show control

ADR Home = /u01/app/oracle/admin/PRODDB1/diag/rdbms/proddb1/PRODDB1:
*************************************************************************
ADRID                SHORTP_POLICY        LONGP_POLICY         LAST_MOD_TIME                            LAST_AUTOPRG_TIME                        LAST_MANUPRG_TIME                        ADRDIR_VERSION       ADRSCHM_VERSION      ADRSCHMV_SUMMARY     ADRALERT_VERSION     CREATE_TIME
-------------------- -------------------- -------------------- ---------------------------------------- ---------------------------------------- ---------------------------------------- -------------------- -------------------- -------------------- -------------------- ----------------------------------------
3297102354           168                  720                  2012-10-30 11:56:36.369326 +11:00        2012-10-30 11:16:13.086140 +11:00                                                 1                    2                    80                   1                    2012-07-20 15:01:07.750391 +10:00
1 rows fetched



Using linux logrotate

This is a bit more involved and needs some configuration files and a cron entry.

First, determine the name and location of the alert log and the listener log files:

sqlplus “/ as sysdba” 

show parameter back 
background_dump_dest string /u01/app/oracle/admin/PRODDB/diag/rdbms/PRODDB/PRODDB/trace

lsnrctl stat 

Listener Log File /u01/app/oracle/product/11.2.0.2/db_1/log/diag/tnslsnr/linux01/listener/alert/log.xml 

Check to see the sizes:

ls -al /u01/app/oracle/admin/PRODDB/diag/rdbms/PRODDB/PRODDB/trace/alert_PRODDB.log

-rw-r----- 1 oracle oinstall 8759629 Oct 5 08:01 /u01/app/oracle/admin/PRODDB/diag/rdbms/PRODDB/PRODDB/trace/alert_PRODDB.log

ls -al /u01/app/oracle/product/11.2.0.2/db_1/log/diag/tnslsnr/linux01/listener/alert/log.xml

-rw-r----- 1 oracle oinstall 4064218 Oct 5 08:01 /u01/app/oracle/product/11.2.0.2/db_1/log/diag/tnslsnr/linux01/listener/alert/log.xml


Create a logrotate.status file:

vi /home/oracle/dba/ora_logs/logrotate.status

with these contents:

logrotate state -- version 2 "/u01/app/oracle/admin/PRODDB/diag/rdbms/PRODDB/PRODDB/trace/alert_PRODDB.log" 2012-09-10

Make the date about a month in the past. This will be updated when the job runs.

Now make a oracle_logrotate.conf file:

vi /home/oracle/dba/ora_shells/oracle_logrotate.conf

With these contents:

# Logrotate configuration file for Oracle Alert Logs
#
# missingok - do not issue an error message if file is missing
# copytruncate - copy the file and truncate the original instead of deleting it
# rotate 7 - keep 7 copies, then delete old ones
# compress - compress old logs
# notifempty - don't do anything if the file is empty
#
/u01/app/oracle/admin/PRODDB/diag/rdbms/PRODDB/PRODDB/trace/alert_PRODDB.log {
missingok
copytruncate
rotate 7
compress
notifempty
}

This should be all that is needed – now run it and check the log sizes again:

/usr/sbin/logrotate -f -s /home/oracle/dba/ora_logs/logrotate.status /home/oracle/dba/ora_shells/oracle_logrotate.conf

ls -al /u01/app/oracle/admin/PRODDB/diag/rdbms/PRODDB/PRODDB/trace/alert_PRODDB.log

-rw-r----- 1 oracle oinstall 0 Oct 5 08:01 /u01/app/oracle/admin/PRODDB/diag/rdbms/PRODDB/PRODDB/trace/alert_PRODDB.log

The size should be 0.

Add this as a regular cron job.

This runs once a week at 09:00:

00 09 * * 0 /usr/sbin/logrotate -f -s /home/oracle/dba/ora_logs/logrotate.status /home/oracle/dba/ora_shells/oracle_logrotate.conf 1>/home/oracle/dba/ora_logs/logrotate.log 2>&1

Repeat the process for the listener log:

Create the status file:

vi /home/oracle/dba/ora_logs/logrotate_listener.status

logrotate state -- version 2 “/u01/app/oracle/product/11.2.0.2/db_1/log/diag/tnslsnr/linux01/listener/alert/log.xml” 2012-9-10

Create the conf file:

vi /home/oracle/dba/ora_shells/oracle_listener_logrotate.conf

/u01/app/oracle/product/11.2.0.2/db_1/log/diag/tnslsnr/linux01/listener/alert/log.xml
{
missingok
copytruncate
rotate 7
compress
notifempty
}

Run the command:

/usr/sbin/logrotate -f -s /home/oracle/dba/ora_logs/logrotate_listener.status /home/oracle/dba/ora_shells/oracle_listener_logrotate.conf

Check the size:

ls -al /u01/app/oracle/product/11.2.0.2/db_1/log/diag/tnslsnr/linux01/listener/alert/log.xml

-rw-r----- 1 oracle oinstall 0 Oct 5 08:01 /u01/app/oracle/product/11.2.0.2/db_1/log/diag/tnslsnr/linux01/listener/alert/log.xml

Create a cron job:

00 09 * * 0 /usr/sbin/logrotate -f -s /home/oracle/dba/ora_logs/logrotate_listener.status /home/oracle/dba/ora_shells/oracle_listener_logrotate.conf 1>/home/oracle/dba/ora_logs/logrotate_listener.log 2>&1

Finally (?) delete the audit logs, using the old-fashioned find and remove :

00 12 * * 0 /usr/bin/find /u01/app/oracle/admin/PRODDB/adump -name '*.aud' -mtime +33 -exec rm {} \;

 The logs should now rotate and be managed automatically.

No comments:

Post a Comment