Einführung in das Linux-Shell Scripting für DBAs

von Casimir Saternos

Veröffentlicht im November 2005

Lernen Sie einige grundlegende bash-Shell-Skripte für die Installation, Ausführung und Verwaltung von Oracle Databases unter Linux kennen.

Vor rund sieben Jahren hat Oracle die erste kommerzielle Datenbank unter Linux veröffentlicht. Seitdem arbeiten Oracle, Red Hat und Novell/SUSE ständig an Änderungen am Linux-Kernel, da sie sich auf die Datenbank- und Anwendungsperformance beziehen. Aus diesem Grund enthält Oracle Database 10g for Linux Erweiterungen, die eng mit dem Betriebssystem verbunden sind. DBAs müssen mehr denn je über Kenntnisse und Erfahrungen auf dieser Plattform verfügen, um die Systeme unter ihrer Beobachtung am besten zu verwalten.

Es gibt eine traditionelle Aufteilung der Zuständigkeiten zwischen Systemadministratoren und DBAs. In der Praxis ist die Unterscheidung jedoch nicht immer klar. Viele IT-Shops beschäftigen Mitarbeiter, die sich um Anliegen auf Datenbank- und Betriebssystemebene kümmern. Selbstverständlich verwendet Oracle Database selbst Betriebssystemressourcen und ist für die enge Interaktion mit der Umgebung konzipiert.

Darüber hinaus finden viele Systemadministratoren und DBAs es notwendig oder bequem, Aufgaben im Zusammenhang mit ihrer Arbeit zu automatisieren. Die Installation von Software, die Überwachung von Systemressourcen und die Verwaltung von Systemen umfassen sich wiederholende und fehleranfällige Aufgaben, die besser durch automatisierte Prozesse als durch manuelle Verfahren bewältigt werden.

Eine Methode, mit der solche Aufgaben automatisiert werden, ist das Shell Scripting. Shell-Skripte spielen ab ihrer Installation eine wichtige Rolle im Linux-System. Beim Hoch- und Herunterfahren des Systems werden verschiedene Skripte aufgerufen. Utilitys von Oracle und anderen Drittanbietern werden über Shellskripte aufgerufen. Da sie schnell entwickelt werden können, wurden sie historisch für Prototyping-Anwendungen eingesetzt. Systemadministratoren haben sich die durch Shell Scripting verfügbare Funktionalität zunutze gemacht, um Lösungen bereitzustellen, die auf die besonderen Anforderungen und Besonderheiten der Systeme unter ihrer Aufsicht zugeschnitten sind.

In diesem Artikel stelle ich Funktionen vor, die über das „bash“-Shell Scripting verfügbar sind und für die Installation, Ausführung und Wartung von Oracle Databases auf einer Linux-Plattform relevant sind. Beachten Sie, dass dieser Artikel für Linux-Scripting-Anfänger oder DBAs gedacht ist, für die Linux relativ neu ist. Die meisten erfahrenen Linux-Systemadministratoren werden dies wahrscheinlich nicht so hilfreich finden.

Was ist ein Shell-Skript?

Ein Shell-Skript ist einfach eine Textdatei, die eine Folge von Befehlen enthält. Wenn Sie die Datei oder das Skript ausführen, werden die in der Datei enthaltenen Befehle ausgeführt. Der Begriff Shell bezieht sich einfach auf die Befehlszeilenbenutzeroberfläche, mit der Sie mit dem Linux-Kernel kommunizieren. Es sind mehrere verschiedene Shells verfügbar, darunter die C-Shell (csh), die Korn-Shell (ksh), die Bourne-Shell (sh) und die Bourne-Again-Shell (bash). Die Shell selbst ist ein Befehl, der Zeilen aus einer Datei oder dem Terminal liest, diese interpretiert und im Allgemeinen andere Befehle ausführt. Die Bourne-Again-Shell enthält Merkmale der anderen erwähnten Shells und ist diejenige, die für die Skripte verwendet wurde, die dieser Artikel zeigt.

Mit der ersten Zeile in der Skriptdatei kann festgelegt werden, welche Shell zum Ausführen des Skripts verwendet wird. Dies ist die Bedeutung der ersten Zeile, die in allen Skriptbeispielen zu finden ist:

#!/bin/bash

Warum sollten Sie Shell-Skripte verwenden?

