Arbeitsspeicher unter Linux

Der Arbeitsspeicher kann unter Linux mit dem Kommando free angezeigt werden. z.B. mit der Option -h kann man sich die Angaben menschlich lesbar darstellen

free -h
              total        used        free      shared  buff/cache   available
Mem:           78Gi        11Gi       3.5Gi        45Gi        63Gi        20Gi
Swap:          39Gi        26Gi        13Gi

Wenn man (möglichst) viel buffer/cache freigeben möchte, kann man eine 3 nach /proc/sys/vm/drop_caches schreiben:

echo 3 > /proc/sys/vm/drop_caches

Die Nummern stehen dabei für:
1: Pagecache freigeben
2: Dentries und Inodes freigeben
3: Pagecache, Dentries und Inodes freigeben

alle Trigger des aktuellen Users durchsuchen

Hier kommt die Tabelle USER_TRIGGERS zum Einsatz. In der Tabelle gibt es das Feld TRIGGER_BODY. Dieses kann jedoch nicht mit einem „like“ durchsucht werden, da es sich um ein Long-Feld handelt. Um das zu realisieren, muss man einen kleinen Umweg nehmen.
Zuerst erstellt man ein temporäre Tabelle mit dem Inhalt des Tabelle USER_TRIGGERS:

CREATE GLOBAL TEMPORARY TABLE meine_temp_tabelle
ON COMMIT PRESERVE ROWS
AS
    SELECT trigger_name, TO_LOB (TRIGGER_BODY) trig FROM user_triggers;

Jetzt kann man ganz einfach in der Spalte trig in Verbindung mit dem „like“ seine Trigger durchsuchen:

SELECT *
  FROM meine_temp_tabelle
 WHERE UPPER (trig) LIKE '%SUCHSTRING%';

Nachdem die temporäre Tabelle nicht mehr benötigt wird, kann man sie mit dem Befehl

TRUNCATE TABLE meine_temp_tabelle;
drop table meine_temp_tabelle;

löschen. Zuvor müssen jedoch alle Zeilen der Tabelle gelöscht werden.

dmesg mit lesbarem Zeitstempel

Da der ausgegebene Zeitstempel von dmesg nicht einfach lesbar ist, gibt es die Option:

dmesg -T

Top Speicherfresser unter Solaris anzeigen

Um unter Solaris die 20 Prozesse mit dem meisten Speicherverbrauch anzuzeigen, gibt es folgendes Kommando:

ps -eo pid,pmem,vsz,rss,comm | sort -rnk2 | head -20

Top Swap-Nutzung unter Linux

Mit diesem Befehl kann man sich die 20 Top SWAP-Speicherverbraucher ansehen:

