Seiten

Posts mit dem Label sqlplus werden angezeigt. Alle Posts anzeigen
Posts mit dem Label sqlplus werden angezeigt. Alle Posts anzeigen

Dienstag, 18. Juni 2013

Wie stoppt man ein "EXPIRE(GRACE)" nach einer PROFILE-Panne?

Wenn man das Default-Profile ändert oder der falschen Usergruppe das falsche Profile zuordnet, haben ganz schnell eine Menge User ein ablaufendes Passwort.

SQL >select count(*) from dba_users
  2  where  account_status = 'EXPIRE(GRACE)';

  COUNT(*)
----------
        78

1 Zeile wurde ausgewählt.

Jetzt ist guter Rat teuer. Ein "alter user account_status 'OPEN';" gibt es nicht. Die Passwörter laufen ab. Man kann nichts dagegen tun, außer das Passwort zu ändern.
Da man die Passwörter aller User für gewöhnlich nicht kennt, hilft hier nur die Passwortänderung mit dem Passwordhash.
Diesen bekommt man in 11g aus der sys.user$. Mit diesem Skript lässt man sich in sqlplus gleich noch ein sql-Skript erstellen, welches die Passworthashes schreibt und damit den Accountstatus zurücksetzt:
rem unexpire_users.sql, MW, 18.06.2013

spool alter_user_unexpire.sql
set echo off
set heading off
set linesize 200
set feedback off