Abhängig von Ihrem Hintergrund werden möglicherweise keine unmittelbaren Werte für Shell-Skripte angezeigt, die sich auf die Arbeit des DBA beziehen. Wenn Sie keine Erfahrung mit UNIX- oder UNIX-ähnlichen Systemen haben, könnte die Vielzahl von kryptischen Befehlen Anlass zur Sorge geben. Darüber hinaus bietet Oracle 10g neben einer relationalen Datenbank auch eine robuste Plattform zur Datenverarbeitung innerhalb der Datenbank sowie verschiedene Methoden zur Interaktion mit dem Betriebssystem außerhalb der Datenbank.

Es gibt jedoch mehrere Gründe, warum Sie in die Welt des Shell Scripting eintauchen könnten, einschließlich Folgendem:

  • Sie befinden sich in einer Situation, in der Sie bereits vorhandene Skripte unterstützen müssen.
  • Sie möchten die Systemeinrichtung automatisieren, die vor der Installation der Oracle-Software erfolgt. Beispiel: Sie können ein Skript schreiben, um den anfänglichen Status des Betriebssystems zu prüfen und alle Voraussetzungen zu melden, die vor der Installation der Software erfüllt sein müssen. Das Skript kann auch relevante BS-Benutzer und -Gruppen erstellen und Umgebungsvariablen für die Benutzer festlegen.
  • Eine laufende Oracle Database kann verwendet werden, um manuelle oder geplante Aufgaben auszuführen. Einige Aufgaben müssen jedoch ausgeführt werden, wenn die Datenbank nicht ausgeführt wird. Mit einem Skript können Sie eine Datenbank (sowie einen Listener oder einen zugehörigen Datenbankprozess) stoppen oder starten. Eine solche Aktion kann nicht aus der Datenbank selbst gestartet werden.
  • Sie benötigen ein Verfahren zum Überwachen des Status einer Datenbank (d.h. wenn sie ausgeführt wird und zur Verarbeitung von Abfragen verfügbar ist). Ein solches Skript könnte auch andere Prozesse und Ressourcen überwachen, die nicht Oracle-spezifisch sind, um einen umfassenderen Überblick über die Vorgänge im System zu erhalten.
  • Backups müssen automatisiert werden. Oracle Recovery Manager (RMAN) ist ein Dienstprogramm, mit dem Sie Sicherungsskripte entwickeln können, die auf jeder Plattform ausgeführt werden können. Sie können Oracle Recovery Manager über ein Shell-Skript aufrufen und damit eine Vielzahl von Sicherungs- und Wiederherstellungsaktivitäten durchführen.
  • Möglicherweise haben Sie eine Anforderung, die nicht spezifisch für eine einzelne Datenbank ist. Möglicherweise befinden sich mehrere Datenbanken auf einem einzigen Rechner. Es ist eventuell nicht ratsam, die Anforderung durch den Einsatz einer einzigen Datenbank zu erfüllen. Außerdem führt dies auch zu potenziellen Sicherheitsproblemen. Unter diesen Umständen bietet Shell Scripting eine Möglichkeit, die Anforderung in einer Weise zu erfüllen, die den Prozess nicht mit einer einzelnen Datenbank verknüpft.

Wann Shell-Skripte nicht verwendet werden sollten

Oracle Database umfasst Funktionen, die über die herkömmliche Definition eines RDBMS hinausgehen. Wie jede andere Software verwendet sie Ressourcen, die vom Betriebssystem bereitgestellt werden, aber sie kann ihre Umgebung in viel größerem Maße als andere Software „sehen“ und „verändern“. Die festen Ansichten von SQL und Oracle bieten ein Bild des Systems innerhalb der Datenbank, während Shell Scripting eine Ansicht des Systems von außerhalb der Datenbank bietet. Shell Scripting ist nicht die Lösung für jedes Problem.

Es ist wichtig zu erkennen, dass viele Aspekte des Betriebssystems von der Datenbank aus überwacht und geändert werden können. Die festen Ansichten von Oracle (die Ansichten mit dem Präfix v$) können verwendet werden, um den Hostnamen der Maschine (v$instance) oder den Plattformnamen zu ermitteln, auf dem die Datenbank (v$database) ausgeführt wird. Der Speicherort und andere Attribute der Dateien, die der Datenbank zugeordnet sind, können ebenfalls auf diese Weise bestimmt werden. Der Speicherort und andere Attribute von Datendateien (v$datafile, dba_data_files), temporäre Dateien (v$tempfile, dba_temp_files), Redo-Protokolle (v$logfile), Archivprotokolle (v$archived_log) und Kontrolldateien (v$controlfile) können direkt aus der Datenbank abgefragt werden. In dieser Ansicht können Sie Informationen zum Flash Recovery-Bereich ($recovery_file_dest) sowie einige init.ora-Parameter (db_recovery_file_dest, db_recovery_file_dest_size) ermitteln. Der Status von Prozessen (v$process) und Speicher (v$sga, v$sgastat usw.) kann ebenfalls abgefragt werden. Es gibt verschiedene integrierte PL/SQL-Packages sowie die Möglichkeit, Java- und C-Datenbankobjekte zu erstellen, die zusätzlichen Zugriff auf das zugrunde liegende Betriebssystem ermöglichen.