for file in /proc/*/status ; do awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 2 -n -r | head -20

Logfiles vergrößern wegen Checkpoint not complete

Für den Fall, dass man die Logfiles unter Oracle vergrößern möchte sollte man so vorgehen.
In diesem Beispiel werden sechs neue Logfiles mit jeweils 800 MB größe angelegt und die alten Logfiles gelöscht.
Einfaches vergrößern der Logfiles ist (soweit ich weiß) nicht möglich.
Natürlich müssen die Verzeichnisse, Gruppen und Namen an die jeweilige Systemumgebung angepasst werden!

  1. Zur Sicherheit vorab noch eine DB-Sicherung durchführen
  2. Neue Logfiles in DB anlegen
    ALTER DATABASE ADD LOGFILE GROUP 17 ('/oracle/origlogA/log_g17_m1.dbf', '/oracle/mirrlogA/log_g17_m2.dbf') SIZE 800M;
    ALTER DATABASE ADD LOGFILE GROUP 18 ('/oracle/origlogB/log_g18_m1.dbf', '/oracle/mirrlogB/log_g18_m2.dbf') SIZE 800M;
    ALTER DATABASE ADD LOGFILE GROUP 19 ('/oracle/origlogA/log_g19_m1.dbf', '/oracle/mirrlogA/log_g19_m2.dbf') SIZE 800M;
    ALTER DATABASE ADD LOGFILE GROUP 20 ('/oracle/origlogB/log_g20_m1.dbf', '/oracle/mirrlogB/log_g20_m2.dbf') SIZE 800M;
    ALTER DATABASE ADD LOGFILE GROUP 21 ('/oracle/origlogA/log_g21_m1.dbf', '/oracle/mirrlogA/log_g21_m2.dbf') SIZE 800M;
    ALTER DATABASE ADD LOGFILE GROUP 22 ('/oracle/origlogB/log_g22_m1.dbf', '/oracle/mirrlogB/log_g22_m2.dbf') SIZE 800M;
  3. Logfiles in DB durchswitchen
    solange

    ALTER SYSTEM SWITCH LOGFILE;

    bis

    SELECT * FROM V$LOGFILE f, V$LOG v WHERE f.group#=v.group#

    der Status „CURRENT“ auf den neuen Member /oracle/origlogA/log_g17_m1.dbf zeigt.

  4. alte Logfiles in DB löschen
    Dann können die alten Gruppen gelöscht werden:

    ALTER DATABASE DROP LOGFILE GROUP 1; 
    ALTER DATABASE DROP LOGFILE GROUP 2; 
    ALTER DATABASE DROP LOGFILE GROUP 3; 
    ALTER DATABASE DROP LOGFILE GROUP 4; 
    ALTER DATABASE DROP LOGFILE GROUP 5; 
    ALTER DATABASE DROP LOGFILE GROUP 6;
  5. Logfiles in DB durchswitchen
    Mit

    ALTER SYSTEM SWITCH LOGFILE;

    alle Logfile-Gruppen durchswitchen um zu prüfen, ob alles in Ordnung ist.

  6. im OS Prüfen, ob ein altes Logfile noch geöffnet ist
    lsof | grep log_g.*dbf
  7. im OS die alten Logfiles löschen
    rm /oracle/origlogA/log_g11m1.dbf /oracle/origlogB/log_g12m1.dbf /oracle/origlogA/log_g13m1.dbf /oracle/origlogB/log_g14m1.dbf /oracle/origlogA/log_g15m1.dbf /oracle/origlogB/log_g16m1.dbf

Hilfreiche SQL-Statements:

SELECT event, time_waited_micro FROM V$SYSTEM_EVENT WHERE event LIKE 'log file switch (checkpoint incomplete)';
SELECT instance_name, to_char(startup_time,'dd.mm.yyyy hh24:mi:ss') AS startup_time FROM v$instance;
SELECT * FROM V$LOGFILE;
SELECT * FROM V$LOG;
SELECT * FROM V$LOGFILE f, V$LOG v WHERE f.group#=v.group#;

Databasefiles einer Oracle-DB prüfen

Um zu überprüfen, ob die Databasefiles korrupt sind, bietet sich eine Überprüfung mit dem rman an. Dazu geht man folgenderweise vor:

rman target /

Recovery Manager: Release 12.1.0.2.0 – Production on Thu May 28 19:55:24 2018
Copyright (c) 1982, 2014, Oracle and/or its affiliates. All rights reserved.
connected to target database: Obelix-DB (DBID=4711)

RMAN> backup validate DATABASE;

Nachdem das Kommando einige Minuten (abhängig von der DB-Größe) gelaufen ist, bekommt man eine Zusammenfassung über alle (hoffentlich keine) korrupten Blöcke.

NULLGLOB setzen

In Shellscipten (bash) kommt es immer wieder vor, dass z.B. eine FOR-Schleife über mehrere Dateien kreist:

for i in /tmp/Datei_*.txt
do
   echo "Datei: ${i}"
done

Da es dabei natürlich auch vorkommen kann, dass gerade keine Dateien vorhanden sind, würde in einem solchen Fall die Ausgabe so aussehen:

Datei: /tmp/Datei_*.txt

Das führt dann häufig zu Problemen in der Verarbeitung. Abhilfe schafft folgende Anweisung:

shopt -s nullglob

Dadurch wird die Wildcard (in diesem Fall „*“) anders interpretiert: Der Schleifenkörper wird gar nicht erst ausgeführt.

Um die Option wieder zurück zu nehmen, muss einfach die Option disabled werden:

shopt -u nullglob

Automount unter Solaris 10

 Zuerst muss das Verzeichnis auf dem eigenen System angelegt werden.
Dann muss in der Datei

/etc/auto_direct

der notwendige Mountpoint eingerichtet werden.

<Verzeichnis auf dem eigenen System> -rw,soft,vers=3,intr,timeo=36000,acregmax=10,rsize=8192,wsize=8192 <Quellrechner>:<Quellverzeichnis>

Ggf. müssen noch die Parameter angepasst werden.
Anschließend muss mit dem Kommando

automount

dem System noch mitgeteilt werden, dass sich an der Konfiguration etwas geändert hat.
Fertig.

Accounts unter Solaris

Einen User das Login entziehen:

Als User root kann folgender Befehl genutzt werden um einen User zu sperren.

passwd -l <user>

Anschließend ist der Account nicht mehr von außen sowie von innen erreichbar. Einzige Ausnahme ist der User root des entsprechenden Systems. Dieser User kann sich immer noch mit dem Umweg

su - <user>

auf den gesperrten Accounts einloggen.