Hallo und herzlich Willkommen!

Hier dreht sich alles um UNIX Systemadministration, um Datenbanken und ihre Verwaltung!

Sie möchten wissen mit wem Sie es zu tun haben?

Hier finden Sie eine kleine Audio Vorstellung von mir und hier finden Sie genaueres über meine Firma.

me, myselve and i
Was gib es Neues? Sie wollen immer auf dem neusten Stand bleiben? Abonnieren Sie den RSS-FEED!

Befehle rund um Veritas Storage Foundation vergessen?

Kein Problem. In meiner Befehlssammlung zu Produkten von Vertias steht alles drin.

Es geht auch ohne Veritas:

Eine kleine Anleitung wie man root Platten mit Solstice Disk Suite (SDS) spiegelt ist auch vorhanden. Wer die Wahl hat, sollte ZFS in Erwägung ziehen.

Sie möchten eine Oracle DB kopieren?

Hier gibt es eine Beschreibung einer mögliche Variante. Und jetzt auch die elegante Methode!

Oder endlich mal den Unterschied zwischen Instanz und Datenbank verstehen?

Das kennen Sie natürlich alles schon längst?

Titelfoto von:

Fotograf: Studio Omori, Mannheim

Veröffentlicht unter Allgemein | Kommentare deaktiviert für Hallo und herzlich Willkommen!

Oracle DB Schema mit mehreren Tablespaces kopieren

Moin Moin

Ein Oracle DB Schema kopieren ist eigentlich keine große Sache. Exportieren, neues Schema anlegen und Daten wieder importieren. Hat das Schema aber mehrere Tablespaces, landen beim Import alle Daten in einem Tablespace. Das ist natürlich nicht Sinn der Sache. Mit Datapump kann man aber auch mehrere Tablespaces remappen. Dazu ein kleines Beispiel:

Wir legen zunächst ein neues Schema mit entsprechenden Tablespaces an:

create user TUKB002 identified by start_4 default tablespace KB_D02 profile  PF_TU_QKB;
alter user TUKB002 quota unlimited on KB_D02;
alter user TUKB002 quota unlimited on KB_X02;
grant R_SCHEMA TO TUKB002;
grant R_BASIS TO TUKB002;

In den Rollen R_SCHEMA und R_BASIS sind diverse Rechte zusammengefasst. Ist auch eine hübsche Idee um sich Arbeit zu ersparen.

Für Datapump brauchen wir noch ein Directory sowie entsprechenden Rechte:

create directory DATA_PUMP_DIR as ‚/data/KB/export';
GRANT READ, WRITE ON DIRECTORY DATA_PUMP_DIR TO TUKB001;
GRANT READ, WRITE ON DIRECTORY DATA_PUMP_DIR TO TUKB002;

Export:

expdp TUKB001 schemas=TUKB001 directory=DATA_PUMP_DIR dumpfile=tukb001.dmp logfile=tukb001.log

Und dann der Import mit Remaps von Schema und Tablespaces:

impdp TUKB002 directory=DATA_PUMP_DIR dumpfile=tukb001.dmp logfile=tukb002-imp.log REMAP_SCHEMA=TUKB001:TUKB002 REMAP_TABLESPACE=KB_D01:KB_D02,KB_X01:KB_X02

Zum Schluss nehmen wir noch die Rechte für Datapump wieder weg:

revoke READ, WRITE ON DIRECTORY DATA_PUMP_DIR from tukb001;
revoke READ, WRITE ON DIRECTORY DATA_PUMP_DIR from tukb002;

Soweit die Pflicht. Für die Kür können wir dann noch einen Loopback DB Link anlegen und über den Parameter NETWORK_LINK=<db_link_name> beim Datapump die Daten dirket kopieren.

 

Veröffentlicht unter Oracle | Hinterlasse einen Kommentar

Oracle Datenbank kopieren auf elegante Art mit duplicate database!