SELECT 'ALTER USER ' || DU.USERNAME || ' IDENTIFIED BY VALUES '''|| SU.PASSWORD ||''';' 
FROM SYS.USER$ SU
INNER JOIN SYS.DBA_USERS DU ON DU.USERNAME = SU.NAME
WHERE DU.ACCOUNT_STATUS = 'EXPIRED(GRACE)'
ORDER BY DU.PROFILE, DU.DEFAULT_TABLESPACE, DU.USERNAME;

spool off
exit

Und jetzt das erstellte SQL-Skript ausführen und fertig:
SQL >@alter_user_unexpire
...
...
SQL >select count(*) from dba_users
  2  where  account_status = 'EXPIRE(GRACE)';

  COUNT(*)
----------
         0

1 Zeile wurde ausgewählt.

Sonntag, 30. Dezember 2012

Es sich als Oracle-DBA auf einem Windowsserver gemütlich machen

Nach einer Standardinstallation der Oracle Datenbankksoftware auf einem Windowsserver sollte man folgende Anpassungen vornehmen, ohne die zwar auch arbeiten kann, das aber nicht sonderlich komfortabel.

Schnellstartleiste

in der Schnellstartleiste sollten sich diese Einträge befinden:
  1. Windows Explorer
  2. Services
  3. Server Manager
  4. Scheduler
Das alles braucht man häufig, wenn man die Oracle-DB auf dem Server administrieren muss.

Desktop

Auf dem Desktop lege ich verschiedene Verknüpfungen an, die ebenfalls häufig benötigt werden, welche in der Schnellstartleiste aber sehr schnell für Chaos sorgen würden.
Die Commandshell benötigt man natürlich oft und das auch noch mit unterschiedlichen Umgebungsvariablen je nachdem, mit welcher Datenbank oder unter welchem ORACLE_HOME man arbeiten möchte.
In einer frischen RAC-Installation hat man es sofort mit 2 ORACLE_HOME-Directories (Grid und DB), sowie 2 Instanzen (ASM und z.B. ORCL) zu tun.
Natürlich "weiß" CMD nicht, welche Umgebung man gerade braucht. Zu allem Überfluss gelten die Standard-Pfade bzw. das ORACLE_HOME der zeitlich zuletzt ausgeführten Oracle-Installation. Auf das Grid_Home hat man also keinen Zugriff ohne die Umgebung immer manuell zu modifizieren.

oraenv?

Unter Linux ist das Dank oraenv-Skript kein Problem. Unter Windows gibt es aus unerfindlichen Gründen kein oranev.
Es gibt eine Reihe von Anleitungen, sich das fehlende oraenv-Skript selbst zu erstellen. Eine entsprechende Lösung findet man nach kurzem googlen.

Command-Shell-Batches - oraenv für Arme

Die in einer RAC-Installation benötigten Aufrufe der CMD oder von SQLPLUS konfiguriert man sich mit einfachen Batchdateien, die auf dem Desktop als Verknüpfung abgelegt werden. In einer "normalen" - also einer Single-Instance-Installation ohne ASM benötigt man nur 2 dieser Batchdateien.
Unter zum Beispiel d:\skripte\oraenvbat\ werden also diese Batchdateien auf den jeweiligen Knoten angelegt:
  • cmd_grid1.bat
  • cmd_RACDB1.bat
  • sys_RACDB1.bat
  • asmcmd1.bat
  • sys_asm1.bat
Natürlich muss man diese dann auf jedem RAC-Knoten anlegen und die "1" durch den korrekten Wert ersetzen.

GRID shell - cmd_grid1.bat

In der cmd_grid1.bat wird die Umgebung für das GRID-Home und die ASM-Instanz gesetzt.
Hier zeigt die ORACLE_SID auf die "+ASM1"-Instanz. Die "1" steht dabei für die Instanz auf Node1 des RAC.
@echo off
SET ORACLE_SID=+ASM1
set SQLPATH=D:\skripte\oraenvbat
SET ORACLE_HOME=D:\oragrid\11.2.0.3
SET PATH=%ORACLE_HOME%\bin;%PATH%
set NLS_LANG=GERMAN_GERMANY.WE8PC850
%comspec%
pause

DB shell - cmd_RACDB1.bat

Die cmd_RACDB1.bat setzt ORACLE_SID der Instanz des RAC-Knotens (RACDB1), ORACLE_UNQNAME und Oracle-Home der Datenbank.
@echo off
SET ORACLE_SID=RACDB1
SET ORACLE_UNQNAME=RACDB
set SQLPATH=D:\skripte\oraenvbat
SET ORACLE_HOME=D:\oracle\product\11.2.0.3\dbhome_1
SET PATH=%ORACLE_HOME%\bin;%PATH%
set NLS_LANG=GERMAN_GERMANY.WE8PC850
%comspec%
pause

sqlplus auf die DB as sysdba - sys_RACDB1.bat

Es ist recht bequem, sich per Doppelklick auf die sys_RACDB1.bat als SYSDBA mit der DB  zu connecten. Und noch besser: hiermit kommt man auch noch auf Instanz des jeweiligen RAC-Knotens. (RACDB1)
@echo off
SET ORACLE_SID=RACDB1
set SQLPATH=D:\skripte\oraenvbat
SET ORACLE_HOME=D:\oracle\product\11.2.0.3\dbhome_1
SET PATH=%ORACLE_HOME%\bin;%PATH%
set NLS_LANG=GERMAN_GERMANY.WE8PC850
%ORACLE_HOME%\bin\sqlplus / as sysdba
pause

ASMCMD - asmcmd1.bat

Mit dieser Batchdatei startet man gleich ASMCMD.
@echo off
SET ORACLE_SID=+ASM1
set SQLPATH=D:\skripte\oraenvbat
SET ORACLE_HOME=D:\oragrid\11.2.0.3
SET PATH=%ORACLE_HOME%\bin;%PATH%
set NLS_LANG=GERMAN_GERMANY.WE8PC850
%ORACLE_HOME%\bin\asmcmd -p
pause

sqlplus auf die ASM as sysdba - sys_asm1.bat

Was man an Bequemlichkeit mit der sys_RACDB1.bat gewinnt, möchte man natürlich auch im Fall eines ASM-Connect haben.
@echo off
SET ORACLE_SID=+ASM1
set SQLPATH=D:\skripte\oraenvbat
SET ORACLE_HOME=D:\oragrid\11.2.0.3
SET PATH=%ORACLE_HOME%\bin;%PATH%
set NLS_LANG=GERMAN_GERMANY.WE8PC850
%ORACLE_HOME%\bin\sqlplus / as sysasm
pause
Mit diesen Batchdateien kommt man auf einem Windowssystem dann auch ohne oraenv gut über die Runden.

Samstag, 15. Dezember 2012

SQLPLUS - Komfort durch glogin.sql

Bei jedem Verbindungsaufbau mit einer Datenbank führt sqlplus die Datei glogin.sql (ORACLE_HOME\sqlplus\admin\glogin.sql) aus.
In der glogin.sql kann man damit zentral bestimmte Befehle/Einstellungen definieren, die einem die Handhabung erleichtern.

SQLPROMPT:
  • Datum: _date
  • eingeloggter User: _user
  • Privilege: _privilege
  • Datenbank _connect_identifier 
Damit ist schon einmal gewährleistet, dass man immer sieht, ob man als SYS eingeloggt ist. Das Datum kann auch nie schaden.
Weiterhin lassen sich Editor, Spaltenformate usw. definieren.
SQL-Befehle wie "ALTER SESSION..." lassen sich absetzen.

Hier als Beispiel meine Einstellungen:
set feedback off
set linesize 150
set pagesize 2000
set sqlprompt "_date _user _privilege'@'_connect_identifier>"
alter session set nls_date_format='dd.mm.yyyy hh24:mi:ss';
define _editor=c:\Windows\System32\notepad.exe
set serveroutput on size unlimited format wrapped
set long 1000000
set timing on
set feedback on
Das Ergebnis:
Update:
Nach dem Hinweis von Martin Preiss, habe ich das login etwas angepasst.
set feedback off
set linesize 150
set pagesize 2000
alter session set nls_date_format='dd.mm.yyyy hh24:mi:ss';
define _editor=c:\Windows\System32\notepad.exe
set serveroutput on size unlimited format wrapped
set long 1000000
set timing on
--set sqlprompt "_date _user _privilege'@'_connect_identifier>"
col global_name for a50
define gname=idle 
column global_name new_value gname 
select lower(user) || '@' || 
  substr(global_name,1,decode(dot,0,length(global_name),dot-1))
  || ' '  || sysdate  global_name
  from (select global_name,instr(global_name,'.') dot from global_name);
host title &gname 
set feedback on
Da die Logindaten in die Titelzeile wandern, verhindert man so die hässliche Promptverlängerung.

Die passende Doku: