Bacula-users

[Bacula-users] Howto Backup Oracle with Bacula

2009-02-27 14:53:21
Subject: [Bacula-users] Howto Backup Oracle with Bacula
From: Victor Hugo dos Santos <listas.vhs AT gmail DOT com>
To: bacula-users AT lists.sf DOT net
Date: Fri, 27 Feb 2009 16:50:33 -0300
Hello Everyone ,

I have writing/working in a howto to backup Oracle DB... and this is
the first draft
you can read it and send me yours comment and corrections ??
and if possible test this procedure ??? :-)

thanks

********************************
********************************
This Howto describe how run a backup Oracle Databases with Bacula
without downtime.

the principle of idea:

In production environment downtimes of DB isn't allowed, for around
this problem, we will need:
        1 - Configure Oracle DB in backup mode
        2 - Create a Snapshot from files
        3 - Run a backup from files with bacula
        4 - Configure Oracle DB in backup mode off.
        5 - Destroy the Snapshot

Our scenery is:

Linux ;-)
Bacula
Oracle DB (version 10.2.0.0 or superior)

In Linux we have:
        * 2 Logical Volumes
                - /dev/VG_DATA/oraappl
                - /dev/VG_DATA/oradata
        * Oracle Data is mounted in /var/oradata
        * Oracle Applicative is mounted in /opt/oraappl
        * Oracle Archive Logs is created in /var/respaldo/oracle/arch
        * and two folders for snapshots in /mnt/snapshots/
                - /mnt/snapshots/var/oradata/
                - /mnt/snapshots/opt/oraappl/
        * Bacula client
        * Snapshots

In Bacula we have:
        * RunBeforeJob and RunAfterJob directives that run commands/scripts
before and after execute jobs.

In Oracle we have:
        * Archive Log modes that "freeze" DBF files and send changes in
database for "others" files (/var/backup/oracle/arch), allowed copy
DBF files without data lost.
        * "ALTER DATABASE [BEGIN|END] BACKUP" command that configure "ALL"
database in backup mode (before version 9i was necessary configure the
tablespace individually).


Well, now to work


STEP 1 - Setup Oracle DB in backup and preparing files for backup
---------------------------------------------------------------

1.1 - Archive Log Mode
First step is configure your Oracle DB for work in Archive Log modes,
you can read this document:
http://lbdwww.epfl.ch/f/teaching/courses/oracle9i/server.920/a96521/archredo.htm#6768
In my case, I send archive logs to folder /var/backup/oracle/arch

1.2 - Oracle DB backup mode
Now, we need create a script called "start-backup-mode.sh" in
/opt/oraappl/scripts with this content:
        #!/bin/bash
        
        sqlplus /nolog <<EOF
        conn sys/managger as sysdba
        alter database begin backup;
        exit
        EOF
This lines putting database in backup mode.


1.3 - Create a Snapshot from files

This step is optional because in that moment is possible running a
backup DB files directly from original folder (/var/oradata) with
bacula, but personally I prefer create a snapshot of data to reduce
backup mode operation time (the bad news is that if you have much
access/changes in snapshot source, the IO can be reduced performance
on server).

If you prefer (a same that me) create a snapshot, so you need
aggregate this lines to end "start-backup-mode.sh".
        /usr/sbin/lvcreate -L 20G -s -n oradata-snap oradata
        /usr/sbin/lvcreate -L 20G -s -n oraappl-snap oraappl
        mount /dev/VG_DATA/oradata-snap /mnt/snapshots/var/oradata/
        mount /dev/VG_DATA/oraappl-snap /mnt/snapshots/opt/oraappl/
that lines create and mount Snapshots volumes.

1.3 - Unset Oracle DB backup mode
Now, we have a Snapshot of files and we can unset Oracle DB backup
mode, add this lines to end "start-backup-mode.sh":
        sqlplus /nolog <<EOF
        conn sys/managger as sysdba
        alter database end backup;
        exit
        EOF


the final "start-backup-mode.sh" script is:
=======================
        #!/bin/bash
        
        # Put DB in backup mode 
        sqlplus /nolog <<EOF
        conn sys/managger as sysdba
        alter database begin backup;
        exit
        EOF
        
        # Create and mount Snapshots
        /usr/sbin/lvcreate -L 20G -s -n oradata-snap oradata
        /usr/sbin/lvcreate -L 20G -s -n oraappl-snap oraappl
        mount /dev/VG_DATA/oradata-snap /mnt/snapshots/var/oradata/
        mount /dev/VG_DATA/oraappl-snap /mnt/snapshots/opt/oraappl/

        # Unset DB backup mode
        sqlplus /nolog <<EOF
        conn sys/managger as sysdba
        alter database end backup;
        exit
        EOF

        exit 0
=======================


STEP 2 - Run a backup with bacula
---------------------------------