Wenn Sie Skripting für eine Aufgabe in Betracht ziehen, die einen großen Teil des Datenbankzugriffs erfordert, ist Skripting wahrscheinlich nicht die beste Option. Später in diesem Artikel wird beschrieben, wie Sie mit SQL*Plus auf die Datenbank zugreifen. In vielen Fällen ist es jedoch besser, das Problem mit einer anderen Sprache anzugehen.

In den folgenden Diagrammen werden Informationen zusammengefasst, auf die in der Datenbank selbst zugegriffen werden kann:

Server-/BS-Informationen

Serveridentifikation Repräsentative Abfrage Hinweise
Hostname, auf dem die Instanz ausgeführt wird

select host_name

from v$instance;

Sie können diese Informationen auch abrufen, indem Sie Folgendes aus bash ausführen:

hostname

or

uname -n

Betriebssystemplattform

select platform_name from

v$database –-(10g)

Ähnliche Informationen werden zurückgegeben, wenn Sie uname -s ausführen

Dateiinformationen

Oracle Dateiverzeichnisse Repräsentative Abfrage Hinweise
Kontrolldateien

select name from

v$controlfile;

Speicherort der Kontrolldateien der Datenbank. Der init.ora-Parameter control_files enthält diese Informationen ebenfalls.
Datendateien

select file_name from

Dba_data_files;

Speicherort der Datenbankdatendateien
Temporäre Dateien

select file_name

from Dba_temp_files;

Speicherort der temporären Datenbankdateien
Protokolldateien

select member

from v$logfile;

Speicherort der Redo Logs
Archivierte Protokolle

select name

from v$archived_log

Speicherort der archivierten Redo Logs. Die init.ora-Parameter log_archive_dest_n enthalten diese Informationen ebenfalls. Diese Abfrage gibt keine Ergebnisse zurück, wenn sich Ihre Datenbank nicht im Archivelog-Modus befindet.
Flash Recovery-Bereich

select name

from v$recovery_file_dest

Das Verzeichnis, das in einer Oracle 10g-Installation für den Flash Recovery-Bereich verwendet wird. Der init.ora-Parameter db_recovery_file_dest enthält diese Informationen ebenfalls.
Weitere Zugriffspunkte für das Dateisystem, die durch Parameter angegeben sind

select *

from v$parameter

where value like '%/%'

or

value like '%/%';

Die Ergebnisse dieser Abfrage können je nach Installation und Version von Oracle Database erheblich variieren. Folgende Parameter können zurückgegeben werden:

SPFILE

standby_archive_dest

utl_file_dir

background_dump_dest

user_dump_dest

core_dump_dest

audit_file_dest

dg_broker_config_file1

dg_broker_config_file2

Programmgesteuerter Zugriff auf das Dateisystem select directory_path from dba_directories Mit dem Oracle-Parameter UTL_FILE_DIR und den DIRECTORY-Datenbankobjekten können Sie auf Dateien zugreifen, die nicht Teil der standardmäßigen Datenbankfunktion sind.

Prozessinformationen

Prozessor/Prozesse Repräsentative Abfrage Hinweise
Session-Prozesse

select p.spid, s.username, s.program

from v$process p, v$session s

where p.addr=s.paddr order by 2, 3, 1

Der Spid kann mit den Ergebnissen von ps -ef korreliert werden, um die in der Datenbank verfügbaren Informationen mit den BS-Informationen für einen bestimmten Prozess zu vergleichen.

Prozesse im Zusammenhang mit der Parallelität

select slave_name, status

from v$PQ_SLAVE

Viele Aspekte von Oracle Database, wie z. B. Laden, Abfragen, Objekterstellung, Wiederherstellung und Replikation, können Parallelität nutzen, um Aktivitäten zu beschleunigen, die aufgeschlüsselt werden können. Der Parameter parallel_threads_per_cpu legt den Standardparallelisierungsgrad einer Instanz fest.

Speicherinformationen

Speicher Repräsentative Abfrage Hinweise
Program Global Area select * from V$PGASTAT

