Tipps & Tricks: Oktober 2011 Bereich: DBA Erstellung: 10/2011 RM Versionsinfo: 11.2 Letzte Überarbeitung: 10/2011 RM memory_target unter Linux Wollten Sie schon mal, die unter 11g hinzugekommenen Parameter, memory_target und memory_max_target verwenden und haben als Fehlermeldung beim Startup folgende Meldung: ORA-00845: MEMORY_TARGET not supported on this system erhalten, und sind Sie dann aus Zeitgründen oder Ähnlichem wieder auf die, in 10g aktuellen Parameter ausgewichen? Wenn ja, sind Sie hier richtig! Die gerade angesprochene Fehlermeldung ORA-00845 sagt nämlich (milde ausgedrückt) nicht wirklich die Wahrheit. Das Alertlog der entsprechenden Datenbank ist an dieser Stelle ein wenig gesprächiger und gibt z. B. folgenden Text aus: WARNING: You are trying to use the MEMORY_TARGET feature. This feature requires the /dev/shm file system to be mounted for at least 1577058304 bytes. /dev/shm is either not mounted or is mounted with available space less than this size. Please fix this so that MEMORY_TARGET can work as expected. Current available is 1048576000 and used is 0 bytes. Ensure that the mount point is /dev/shm for this directory. memory_target needs larger /dev/shm Somit sind Sie hier schon ein bisschen schlauer und wissen nun, dass irgendetwas (um genau zu sein /dev/shm) wohl zu klein ist und größer sein sollte. Warum ist man aber vorher nicht schon auf dieses Problem gestoßen? Die Erklärung ist ziemlich simpel: Sobald Sie den Parameter memory_target setzen wird auf der Betriebssystemebene von Linux eine andere Methode für die Arbeitsspeicherverwaltung verwendet, als es beim Setzen von z. B. pga_aggregate_target und sga_target geschieht. Zurück zum eigentlichen Problem: Wie kriegen Sie memory_target dazu auf Ihrem System "supported" zu sein? Im Prinzip ist dies ganz einfach. Sie müssen nur /dev/shm entsprechend vergrößern. Dazu gehen Sie wie folgt vor: 1. Mit dem Linux "df -h" können Sie überprüfen, ob derzeit jemand auf diesen Bereich zugreift bzw. Speicher beansprucht. Die Ausgabe des Befehls könnte so aussehen. df -h Filesystem Size Used Avail Use% Mounted on Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 1 von 4 /de...00-LogVol00 /dev/sdb1 /dev/sda1 tmpfs 5.8G 2.0G 3.6G 35% / 20G 11G 7.5G 60% /u01 99M 13M 82M 14% /boot 1000M 0 1000M 0% /dev/shm Hier sehen Sie, dass tmpfs, welches unter /dev/shm gemountet ist, einen "Used"-Wert von 0 hat, was bedeutet, dass derzeit niemand auf diese Weise Arbeitsspeicher beansprucht. 2. Nun müssen Sie als erstes diesen Bereich mit dem Befehl "umount /dev/shm" abkoppeln und danach die fstab mit "vi /etc/fstab" editieren. Die Datei könnte wie folgend bei Ihnen aussehen: /dev/VolGroup00/LogVol00 / ext3 defaults 11 LABEL=/u01 /u01 ext3 defaults 12 LABEL=/boot /boot ext3 defaults 12 tmpfs /dev/shm tmpfs size=1000m,defaults devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 00 proc /proc proc defaults 00 /dev/VolGroup00/LogVol01 swap swap defaults 00 00 In dieser Datei ändern Sie nun den size Wert auf einen entsprechend höheren Wert oder fügen ihn neu hinzu. Zum Beispiel: /dev/VolGroup00/LogVol00 / ext3 defaults 11 LABEL=/u01 /u01 ext3 defaults 12 LABEL=/boot /boot ext3 defaults 12 tmpfs /dev/shm tmpfs size=2000m,defaults devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 00 proc /proc proc defaults 00 /dev/VolGroup00/LogVol01 swap swap defaults 00 00 3. Als letztes muss /dev/shm wieder mit "mount /dev/shm" gemounted werden. Mit dem Befehl "df -h" können Sie die geänderten Werte sehen. Filesystem /de...00-LogVol00 /dev/sdb1 /dev/sda1 tmpfs Size Used Avail Use% Mounted on 5.8G 2.0G 3.6G 35% / 20G 11G 7.5G 60% /u01 99M 13M 82M 14% /boot 2.0G 0 2.0G 0% /dev/shm Nun könnten Sie eine Oracle Instanz starten, die einen Memory_target Wert von 1,5 GB hat, welches vorher in einem ORA-00845-Fehler geendet hätte. SQL> startup ORACLE instance started. Total System Global Area 1570009088 bytes Fixed Size 2226832 bytes Variable Size 855639408 bytes Database Buffers 704643072 bytes Redo Buffers 7499776 bytes Database mounted. Database opened. Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 2 von 4 SQL> show parameter memory_ NAME TYPE VALUE ------------------------------------ ----------- -----------------------------hi_shared_memory_address integer 0 memory_max_target big integer 1504M memory_target big integer 1504M shared_memory_address integer 0 Wenn Sie von den oben benutzen Werten abweichen müssen oder wollen, sind hier noch ein paar kleine Kniffe: 1. Durch ein Vertippen oder Ähnliches sind die Werte nicht zu gebrauchen und die Instanz startet nicht mehr. In diesem Fall ist auch leider ein SQL-Befehl wie alter system set memory_target=<richtiger Wert> scope=spfile; nicht mehr möglich und Sie müssen einen kleinen Umweg gehen. Als erstes müssen Sie sich mit dem SQL Befehl create pfile='/tmp/pfile.ora' from spfile; einen Pfile erzeugen. Diesen Pfile können Sie nun editieren und dort wieder die entsprechenden Werte eintragen. Mit dem Befehl create spfile from pfile='/tmp/pfile.ora'; wird dann der gerade geänderte Pfile über das SPfile geschrieben und die Instanz lässt sich wieder normal starten. 2. Leider besteht ein kleines Problem zwischen dem size Wert in der fstab und dem memory_target Wert in Oracle, wenn Sie mit groben Angaben arbeiten wie z. B. 1500 M. Dies äußert sich wie folgt: cat /etc/fstab /dev/VolGroup00/LogVol00 / ext3 defaults 11 LABEL=/u01 /u01 ext3 defaults 12 LABEL=/boot /boot ext3 defaults 12 tmpfs /dev/shm tmpfs size=1500m,defaults devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 00 proc /proc proc defaults 00 /dev/VolGroup00/LogVol01 swap swap defaults 00 df -h Filesystem /de...00-LogVol00 /dev/sdb1 /dev/sda1 tmpfs 00 Size Used Avail Use% Mounted on 5.8G 2.0G 3.6G 35% / 20G 11G 7.5G 60% /u01 99M 13M 82M 14% /boot 1.5G 0 1.5G 0% /dev/shm cat /tmp/pfile.ora ......... *.memory_target=1500M ........ SQL> create spfile from pfile='/tmp/pfile.ora'; File created. SQL> startup ORA-00845: MEMORY_TARGET not supported on this system Dazu der entsprechende Eintrag im Alertlog der Datenbank: Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 3 von 4 WARNING: You are trying to use the MEMORY_TARGET feature. This feature requires the /dev/shm file system to be mounted for at least 1577058304 bytes. /dev/shm is either not mounted or is mounted with available space less than this size. Please fix this so that MEMORY_TARGET can work as expected. Current available is 1572864000 and used is 0 bytes. Ensure that the mount point is /dev/shm for this directory. memory_target needs larger /dev/shm Weitere Informationen zu Linux und Oracle Datenbanken erhalten Sie in unseren Kursen. Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 4 von 4