I recently decided to install Oracle XE (Express Edition) 11gR2 on a Windows Server 2008R2 platform. That platform is x64 only. OracleXE 11gR2 is only available in a 32bit version. I thought that shouldn’t be a problem since 2008R2 has the ability to run 32bit programs. Well, that was just the first of a few eye-opening misconceptions. Once the installation was complete I upgraded the APEX environment to the latest version (v.4.1.1) following Mike Smithers posting. Much thanks to him for that.
Everything appeared to run just fine. I decided to take a look at the alert_xe.log to see what, if anything, was going on with the database. What I found was numerous messages like the following;
OER 7451 in Load Indicator : Error Code = OSD-04500: illegal option specified
O/S-Error: (OS 1) Incorrect function. !
The messages were posting about every 10 seconds so it was going to generate a large log file in a matter of time. Being the enterprising individual that I am, I figured I’d just write a CMD script that would shut the database down, rotate the log file and then start the database back up. First, being the lazy person, I decided to see if anyone had created some sort of log rotation program for windows. I eventually stumbled upon the datori blog. That solution didn’t quite work for me so I decided to create my own script. I used some of his ideas but eventually ended up with the following code.
DISCLAIMER – Use this at your own risk. I do not take responsibility for anything you do with this script. I would encourage you to understand what it’s doing and modify/tweak it for your use.
@echo off Setlocal :: EnableDelayedExpansion is necessary to get the variables to expand as expected inside the FOR loops setlocal EnableDelayedExpansion ::TITLE log_rotate.cmd :: :: Log file rotate/rename program. :: log_rotate.cmd <full\path\logfile.name> :: EXAMPLE; log_rotate.cmd D:\oraclexe\xe\alert_xe.log :: :: This script accepts one parameter in which should be the name of the log file to rotate. :: The schedule of the script will dictate how frequently the files are rotated. It will rotate :: the files EVERY time it is executed. There is no logic as to only daily or such. :: The file compression is handled by ZIP and hard-coded toward the bottom. The ZIP command also :: removes the file that is being zipped so only the zipped file remains. :: The script should handle mixed zipped and not zipped files as well as missing files. :: It will not run if the main log file that is passed in as a parameter does not exist. This will :: keep the log files from being rotated out unknowingly (such as a crash or something). :: It currently does NOT recreate the empty log file. :: :: :: BMajor 2012-JUL-10 Initial Creation :: :: :: Set the following variables as needed :: Compress/Zip archived files - Valid choices are Y or N (test only checks for Y though) Set COMPRESS=Y :: Number of copies to keep - Select a number based on the frequency of the execution Set KEEP_COPIES=10 :: Log Start echo Start %0: %TIME% :: Check for valid input if [%1] EQU  ( echo USAGE: %0 Drive:\Full\Path\filename.log goto :eoj ) :: Set variable to parameter passed on command line Set LOGFILE=%~nx1 :: Parse out input parameter to determine full working path without the filename. :: Should be something like D:\oraclexe\work Set WORKDIR=%~p1 Set WORKDRV=%~d1 :: Echo all variables set echo COMPRESS: %COMPRESS% echo KEEP_COPIES: %KEEP_COPIES% echo WORKDRV: %WORKDRV% echo WORKDIR: %WORKDIR% echo LOGFILE: %LOGFILE% :: Change to working drive %WORKDRV% :: Change to working directory cd %WORKDIR% :: Check for the existence of the main log file first. :: If it doesn't exist then we don't want to rotate the files. if not exist %LOGFILE% ( echo ERROR:%LOGFILE% does not exist...exiting goto :eoj ) :: Delete the last file in the sequence :: Delete filename.log.%KEEP_COPIES% :: Two delete tests/statements are used in case the file does not have a ZIP extension. echo Remove last file in sequence, if it exists. if exist %LOGFILE%.%KEEP_COPIES% ( echo Found %LOGFILE%.%KEEP_COPIES%...deleting del /q %LOGFILE%.%KEEP_COPIES% ) if exist %LOGFILE%.%KEEP_COPIES%.zip ( echo Found %LOGFILE%.%KEEP_COPIES%.zip...deleting del /q %LOGFILE%.%KEEP_COPIES%.zip ) :: Rotate non-current log files (may or may not be named with a ZIP extension) :: Rename filename.log.2.zip to filename.log.3.zip (etc, etc) starting with the :: highest number and working down to the lowest :: The ! is used since we are inside a FOR loop using variables. echo Rotate non-current log files. for /l %%i in (%KEEP_COPIES%,-1,2) do ( set /a i=%%i set /a j=i-1 if exist %LOGFILE%.!j! ( echo Found %LOGFILE%.!j!...renaming to %LOGFILE%.!i! ren %LOGFILE%.!j! %LOGFILE%.!i! ) if exist %LOGFILE%.!j!.zip ( echo Found %LOGFILE%.!j!.zip...renaming to %LOGFILE%.!i!.zip ren %LOGFILE%.!j!.zip %LOGFILE%.!i!.zip ) ) :: Rotate current log file :: ZIP rotated log file if COMPRESS=Y echo Rotate current log file. if exist %LOGFILE% ( echo Found %LOGFILE%...renaming to %LOGFILE%.1 ren %LOGFILE% %LOGFILE%.1 ) if /i %COMPRESS%==Y ( echo "COMPRESS set ON" if exist %LOGFILE%.1 ( echo Found %LOGFILE%.1...Compressing zip -m %LOGFILE%.1.zip %LOGFILE%.1 ) ) :eoj :: End echo End %0: %TIME% ENDLOCAL :: exit
I have a wrapper script that I use to call this script and pass into it the OracleXE log file. I then schedule the wrapper script with “Task Scheduler” for once a week.
Please drop a comment if this has in some way helped you out.