Mit dem Parameter pga_aggregate_target wird Speicher für alle dedizierten Serververbindungen konfiguriert.

Mit Linux-Serviceprogrammen wie vmstat und top können Sie die Speicherauslastung überwachen.

System Global Area select * from v$sga

Mit den Parametern SGA_MAX_SIZE und SGA_TARGET werden dynamische Speicherzuweisungsfeatures von Oracle Database 10 g konfiguriert. Andere Parameter können zur manuellen Speicherzuweisung für bestimmte Zwecke verwendet werden.

Auch hier stehen verschiedene Linux-Utilitys zur Verfügung, um die Speicherzuweisung zu überwachen.

BASH-Skripte

Skripte werden entweder als Teil eines automatisierten Prozesses (ohne menschliches Eingreifen) oder interaktiv ausgeführt, wobei ein Benutzer auf Prompts antwortet. Solange Sie die Ausführberechtigung für eine Datei haben, können Sie sie über die Befehlszeile ausführen, indem Sie ihren Namen eingeben. Wenn Sie keine Ausführberechtigung für die Datei haben, aber über Leseberechtigung verfügen, können Sie das Skript ausführen, indem Sie es mit sh voranstellen.

Wenn ein Skript ohne Benutzereingabe ausgeführt werden soll, stehen verschiedene Optionen für den Aufruf zur Verfügung. Sie können ein Skript im Hintergrund ausführen und auch dann fortfahren, wenn Sie die Verbindung trennen, indem Sie einen Befehl in der folgenden Form eingeben:

nohup /path_to_dir/myscript_here.sh &

Dies kann für die Ausführung von Skripten nützlich sein, die viel Zeit in Anspruch nehmen. Mit dem Befehl at können Sie in Zukunft ein Skript ausführen. Mit cron können Sie Skripte planen, die wiederkehrend ausgeführt werden.

Die folgenden Beispiele decken die wesentlichen Aspekte der Ausgabe zur Anzeige (mit echo), Schleife, Bedingungslogik und Variablenzuweisung ab.

print_args.sh. Argumente sind Wörter rechts neben dem Befehlsnamen, die an das Skript übergeben werden. Um auf den ersten Parameter zuzugreifen, verwenden Sie die Variable $1. Die Variable $0 enthält den Namen des Skripts selbst. Die Variable $# enthält die Anzahl der Argumente im Skript. Eine praktische Möglichkeit, durch alle übergebenen Parameter zu iterieren, besteht darin, eine while-Schleife und den Verschiebungsbefehl zu verwenden. Mit diesem Befehl können Sie alle Argumente in der Argumentliste durchlaufen (anstatt in einer Endlosschleife zu bleiben).



