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:
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:
Serveridentifikation | Repräsentative Abfrage | Hinweise |
---|---|---|
Hostname, auf dem die Instanz ausgeführt wird |
|
Sie können diese Informationen auch abrufen, indem Sie Folgendes aus bash ausführen:
or
|
Betriebssystemplattform |
|
Ähnliche Informationen werden zurückgegeben, wenn Sie uname -s ausführen |
Oracle Dateiverzeichnisse | Repräsentative Abfrage | Hinweise |
---|---|---|
Kontrolldateien |
|
Speicherort der Kontrolldateien der Datenbank. Der init.ora-Parameter control_files enthält diese Informationen ebenfalls. |
Datendateien |
|
Speicherort der Datenbankdatendateien |
Temporäre Dateien |
|
Speicherort der temporären Datenbankdateien |
Protokolldateien |
|
Speicherort der Redo Logs |
Archivierte Protokolle |
|
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 |
|
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 |
|
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. |
Prozessor/Prozesse | Repräsentative Abfrage | Hinweise |
---|---|---|
Session-Prozesse |
|
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 |
|
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. |
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.