memory_target unter Linux

02.
Oktober
2011
Veröffentlicht von: Richard Meinhardt

Wollten Sie schon mal, die unter 11g hinzugekommenen Parameter, memory_target und memory_max_target verwenden und haben als Fehlermeldung beim Startup folgende Meldung:

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
/de...00-LogVol00     5.8G  2.0G  3.6G  35% /
/dev/sdb1              20G   11G  7.5G  60% /u01
/dev/sda1              99M   13M   82M  14% /boot
tmpfs                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        1 1
LABEL=/u01               /u01                    ext3    defaults        1 2
LABEL=/boot              /boot                   ext3    defaults        1 2
tmpfs                    /dev/shm                tmpfs   size=1000m,defaults        0 0
devpts                   /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                    /sys                    sysfs   defaults        0 0
proc                     /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0

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        1 1
LABEL=/u01               /u01                    ext3    defaults        1 2
LABEL=/boot              /boot                   ext3    defaults        1 2
tmpfs                    /dev/shm                tmpfs   size=2000m,defaults        0 0
devpts                   /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                    /sys                    sysfs   defaults        0 0
proc                     /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0


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            Size  Used Avail Use% Mounted on
/de...00-LogVol00     5.8G  2.0G  3.6G  35% /
/dev/sdb1              20G   11G  7.5G  60% /u01
/dev/sda1              99M   13M   82M  14% /boot
tmpfs                 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.
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        1 1
LABEL=/u01               /u01                    ext3    defaults        1 2
LABEL=/boot              /boot                   ext3    defaults        1 2
tmpfs                    /dev/shm                tmpfs   size=1500m,defaults        0 0
devpts                   /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                    /sys                    sysfs   defaults        0 0
proc                     /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0

df -h
Filesystem            Size  Used Avail Use% Mounted on
/de...00-LogVol00     5.8G  2.0G  3.6G  35% /
/dev/sdb1              20G   11G  7.5G  60% /u01
/dev/sda1              99M   13M   82M  14% /boot
tmpfs                 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:

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 Opens internal link in current windowKursen.

Jede Menge Know-how für Sie!

In unserer Know-How Datenbank finden Sie mehr als 300 ausführliche Beiträge zu den Oracle-Themen wie DBA, SQL, PL/SQL, APEX und vielem mehr.
Hier erhalten Sie Antworten auf Ihre Fragen.