while [ $# -ne 0  ]
do
        echo $1
        shift
done

Wenn ein Skript einen Dateinamen als Argument akzeptiert (oder einen Benutzer zur Eingabe eines Dateinamens auffordert) und die Datei später im Skript gelesen wird, sollten Sie prüfen, ob darauf zugegriffen werden kann und ob sie gelesen werden kann. Beispiel: Ein Recovery-Skript, das die Auswahl einer gesicherten Kontrolldatei beinhaltet, kann den Benutzer auffordern, eine Auswahl zu treffen, die später im Skript zum Wiederherstellen der Datei verwendet wird.



if [ ! -r $1 ]; then # not exists and is readable
                        echo "File $1 does not exist or is not readable."
                exit;
fi 

Die Folge von Zeichen

if [ ! -r $1 ];

ist, was den Test tatsächlich ausführt. Wenn der Inhalt zwischen den Klammern "true" ergibt, werden die Befehle ausgeführt, die zwischen if und fi angezeigt werden. Der eigentliche Test wird zwischen den Klammern angezeigt. Der Ausrufezeichen dient dazu, den von Ihnen ausgeführten Test zu vernachlässigen. Mit der Option -r wird geprüft, ob die Datei lesbar ist. In diesem Fall wird das erste Argument getestet, das an das Skript übergeben wird. Mit einem anderen Test (-d) können Sie prüfen, ob ein bestimmter Eintrag ein Verzeichnis ist (siehe is_a_directory.sh).

do_continue.sh. Dieses Beispiel ist eine einfache repräsentative Folge von Befehlen, mit denen Benutzereingaben für verschiedene Zwecke gelesen werden können. Vor der Ausführung eines Prozesses, der unter bestimmten Bedingungen, die nicht im Skript feststellbar sind, zu Datenverlust oder anderen unerwünschten Ergebnissen führen kann, ist es ratsam, eine Eingabeaufforderung einzuschließen, in der Sie gefragt werden, ob der Benutzer tatsächlich möchte, dass das Skript den oder die nächsten Befehle ausführt. Das folgende Beispiel fragt, ob der Benutzer fortfahren möchte, liest eine Variable namens doContinue von der Befehlszeile und wertet aus, was der Benutzer eingegeben hat. Wenn der Benutzer einen anderen Wert als "y" eingibt, wird diese Person darüber informiert, dass das Skript "quitting" ist und beendet wird, ohne den Rest des Skripts nach dem Ende des If-Blocks auszuführen (fi).




doContinue=n
echo -n "Do you really want to continue? (y/n) " 
read doContinue

if [ "$doContinue" != "y" ]; then
      echo "Quitting..."
      exit
fi

Nur Benutzer mit den richtigen Berechtigungen und der richtigen Umgebung müssen ein bestimmtes Skript ausführen. Eine nützliche Prüfung in einem Skript testet den Benutzer, der versucht, das Skript auszuführen. Wenn Sie einen Befehl in umgekehrte Anführungszeichen (‘) einschließen, können die Ergebnisse des Befehls an das Skript zurückgegeben werden. Im folgenden Beispiel wird der aktuell angemeldete Benutzer mit whoami abgerufen und das Datum angezeigt, indem der Datumsbefehl später im Skript verwendet wird.



echo "You are logged in as ‘whoami‘";

if [ ‘whoami‘ != "oracle" ]; then
  echo "Must be logged on as oracle to run this script."
  exit
fi

echo "Running script at ‘date‘"

Skripte, die für die Interaktion mit Oracle Database geschrieben werden, erfordern manchmal die Eingabe sensibler Informationen wie ein Datenbankkennwort. Der Befehl stty –echo schaltet das Bildschirm-Echo aus, sodass die für den nachfolgenden Lesebefehl eingegebenen Informationen nicht auf dem Bildschirm angezeigt werden. Nachdem die sensiblen Informationen gelesen und in einer Variablen gespeichert wurden (im folgenden Beispiel pw), kann die Anzeige mit stty echo wieder eingeschaltet werden.



stty -echo    
        echo -n "Enter the database system password:  "
        read pw
stty echo

Oracle-Skripte

Einige Dateien befinden sich an einem festen Speicherort für eine bestimmte Oracle-Installation. Sie können den Oracle-Bestand bestimmen, indem Sie die Datei /etc/oraInst.loc anzeigen. Die Datei /etc/oratab identifiziert Datenbanken (und andere auf dem Server installierte Oracle-Programme).

get_inv_location.sh. Dieses Skript ist etwas weniger intuitiv als die vorherigen Beispiele. Wenn Sie das Skript in die Komponentenbefehle aufteilen, erhalten Sie ein besseres Verständnis dessen, was ausgeführt wird.

Um den Lagerplatz zu bestimmen, leiten Sie die Ergebnisse des cat-Befehls (der den Inhalt der Datei anzeigt) zu grep (ein Dienstprogramm, das Zeilen druckt, die einem bestimmten Muster entsprechen). Sie suchen nach Zeilen, die das Literal inventory_loc enthalten.

cat /etc/oraInst.loc | grep inventory_loc

Wenn aufgrund mehrerer Installationen mehrere Lagerstandorte vorhanden sind, möchten Sie Positionen ausschließen, die mit der Nummer versehen wurden. Die Option -v schließt Zeilen aus, die das angegebene Muster enthalten.

cat /etc/oraInst.loc |grep -v "#"|grep inventory_loc

Das Ergebnis dieses Befehls sieht in etwa wie folgt aus:

inventory_loc=/u01/oraInventory

Sie können die Standardausgabe in eine Datei umleiten, indem Sie die >-Umleitung verwenden. Wenn die Datei nicht vorhanden ist, wird sie erstellt. Ist sie vorhanden, wird sie überschrieben.

cat /etc/oraInst.loc|grep -v "#"|grep inventory_loc > tmp

Wenn Sie den Datensatz haben, der den Bestandsstandort angibt, möchten Sie den Teil des Datensatzes vor dem Gleichheitszeichen entfernen. Dieses Mal ordnen Sie die Ergebnisse des cat-Befehls zu (eine Muster-Scanning- und Verarbeitungssprache, die häufig zum Aufteilen von Feldern variabler Länge verwendet wird), die im Wesentlichen die Zeichenfolge tokenisiert. Die Option –F weist awk an, das Gleichheitszeichen als Trennzeichen zu verwenden. Sie drucken dann das zweite Token dieser Zeichenfolge ($2 ), was rechts neben dem Gleichheitszeichen alles ist. Das Ergebnis ist unser Bestandsstandort (/u01/oraInventory).

cat tmp | awk -F= '{print $2}'

Es gibt keinen besonderen Grund, die temporäre Datei (tmp) zu belassen, also kann sie entfernt werden.

rm tmp

list_oracle_homes.sh. Wenn Sie ORACLE_HOME für eine bestimmte Datenbank bestimmen möchten, stehen Ihnen mehrere Optionen zur Verfügung. Sie können sich als Datenbankbenutzer und als Variable $ORACLE_HOME echo anmelden. Sie können auch in der Datei /etc/oratab nach dem Namen suchen und den mit einer bestimmten Instanz verknüpften Namen auswählen. Datenbankeinträge in dieser Datei haben die Form

$ORACLE_SID:$ORACLE_HOME:<N|Y>:

Der folgende Einzeiler gibt das ORACLE_HOME eines Eintrags mit einer ORACLE_SID von TESTDB aus:

cat /etc/oratab | awk -F: "{if ($1=="TESTDB") print $2 }'

Was aber, wenn Sie die Anforderung haben, dass für jede in der Datei /etc/orainst aufgeführte ORACLE_HOME ein Vorgang ausgeführt werden muss? Sie können eine solche Liste iterieren, indem Sie das folgende Code-Snippet verwenden.



dblist=‘cat /etc/oratab | grep -v "#" | awk -F: '{print $2 }'‘

for ohome in $dblist ; do
  echo $ohome
done

Die Variable dblist wird als Array verwendet. Alle ORACLE_HOME-Pfade werden von dieser Variable gehalten. Eine for-Schleife wird zur Iteration durch diese Liste verwendet, und jeder Eintrag wird der Variablen ohome zugewiesen und anschließend zur Standardausgabe wiedergegeben.

search_log.sh. Von Oracle-Produkten werden verschiedene Protokolle generiert. Möglicherweise möchten Sie diese überwachen. Das Datenbank-Alert-Log enthält Meldungen, die für Datenbankvorgänge kritisch sind. Protokolldateien werden auch generiert, wenn Produkte installiert oder deinstalliert werden und wenn Patches eingespielt werden. Das folgende Skript iteriert über eine als Argument übergebene Datei. Wenn Zeilen gefunden werden, die ORA enthalten, wird eine E-Mail-Nachricht an einen angegebenen Empfänger gesendet.



cat $1 | grep ORA- > alert.err

if [ ‘cat alert.err|wc -l‘ -gt 0 ]
then
        mail -s "$0 $1 Errors" administrator@yourcompany.com < alert.err
fi 

Der spezifische Test, der durchgeführt wird, ist eine Zählung der Anzahl von Wörtern, die in der Datei alert.err vorhanden sind, die geschrieben wird, wenn Sie zu alert.err umleiten. Wenn die Wortanzahl (wc) größer als (-gt) Null ist, wird der Inhalt des If-Blocks ausgeführt. In diesem Fall verwenden Sie mail (send mail könnte auch verwendet werden), um eine Nachricht zu senden. Der Titel der Nachricht enthält das ausgeführte Skript ( $0), den Namen des durchsuchten Protokolls ( $1) und die Zeilen, die unserer anfänglichen Suche ( ORA-) entsprachen, als Nachrichtentext.

Umgebungsvariablen wie ORACLE_HOME, ORACLE_BASE und ORACLE_SID können verwendet werden, um Ressourcen zu finden, die sich nicht an einem festen Speicherort in der Linux-Umgebung befinden. Wenn Sie eine Oracle E-Business Suite 11i-Anwendungsinstanz verwalten, stehen Ihnen zahlreiche weitere Umgebungsvariablen zur Verfügung, mit denen Sie Ressourcen suchen können. Dazu gehören APPL_TOP, TWO_TASK, CONTEXT_NAME und CONTEXT_FILE, um einige zu nennen. Um eine vollständige Liste in Ihrer Umgebung anzuzeigen, führen Sie den folgenden Befehl aus, und prüfen Sie die resultierende Datei (myenv.txt):

env > myenv.txt

Als Speicherort einer durchsuchten Datei können verschiedene Kombinationen dieser Umgebungsvariablen verwendet werden. Beispielsweise könnte ein Speicherort für ein Warnungsprotokoll folgendermaßen gekennzeichnet werden:

$ORACLE_BASE/admin/$ORACLE_SID/bdump/alert_$ORACLE_SID.log

Basierend auf den in diesem Skript vorgestellten Prinzipien kann ein größeres Skript geschrieben und so geplant werden, dass es in regelmäßigen Abständen ausgeführt wird, das den Inhalt des Warnprotokolls (oder einer anderen Datei von Interesse) durchsucht und eine E-Mail sendet, wenn Fehler vorhanden sind. Dann kann der Inhalt des Protokolls in eine andere Datei verschoben werden, so dass nur die neuesten Fehlermeldungen per E-Mail gesendet werden.

Oracle Recovery Manager-Skripte. Oracle Recovery Manager (RMAN) ist ein Dienstprogramm, das zur Verwaltung der Datenbanksicherung und -wiederherstellung verwendet werden kann. Dies vereinfacht die Verwaltung auf mehreren Plattformen erheblich, da alle Backup-Skripte für die Ausführung durch RMAN geschrieben werden können, wodurch die Menge an plattformspezifischem Code reduziert wird. RMAN kann vom zugrunde liegenden Betriebssystem aufgerufen und an ein Skript übergeben werden. Ein Offline-Backup (cold.sh) könnte beispielsweise aus dem folgenden Skript bestehen:



#!/bin/bash
rman target / <<EOF
shutdown immediate;
startup mount;
backup spfile;
backup database;
alter database open;
delete noprompt obsolete;
quit;
EOF

Zeile 1 gibt an, dass Sie die bash-Shell verwenden. Zeile 2 ruft Oracle Recovery Manager auf und gibt die Benutzeranmeldung des Betriebssystems bei der Zieldatenbank an (angegeben in der Umgebungsvariable $ORACLE_SID). Das folgende <<EOF gibt an, dass die nachfolgenden Befehle zur Verarbeitung an RMAN übergeben werden. Das EOF in der letzten Zeile gibt an, dass Sie das Ende der Befehlsreihe erreicht haben, die an RMAN übergeben werden soll. RMAN wird dann verwendet, um die Datenbank herunterzufahren, die Datenbank zu starten und zu mounten und mit der Sicherung der Serverparameterdatei und des Inhalts der Datenbank fortzufahren. Anschließend wird die Datenbank geöffnet. Alle Backups, die älter sind als die in der Aufbewahrungsrichtlinie angegebenen, werden dann gelöscht. Sehen Sie in der RMAN-Dokumentation nach, um eine Sicherung zu erstellen, die für Ihre Situation relevant ist.

Nächtliche Sicherungen werden üblicherweise geplant und automatisch ausgeführt. Das obige Skript konnte aufgerufen und der Inhalt des Standardausgangs an eine E-Mail-Adresse mit dem folgenden Befehl gesendet werden:

sh Cold.sh | mail -s"Backup 'date'" administrator@yourcompany.com

Andere Oracle Dienstprogramme können ebenfalls innerhalb von Shell-Skripten ausgeführt werden. Das Dienstprogramm tnsping kann verwendet werden, um festzustellen, ob eine bestimmte Oracle Verbindungskennung den Listener kontaktieren kann. Sie können dieses Dienstprogramm ausführen, um nach Verbindungsproblemen zu suchen:

tnsping ptch04 |grep TNS-

Datenbankexporte und -importe (herkömmlich und Data Pump) sind ebenfalls gute Kandidaten für die Skripterstellung sich wiederholender Prozesse.

Datenbankinstallation. Viele der Schritte beim Setup einer Datenbank können automatisiert werden. Bevor Sie Oracle 10g unter Linux installieren, müssen Sie verschiedene Tests ausführen, um die minimal erforderliche Version der Packages und die Einstellungen der Kernel-Parameter zu prüfen. Sie können die Version eines Packages mit dem Befehl rpm und der Option –q abfragen.

rpm -q compat-libstdc++

Sie können verschiedene Aspekte des Systems bestimmen, indem Sie sich das „virtuelle“ oder „Pseudo“-Dateisystem /proc ansehen. Es enthält keine echten Dateien, sondern Laufzeitsysteminformationen, die so angezeigt werden können, als ob sie sich in Dateien befinden. Beispiel: /proc/meminfo enthält Speicherinformationen für das System, und grep MemTotal /proc/meminfo zeigt den Gesamtspeicher des Systems an. Indem Sie wie zuvor awk verwenden, können Sie die Speichermenge in Kilobyte isolieren, indem Sie Folgendes verwenden:

grep MemTotal /proc/meminfo | awk "{print $2}"

Ein solcher Befehl könnte im Kontext eines Skripts verwendet werden, das Vergleiche durchführt und entsprechend reagiert (sogar das System selbst aktualisiert). In den Beispielskripten 10gchecks_kernel.sh und 10gchecks.sh werden einfach aktuelle und empfohlene Versionen und Einstellungen basierend auf der Oracle-Dokumentation angezeigt.

Datenbanküberwachung. Mit dem Befehl ps können Sie den Prozessstatus melden und prüfen, ob eine Datenbank, ein Listener, ein Skript oder ein anderer relevanter Prozess ausgeführt wird. Wenn Sie alle Datenbanken auflisten möchten, die aktuell auf einem Server ausgeführt werden, können Sie den folgenden Befehl ausführen:

echo "'ps -ef | grep smon|grep -v grep|awk "{print $8}"| awk -F \"_\" "{print$3}"

Obwohl dies funktionell ist, ist es auf den ersten Blick etwas schwer zu verstehen. Der erste Befehl, ps (unter Verwendung der Optionen -ef für eine vollständige Auflistung aller Prozesse), findet alle laufenden Prozesse auf dem Server. Als Nächstes sucht grep nach SMON (dem Hintergrundprozess von Oracle System Monitor), der angibt, dass die Datenbank ausgeführt wird. Sie möchten Einträge entfernen, die sich auf den Befehl "grep" beziehen, der gerade ausgeführt wird. Anschließend suchen Sie mit awk die achte Spalte in der Liste, die den Systemmonitorprozessnamen im Format ora_smon_<oracle_sid> enthält. Die letzte Instanz von awk verwendet dann den Unterstrich als Trennzeichen, um den Datenbanknamen zu suchen und zu drucken, der Eigentümer des SMON-Prozesses ist. Der Unterstrich muss in Anführungszeichen stehen. Der umgekehrte Schrägstrich wird vor jedem der Anführungszeichen verwendet, um diese Anführungszeichen zu maskieren (weil die gesamte Zeichenfolge in doppelten Anführungszeichen steht).

exec_sql.sh. Wie bereits erwähnt, ist es möglich, die Datenbank von einem Shell-Skript abzufragen, sofern der Benutzer Zugriff auf sqlplus hat. Das folgende Beispiel gibt eine (durch Leerzeichen getrennte) Liste von Rechnern zurück, die aktuell Sessions in der Datenbank verwalten:


  
   
#!/bin/bash

output=‘sqlplus -s "/ as sysdba" <<EOF
       set heading off feedback off verify off
       select distinct machine from v\\$session;
       exit
EOF
‘

echo $output    

Dieses Skript ähnelt dem vorherigen RMAN-Skript, da Sie Befehle in ein anderes Programm eingeben. Eine lokale BS-authentifizierte Verbindung wird als sysdba zur Datenbank hergestellt. Um zu verhindern, dass irrelevante Nachrichten zurückgegeben werden, deaktiviert dieses Skript die Überschriften-, Feedback- und Überprüfungsoptionen von SQL*Plus. Die Abfrage wird ausgeführt, und SQL*Plus wird beendet.

Beachten Sie den doppelten Schrägstrich vor dem Dollarzeichen im Ansichtsnamen. Dies sind erforderliche Escape-Sequenzen innerhalb der Zeichenfolge: Der erste Schrägstrich maskiert den zweiten Schrägstrich, der das Dollarzeichen maskiert. Nochmals, nicht hübsch, aber funktional.

Wie bereits erwähnt, ist Shell Scripting nicht die beste Option, wenn Sie etwas schreiben möchten, das einen umfangreichen Datenbankzugriff erfordert. Es könnte besser sein, das Skript in PL/SQL, Perl (das eine ähnliche Syntax wie beim Shell Scripting verwendet), Python, Java oder einer anderen Sprache Ihrer Wahl neu zu schreiben.

Fazit

Shell Scripting kann ein effektives Tool sein, um sich wiederholende und fehleranfällige Administrationsaufgaben schnell zu automatisieren. Die Beispiele in diesem Artikel bieten eine Einführung in die verfügbaren Möglichkeiten, sind jedoch bei weitem nicht umfassend. Jedes System hat unterschiedliche Macken und Schwächen und eine einzigartige Konfiguration. Ein Administrator entwickelt einzigartige Lösungen, um die Anforderungen des jeweiligen Systems zu erfüllen.

Casimir Saternos ist ein von Oracle zertifizierter DBA, ein von IBM zertifizierter Unternehmensentwickler und ein von Sun zertifizierter Java-Programmierer mit Sitz in Allentown, Pennsylvania.