Hallo DBA’s,

hier hatte ich mich schon mal zum kopieren von Oracle DB’s verlustiert. Allerdings setzt diese Art des Kopierens vorraus, das die Quelle herunter gefahren werden muss (cold copy). Das ist natürlich weder immer möglich, noch nötig. Also skizziere ich diesmal das Vervielfältigen mittles RMAN duplicate database.

Man kann die Quell DB (target) zum aktuellen Stand kopieren, oder auch mit Hilfe des Backups auf ältere Stände („until time“) zurückgreifen. Das Beispiel hier setzt TSM/TDPO vorraus.

Vorraussetzungen:

  • orapwd muss für neue DB (auxiliary) vorhanden sein
  • ein pfile für die auxiliary brauchen wir auch
  • für target (Quelle) und auxiliary (Kopie) muss ein Listener konfiguriert sein und laufen
  • für beide müssen jeweils tnsnames Einträge vorhanden sein

Die DB’s können sowohl lokal auf der selben Maschine, als auch auf verschiedenen Systemen laufen.

Ein Beispiel PFILE mit konvertierten File Locations:

ora11@dwptcae1> less initDUPLICATEDB.ora
# init only for the function duplicate database
# Minimum Requirement!

DB_NAME=WSSD600B
control_files=’/oradata/WSSD600B/control01.ctl‘,’/oradata/WSSD600B/control02.ctl

# Convert file names to allow for different directory structure.

DB_FILE_NAME_CONVERT=(/opt/oracle/oradata/WSSP600/,/oradata/WSSD600B/)
LOG_FILE_NAME_CONVERT=(/opt/oracle/oradata/WSSP600/,/oradata/WSSD600B/)

# make sure block_size and compatible parameters
# match if you are not using the default.

DB_BLOCK_SIZE=8192
remote_login_passwordfile = exclusive
compatible=’11.1.0.0′

Die auxiliary DB heisst hier WSSD600B und die target DB WSSP600. Für „active database“ auszuführen auf der auxiliary Seite mit entsprechendem Environment:

sqlplus „/ as sysdba“

SQL>startup nomount pfile=’/opt/oracle/dbs/initDUPLICATEDB.ora';

rman

RMAN>connect target sys@WSSP600

RMAN>connect auxiliary sys@WSSD600B

RMAN>duplicate target database to WSSD600A from active database

Hier dann das Vorgehen bei „until time“ mit TSM/TDPO. Dabei unterscheidet sich nur der RMAN Teil und natürlich muss TDPO konfiguriert sein (ist ne hübsche Idee für einen neuen Blogbeitrag 😉 ):

rman target sys@WSSP600 auxiliary /

RMAN> run {

allocate auxiliary channel t1 type ‚sbt_tape‘ parms ‚ENV=(TDPO_OPTFILE=/opt/tivoli/tsm/client/oracle/bin64/duplicate_db.opt)';
allocate auxiliary channel t2 type ‚sbt_tape‘ parms ‚ENV=(TDPO_OPTFILE=/opt/tivoli/tsm/client/oracle/bin64/duplicate_db.opt)';
duplicate target database to WSSD600B until time „to_date(‚2010-02-23 19:00:00′,’YYYY-MM-DD HH24:MI:SS‘)“;

}

Wie schnell der ganze Spaß geht, hängt natürlich von der Größe der DB und auch von den Netz- und Backup- Laufzeiten ab.

Viele Grüße

Michael

Veröffentlicht unter Datenbank, Oracle | Verschlagwortet mit , , | Hinterlasse einen Kommentar

Inetd.conf in Solaris 10 editieren

Hallo,

ein Kollege, der hauptsächlich LINUX administriert (Ausrede 😉 ) hatte heute folgendes Problem:

Er hätte gerne einen Inetd Service. Darum hat er /etc/inet.d editiert und dann dem Prozess inetd ein HUP Signal gesendet. Das ganze auf Solaris 10.

Das ist dann nichts geworden.

Seit Solaris 10 werden alle Services per SMF (Service Managment Facility) gestartet. Die Datei /etc/inetd.conf hat somit nur noch informellen Charakter. SUN meinte es noch gut mit uns, und hat speziell für diese Sachen das Kommando inetadm kreiert.

Funktioniert dann folgendermaßen:

  • Eintrag in /etc/services
  • Alles was sonst in inetd.conf hinzu kommen soll, in eine Datei schreiben
  • inetconv -i <Datei> aufrufen
  • inetadm -e <Service> genau diesen Service enablen
  • Glücklich grinsen!

Viele Grüße

Michael

Veröffentlicht unter Solaris, UNIX | Hinterlasse einen Kommentar

Oracle: Prozess abgebrochen aber Undo Tablespace bleibt weiterhin voll

Hallo,

aufgeregter Anrufer heute:

„Wir haben einen Job in unserer Oracle Datenbank abgeschossen, weil der Undo Tablespace vollzulaufen drohte. Der Prozess ist weg und der Job ist als gekilled markiert, aber der Undo Tablespace ist immer noch voll. Wie bekommen wir das weg? Datenbank durchstarten?“

Works as desigend und zwar Gott sei Dank.

1. Es war kein Job, sondern ein Programm das in der Datenbank sehr sehr große Transaktionen angeschoben hat. Ein DBMS Job ist was anderes …

2. Der Undo Tablespace füllt sich, weil die Transaktion nicht abgeschossen wird.

3. Die DB tut sehr gut daran, nach Abbruch des Programms, nicht einfach auch alle Änderungen mit commit zu beenden. Sonst wäre die DB unbrauchbar und die Daten im Eimer. Das nennt man dann Transaktionssicherheit.

4. Ja, kann passieren, dass das zurück rollen der DB nach Abbruch der Transaktion länger dauert, als das der eigentliche „Job“ noch gedauert hätte …

5. Auch ein Neustart der DB ändert daran absolut nichts.

Fazit:

Abhilfe kurzfristig: Undo Tablespace vergrößern.

Abhilfe langfristig: Programmieren lernen 😉

Viele Grüße

Michael

Veröffentlicht unter Datenbank, Oracle | Hinterlasse einen Kommentar

Linkschleuder: ORA-600 berichtet über Bug im RMAN

Hallo,

heute mal eine Link Empfehlung für die Oracle DBA’s:

Sitaro beschreibt auf seinem Blog „ORA-600“ einen Fehler im RAM und den passenden Workaround, der beim Duplicate Database auftritt!

Viele Grüße

Michael

Veröffentlicht unter Datenbank, Oracle | Hinterlasse einen Kommentar

Bug mit eventuell üblen Folgen im VRTSexpoer

Hallo Sysadmins,

es gibt einen mittlerweile gefixten Bug im VRTSexpoer von  Symantec der unter ungünstigen Umständen alles unter dem / Verzeichnis löscht. Am besten die neuste Version ab 5.5z verwenden.

Aber seht selbst: Technote 160373.

Viele Grüße

Michael

Veröffentlicht unter Veritas | Hinterlasse einen Kommentar

SMB Share von Solaris 11 und Opensolaris. Quick and Dirty …

Hallo Sysadmins!

Wir stellen für die „Windows-Welt“ ein Share zur Verfügung.

Gleich vorweg: Ich schere mich hier nicht um Sicherheit, daher steht da auch das „Dirty“ im Titel … Also bitte nur in geschlossenen Netzen anwenden! Schnell geht es schon 😉

Früher brauchte man dafür SAMBA, aber ab OpenSolaris ist ein CIFS Server und Client schon an Bord.

Erstmal braucht man die Pakete:

service/file-system/smb ist der SMB Server und system/file-system/smb enthält den Client support.

pfexec pkg install service/file-system/smb system/file-system/smb

Ein Service möchte auch enabled sein:

pfexec svcadm enable -r smb/server

Und nun wollen wir einer Workgroup beitreten:

smbadm join -w <workgroup-name>

Windows braucht verschlüsselte Passwörter, also müssen wir  /etc/pam.conf editieren:

other password required pam_smb_passwd.so.1 nowarn

ergänzen. Alle User in der /etc/passwd müssen die Passwörter neu setzten (zumindest die mit denen zugegriffen werden soll):

pfexec passwd <user>

So, jetzt fehlen nun noch die Filesystme:

pfexec zfs set sharesmb=on <homepool/export/home>

pfexec zfs set sharesmb=on <homepool/export/home/mike> …. usw

Das war es schon!


 

 

Veröffentlicht unter Solaris | Hinterlasse einen Kommentar

Kopieren einer Solaris Zone

Hallo Sysadmins,

wie kopiert man eine Zone (im Beispiel heißt sie „movemich“)  zwischen zwei Maschinen?

  • Zone stoppen: zoneadm -z movemich halt
  • Zone detach: zoneadm -z movemich detach
  • Die Filesysteme kopieren, SAN Lun’s auf die andere Maschine bringen oder einen ZFS Snapshot per send|scp|reseive transportieren.
  • Auf anderer Maschine Zone anlegen: zonecfg -z movemich
  • Die gibt es noch nicht also: create -a <Pfad zum Zonenroot Filesystem>
  • verify, commit schadet auch nicht, dann raus aus zonecfg: exit
  • Zone attachen: zoneadm -z movemich attach (eventuell mit -u auf den aktuelleren Stand bringen)
  • Booten: zoneadm -z movemich boot

Habe Fertig!

Michael

Veröffentlicht unter Solaris | 4 Kommentare

Solaris: Memory Nutzung von ZFS mit Modular Debugger ansehen.

Hallo Sysadmins,

im letzten Artikel, ZFS Housekeeping, habe ich einen Kernel Parameter (zfs:zfs_arc_max) zur Begrenzung des Speicherhungers von ZFS vorgestellt. Wie sieht man nun eigentlich im laufenden Kernel, wie viel RAM sich ZFS gönnt?

Ganz leicht sieht man das mit dem Modular Debugger Modul Memstat. Hier zwei Beispiele:

  • Eine Maschine ohne irgendwelche Begrenzungen:

root@global.mistvieh2# mdb -k
Loading modules: [ unix genunix specfs dtrace zfs sd mpt px ip hook neti ssd fcp fctl qlc sctp arp usba nca ipc random md cpc crypto wrsmd fcip logindmux ptm ufs sppp nfs lofs ]
> ::memstat
Page Summary                Pages                MB  %Tot
————     —————-  —————-  —-
Kernel                     372378              2909   12%
ZFS File Data             1847777             14435   60%
Anon                       455198              3556   15%
Exec and libs                7469                58    0%
Page cache                 141519              1105    5%
Free (cachelist)            15192               118    0%
Free (freelist)            245518              1918    8%

Total                     3085051             24101
Physical                  3063453             23933
>

Die Maschine hat 24GB RAM und wie man sieht gönnt sich ZFS 60% davon. Nur die Boot Platten (rpool) sind auf ZFS. Die Anwendungen laufen auf VxFS Filesystemen. Das ist im Augenblick nicht schlimm, aber wenn die zweite Maschine dieses zwei Node Clusters schlafen geht, kommen noch 5 weitere Oracle Datenbanken hinzu. ZFS gibt den Speicher aber nicht mehr freiwillig ab ….

  • Eine kleine Maschine mit 4GB RAM und Begrenzung des ZFS auf 2GB max.

