oraarch-Partition überwachen mit python

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
pullistricker
User
Beiträge: 3
Registriert: Dienstag 30. November 2010, 10:23

Hallo Zusammen,

das ist mein erstes python-script. Es soll bei einer Oracle-Datenbank die Partition der Redologs überwachen. Wenn die Partition voll läuft dann sollen die Redologs gelöscht werden und per "rman" wird die DB wieder geradegezogen.
Email soll auch noch verschickt werden...

Soweit bin ich mal gekommen:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import os

# Import smtplib for the actual sending function
import smtplib

# Import the email modules we'll need
from email.MIMEText import MIMEText


#wie voll ist das oraarch?
disk = os.statvfs("/oracle/SID/oraarch")

#berechnen von capacity, available, used
capacity = disk.f_bsize * disk.f_blocks
available = disk.f_bsize * disk.f_bavail
used = disk.f_bsize * (disk.f_blocks - disk.f_bavail)

# print information in Megabytes
print used/1.048576e6, available/1.048576e6, capacity/1.048576e6

# print information in Gigabytes
print used/1.073741824e9, available/1.073741824e9, capacity/1.073741824e9

#available oraarch in MB
oraarch = available/1.048576e6

if oraarch < 29000:
        #Loeschen aller LOGS
        print os.system('du -cmsh /tmp/oraarch')
        os.system('rm -rf /tmp/oraarch/*')
        print os.system('du -cmsh /tmp/oraarch')

        #Email-Part
        msg = MIMEText('/oracle/SID/oraarch fast vollgelaufen - Redologs geloescht - Bitte ')
        msg['Subject'] = 'Redologs auf gloescht!!!'
        msg['From'] = 'root@server.de'
        msg['To'] = 'admin@email.de'

        server = smtplib.SMTP('localhost')
        #server.set_debuglevel(1)
        server.sendmail("root@server.de", ["admin@email.de",""], msg.as_string())
        server.quit()
        os.system('rman')
So und jetzt soll noch im "rman" folgendes ausgeführt werden...

connect target
allocate channel for maintenance type disk;
CROSSCHECK ARCHIVELOG ALL;
delete expired archivelog until logseq = <letze LOG-Nummer>; release channel;
quit

Im Moment mach ich das per Hand und setze dann "delete expired archivelog until logseq = <letze LOG-Nummer>; release channel;" mit entsprechender LOG-Nummer ein.

"delete expired archivelog all;" wäre vielleicht noch eine vereinfachte Variante um nicht die LOG-Nummer auslesen zu müssen.

Ausserdem könnte ich die Befehle in ein seperates Script schreiben und das dann so ausführen lassen...

rman @rman-script

....aber vielleicht kennt jemand noch ne "schönere Lösung"

Merci
Zuletzt geändert von Anonymous am Dienstag 30. November 2010, 17:01, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@pullistricker: `os.system()` sollte man nicht verwenden. Das `subprocess` kommt nicht nur ohne eine zusätzliche Shell aus, sondern erlaubt es ausserdem noch Daten auf die Standardeingabe des gestarteten Programms zu schreiben und dessen Ausgabe(n) zu lesen.

Die Kommentare bei den Importen sind ein wenig überflüssig. Einige andere auch bzw. sie werden überflüssig wenn man vernünftige Namen und vielleicht auch ein paar Funktionen verwendet. Das die Grössenangaben in Mega- bzw. Gigabyte sind (oder korrekter in Mebi- und Gibibyte :-)) müsste man nicht dran schreiben, wenn man sich statt der "magischen" Zahlen dort eine entsprechend benannte Konstante definieren würde.

Ich würde auch so viel wie möglich in Python erledigen statt externe Programme aufzurufen. Das Löschen kann man zum Beispiel mit `shutil.rmtree()` machen.
pullistricker
User
Beiträge: 3
Registriert: Dienstag 30. November 2010, 10:23

ja ich weiß das es erstmal quick and dirty ist....

aber os.system() zu verwenden ist eben einfach....

shutil.rmtree() hab ich kurz angeschaut - vielleicht zu kurz - wie lösche ich da die Files in dem Verzeichnis - das Verzeichnis soll ja bestehen bleiben...hat erstmal nicht geklappt - geht mir gerade auch der Nerv ab...

Was meinst du mit subprocess?

Funktion hab ich jetzt mal eingebaut - und die Umrechnung in MB bzw. Mib etc...lass ich mir noch was einfallen...

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import os

# Import smtplib for the actual sending function
import smtplib

# Import the email modules we'll need
from email.MIMEText import MIMEText


partition = "/oracle/T02/oraarch"

def availableDiskSpace(partition) :
        #wie voll ist das oraarch?
        disk = os.statvfs(partition)

        #berechnen von capacity, available, used
        capacity = disk.f_bsize * disk.f_blocks
        available = disk.f_bsize * disk.f_bavail
        used = disk.f_bsize * (disk.f_blocks - disk.f_bavail)

        # print information in Megabytes
        print used/1.048576e6, available/1.048576e6, capacity/1.048576e6
        # print information in Gigabytes
        print used/1.073741824e9, available/1.073741824e9, capacity/1.073741824e9
        #available oraarch in MB
        oraarch = available/1.048576e6
        return oraarch

disk = availableDiskSpace(partition)

print disk

if disk < 200:
        print disk
        #Loeschen aller LOGS
        os.system('rm -rf /oracle/T02/oraarch/*')
        #Email-Part
        msg = MIMEText('/oracle/T02/oraarch fast vollgelaufen - Redologs geloescht - Bitte per rman gerade ziehen')
        msg['Subject'] = 'Redologs auf tsapbwt02 gloescht!!!'
        msg['From'] = 'root@tsabwt02.cds.testo'
        msg['To'] = 'cgreiner@testo.de'

        server = smtplib.SMTP('localhost')
        #server.set_debuglevel(1)
        server.sendmail("root@tsapbwt02.cds.testo", ["cgreiner@testo.de",""], msg.as_string())
        server.quit()

nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Schau dir das an:

os.listdir()
os.remove()

Und zu subprocess: Das ist ein Modul.

EDIT: Typo

EDIT #2:
Außerdem:

os.path.isfile() bzw. os.path.isdir()
os.rmdir()
Antworten