If all is OK.. we having:
        - originally files in /var/oradata and /opt/oraappl
        - snapshots of files in /mnt/snapshots/var/oradata/ and
/mnt/snapshots/opt/oraappl/

now is need configure Bacula's Jobs.
2.1 - Configure sudoers
Bacula need run scripts "start-backup-mode.sh" and
"stop-backup-mode.sh" as oracle's user, for this we need aggregate
this lines in /etc/sudoers:

        Cmnd_Alias      BACKUP_ORACLE = /bin/su - oracle -c
/opt/oraappl/scripts/start-backup-mode.sh, /bin/su - oracle -c
/opt/oraappl/scripts/start-backup-mode.sh
        bacula          LOCAL = NOPASSWD: BACKUP_ORACLE

2.2 - Configure Bacula Jobs
Too is need configure the Job in Bacula director, add this lines for
your configuration:
        =============================
        FileSet {
                Name = "Linux-Oracle-SNAPs"
                Include {
                        Options { signature = SHA1; compression=GZIP9 }
                        File = /mnt/snap/var/oradata
                        File = /mnt/snap/opt/oraappl
                        File = /usr/local/bin/
                }
        }

        FileSet {
                Name = "Linux-Oracle-ARCs"
                Include {
                        Options { signature = SHA1; compression=GZIP9 }
                        File = /var/backup/oracle/arch/
                }
        }

        Schedule {
                Name = "Oradata-Cycle"
                Run = Full sun at 04:30
                Run = Incremental mon-sat at 04:30
        }

        Schedule {
                Name = "Oracle-AchiveLogs-Cycle"
                Run = Full sun at 04:30
                Run = Incremental mon-sat at 04:00
                Run = Incremental mon-sat at 08:00
                Run = Incremental mon-sat at 12:00
                Run = Incremental mon-sat at 16:00
                Run = Incremental mon-sat at 20:00
                Run = Incremental mon-sat at 24:00
        }

        Job {
                Name = "oracle-hotbackup"
                Client = server-fd
                JobDefs = "DefaultJob"
                Schedule = "Oradata-Cycle"
                RunBeforeJob = "sudo /bin/su - oracle -c
/opt/oraappl/scripts/start-backup-mode.sh"
                RunAfterJob = "sudo /bin/su - oracle -c
/opt/oraappl/scripts/stop-backup-mode.sh"
                FileSet = "Linux-Oracle-SNAPs"
                Write Bootstrap = "/var/lib/bacula/oracle-hotbackup.bsr"
        }

        Job {
                Name = "oracle-archivelog"
                Client = server-fd
                JobDefs = "DefaultJob"
                Schedule = "Oracle-AchiveLogs-Cycle"
                FileSet = "Linux-Oracle-ARCLOGS"
                Write Bootstrap = "/var/lib/bacula/oracle-archivelog.bsr"
        }
        =============================

Well, in this example we have a two jobs:
        - one backup all content of snapshots volumes (mnt/snap/var/oradata
and /mnt/snap/opt/oraappl) one time for day
        - other backup all archive logs (/var/backup/oracle/arch/) each 4 hours.

In the first jobs (oracle-hotbackup) we use directives:
                - RunBeforeJob that configure DB in backup mode before backup
                - RunAfterJob that configure Oracle DB in backup mode off.



STEP 3 - Destroy a Snapshot
---------------------------

Well, in this moment we have a backup of all data and application of
Oracle and the Snapshot isn't more need, so we can remove it..mmm..
the true is that Bacula automatic remove it because we configured
RunAfterJob directive in it and only needing create a
"/opt/oraappl/scripts/stop-backup-mode.sh" script file with this
content:

=======================
        #!/bin/sh

        # Umount and Destroy Snapshots
        umount /mnt/snapshots/var/oradata/
        umount /mnt/snapshots/opt/oraappl/
        lvremove -f /dev/VG_DATA/oradata-snap
        lvremove -f /dev/VG_DATA/oraappl-snap

        exit 0
=======================

References:
http://becomeappsdba.blogspot.com/2006/09/backup-recovery-in-oracle-apps.html
http://wiki.bacula.org/doku.php?id=application_specific_backups:oracle_rdbms
and Metalink 604683.1 and 270531.1 articles

********************************
********************************



-- 
-- 
Victor Hugo dos Santos
Linux Counter #224399

------------------------------------------------------------------------------
Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA
-OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise
-Strategies to boost innovation and cut costs with open source participation
-Receive a $600 discount off the registration fee with the source code: SFAD
http://p.sf.net/sfu/XcvMzF8H
_______________________________________________
Bacula-users mailing list
Bacula-users AT lists.sourceforge DOT net
https://lists.sourceforge.net/lists/listinfo/bacula-users

<Prev in Thread] Current Thread [Next in Thread>