mike@udssr:~$ pfexec mdb -k
Loading modules: [ unix genunix specfs dtrace mac cpu.generic uppc pcplusmp scsi_vhci zfs sata sd ip hook neti arp usba uhci stmf stmf_sbd fctl sockfs md lofs random idm crypto smbsrv nfs fcp cpc fcip sppp nsmb ufs logindmux ptm ipc ]
> ::memstat
Page Summary                Pages                MB  %Tot
————     —————-  —————-  —-
Kernel                     296573              1158   28%
ZFS File Data              469035              1832   45%
Anon                       170660               666   16%
Exec and libs                5787                22    1%
Page cache                  33954               132    3%
Free (cachelist)            20555                80    2%
Free (freelist)             47432               185    5%

Total                     1043996              4078
Physical                  1043995              4078
>

Diese Maschine wurde erst vor zwei Tagen neu gestartet. Daher liegt der RAM Anteil für ZFS noch knapp unter dem eingestellten Maximum von 2GB.

Unter „Anon“ wird übrigens alles gelistet, was nicht direkt zu einem vnode zugeordnet werden kann (Heap Space von Prozessen, deren Stack und Copy-on-Write Pages).

Viele Grüße

Michael

Veröffentlicht unter Solaris | Hinterlasse einen Kommentar

ZFS Housekeeping

Hallo Sysadmins,

ein paar Kleinigkeiten die ich immer auf Maschinen mit ZFS Filesystemen/Pools einrichte:

  • Überwachung:

Ein zpool status -x checkt alle vorhanden Pools. Falls Fehler vorhanden sind werden sie gemeldet. Normalerweise sieht die Ausgabe so aus:  all pools are healthy

  • Check mittels zpool scrub

Einmal die Woche lasse ich meine Pools per scrub überprüfen. Das ganze ist etwas I/O intensiv, daher auf einen Zeitpunkt verlegen (per cron) wo nicht viel auf den Platten geschrieben ist. Hier ein kleines Beispiel Skript:

#!/usr/bin/ksh

ZPOOL=“/usr/sbin/zpool“

GREP=“/usr/bin/grep“

AWK=“/usr/bin/awk“

POOLS=“$($ZPOOL list -H | $AWK ‚{print $1}‘)“
OKPATTERN=“is healthy“
RET=0;

for POOL in $POOLS
do
OUT=“$($ZPOOL status -x $POOL)“
if echo „$OUT“|$GREP „$OKPATTERN“
then
echo „Pool $POOL is OK, starting scrub“
$ZPOOL scrub $POOL
else
echo „Pool $POOL has errors, don’t scrub, next“
RET=$RET+1
fi
done

echo „All Pools checked“
exit $RET

  • System Konfiguration

Man kann sich auch zu Tode tunen …. Aber zwei Einstellungen für /etc/system haben sich unter Umständen bewährt:

Wenn man auf x86’er Maschinen SATA Platten benutzt, macht es Sinn die gleichzeitigen Operationen auf den Platten zu beschränken. SATA ist dafür nicht dafür bekannt hochperformant bei parallelen Schreiboperationen zu sein. Mit folgendem Kernel Parameter stellt man es ein:

set zfs:zfs_vdev_max_pending=<Anzahl der Spindeln>

zum Beispiel bei 6 SATA Platten:

set zfs:zfs_vdev_max_pending=6

ZFS kann sich unter bestimmten Umständen reichlich RAM für seinen Cache reservieren. Startet man später noch zum Beispiel Datenbanken nach, so bekommen diese nicht immer genügend Speicher am Stück für ihre Caches. Das kann zum swappen der Maschine führen. Man kann die Menge an RAM für den ZFS Cache aber begrenzen:

set zfs:zfs_arc_max=<byte>

zum Beispiel auf 2GB bei einem 4GB System:

set zfs:zfs_arc_max=2147483648
Wer Lust dazu hat kann sich mal mit dem ZFS Evil Tuning Guide beschäftigen. Dort gibt es weiterreichende Erklärungen und weitere Anregungen.

Viele Grüße

Michael

Veröffentlicht unter Solaris | 1 Kommentar