Oracle 12.2, login als gebruiker faalt

C:\Windows\System32>sqlplus / as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on Mon Mar 27 09:51:42 2017

Copyright (c) 1982, 2016, Oracle. All rights reserved.

Connected to:
Oracle Database 12c Standard Edition Release 12.2.0.1.0 - 64bit Production

SQL> create user testuser identified by testuser;

User created.

SQL> grant create session to testuser;

Grant succeeded.

SQL> connect testuser/testuser
ERROR:
ORA-01017: invalid username/password; logon denied

Warning: You are no longer connected to ORACLE.
SQL> connect / as sysdba

SQL> grant sysdba to testuser

Grant succeeded.

SQL> conn testuser/testuser as sysdba
Connected.
SQL>

Wat zou het kunnen zijn?

Installing Oracle Enterprise Manager 13c and Agents on Microsoft Windows II

Altijd fijn. Je slaapt er een nachtje over, denkt nog eens na, en een rustig moment…

Ik besloot om nogmaals de methode ‘Easy EM12c Agent Deployment on Windows’ te proberen, en nu met meer succes.
Stap 1. Volg Download the Agent Deployment Files en Deploy the Agent (bijvoorbeeld in C:\Temp)
Stap 2. Pas binnen de uitgepakte zip het bestand agent.rsp aan en voeg toe:
ORACLE_HOME=C:\Oracle\agent_13.2.0.0.0
AGENT_PORT=3872
EM_UPLOAD_PORT=1159
OMS_HOST=
AGENT_INSTANCE_HOME=C:\Oracle\agent_inst
AGENT_REGISTRATION_PASSWORD=
s_encrSecurePwd=
ORACLE_HOSTNAME=
b_doDiscovery=false
START_AGENT=false
b_forceConfigure=false
b_secureAgent=true
b_noUpgrade=true
b_agentupgrade=false
ORACLE_HOSTNAME=
EMCTLCFG_MODE=NONE
AGENT_MODE=NONE
s_agentSrvcName=Oracleagent13c1Agent

Stap 3. Zet voor het gemak de Windows Firewall uit
Stap 4. start vanuit de directory C:\Temp\OracleAgent\13.2.0.0.0_AgentCore_233 een Windows Commandprompt ‘run as administrator’ en geef het commando agentDeploy.bat AGENT_BASE_DIR=c:\oracle RESPONSE_FILE=C:\TEMP\OracleAgent\13.2.0.0.0_AgentCore_233\agent.rsp

Stap 5. Na diverse pop-ups moet de installatie succesvol zijn.
Stap 6. Zet de Windows Firewall weer aan, en voeg een regel toe die de poorten 1159, 1521, 4900, 3872 toestaat.
Stap 7. Voer binnen de Agent-directory uit: emctl config agent addinternaltargets
Stap 8. Unlock het dbsnmp-account en geef het ene sterk wachtwoord
Stap 9. Voeg in de Enterprise Manager de nieuwe non-host onderdelen toe in Add Non-Host Targets Using Guided Process
add_non_host_targets

Klaar

IMP-00060: Warning: Skipping table “XXX”.”YYYY” because object type “MDSYS”.”SDO_ORDINATE_ARRAY” does not exist or has different identifier

Probleem bij een klant; een import van een schema van een andere database op dezelfde host mislukte met foutmelding IMP-00060: Warning: Skipping table “XXX”.”YYYY” because object type “MDSYS”.”SDO_ORDINATE_ARRAY” does not exist or has different identifier.
Bij nader onderzoek bleek dit type een andere lengtewaarde te hebben VARRAY(10000000) OF NUMBER ipv VARRAY(1048576) OF NUMBER.
Het rebuilden van het MDSYS-schema bleek niet de oplossing.
Het droppen van de MDSYS-user en opnieuw aanmaken wel:

SQL> connect / as sysdba

SQL> create user mdsys identified by secret
  2  default tablespace sysaux;

SQL> @?/md/admin/mdprivs.sql

SQL> connect mdsys/secret
SQL> @?/md/admin/catmdloc

SQL> connect / as sysdba
SQL> alter user mdsys
  2  account lock
  3  password expire;

Installing Oracle Enterprise Manager 13c and Agents on Microsoft Windows.

Na de installatie op Oracle Linux, nu op Windows 2012 R2.

De startpagina voor de software is Oracle TechNet http://www.oracle.com/technetwork/oem/enterprise-manager/downloads/index.html

  • Download Enterprise Manager Base Platform  for Windows x86-64 (64-bit)
  • Download de Oracle Database-software
  • Download de DB Templates

 

  • Installeer de Oracle Database-software (software only).
  • Pak de templates uit in %ORACLE_HOME%\product\12.1.0\dbhome_1\assistants\dbca\templates
  • Maak de database met de Database Configuration Assistant aan met één van de templates
  • Installeer de Oracle Enterprise Manager en configureer.

Installatie Agents
Ik heb diverse pogingen gedaan om de Agents te installeren volgens DBAKevlar maar alleen prerequisie failures vielen mij ten deel. Hoogstwaarschijnlijk veroorzaakt door de Windows Firewall op het domein.

Uiteindelijk heb ik de handdoek in de ring geworpen en ben uitgekomen op OEM 12c Agent Deploy on Windows – no problem with Cygwin! Zorg dat je de laatste versie van Cygwin installeert.

Maak een entry aan in de Windows Firewall; laat poort 22 (SSH) door.
Test de cygwin-installatie met een SSH-client zoals Putty. Eerst op de Agent-server, daarna op de OEM-server.
Ik vond het lastig uit te vinden welke poorten opd e Windows Firewall open moesten, en heb er voor gekozen tijdens het deployen van de Agent de Windows Firewall (domain-policy) even uit te zetten. Het securen van de Agent verliep niet goed met onderstaande poorten open.
Nadat de Agent succesvol geïnstalleerd staat, zet op de firewall van de database-server(s) deze poorten open naar de OMS: 1159, 1521, 4900, 3872.
Voeg de host toe.
Nadat de hosts zijn ontdekt; activeer het dbsnmp-account op de databases en voeg de database-instances toe.
Na de installatie van de agent kun je Cygwin weer verwijderen (of de SSHD-service stoppen).

Om de voorgestelde naam van de database te wijzigen is deze pagina handig.

 

Installing Oracle Enterprise Manager 13c on Oracle Linux. Agents on Microsoft Windows

Oracle Management Server

Oracle Linux 7 (OL7) Installation
Boot the server with V100082-01.iso (Oracle Linux Release 7 Update 2 for x86_64 (64 Bit))
Oracle Database 12c Release 1 (12.1) Installation On Oracle Linux 7 (OL7)
Oracle Enterprise Manager Cloud Control 13c Release 1 (13.1.0.0) Installation on Oracle Linux 6 and 7
Linux Services (systemd, systemctl)

Agents (on Microsoft Windows)

No need for Cygwin!

Installing Windows Agents from a staging Windows-server using pstools

see MOS Note 1636851.1 for latest agentDeployPsExec.bat

Note:
Not sure if the unzipped folder is used. Sure that the zip is uploaded to Agent-hosts!

Response file:
HOST_NAMES=[FQDN Agent-host]
USER_NAME=[domain\user with admin rights]
PASSWORD=[the password]
PSEXEC_DIR=[path\to\psexec]
AGENT_IMAGE_PATH=[path\to\agent.zip]
AGENT_BASE_DIR=[path\to\remote\installdir]
AGENT_REGISTRATION_PASSWORD=[sysman password]
EM_UPLOAD_PORT=[4889]
OMS_HOST=[FQDN OMS-host]
REMOTE_SYS_DIR=[C:\Windows]
LOG_LOC=[path\to\local\logdir]

On Agent check if OMS can be reached with http://[oem-host]:4889/empbs/genwallet. If not: check Windows Firewall

Reset OMS password

Toehoorder bij Planboard Oracle DBA Symposium

Ik ben afgelopen dinsdag naar het Planboard Oracle DBA-symposium geweest, dat werd gehouden op landgoed De Horst in Driebergen. Was hierop geattendeerd door de weblog van Harald van Breederode.
Bij binnenkomst leek het meer op een reünie (“ik heb je vorig jaar gemist”,”ik ben alle keren geweest”,”leuk je weer te zien”), maar dat kon nooit over mij gaan, ìk was er voor het eerst! Gelukkig kwam ook ik de nodige bekenden tegen (blijkbaar is het Nederlandse Oracle-wereldje erg klein, althans wanneer het gaat om de party-crashers).

Na de inschrijving en het verplichte bordje-aan-een-lintje-om-je-nek begon het programma.

Ik heb de volgende sprekers beluisterd:

  • Yuri van Buren (Performance management-onderzoek met Oracle Grid Control)
  • Toon Koppelaars (Semantische Query Optimalisatie)
  • Harald van Breederode (Real Application Testing)
  • Erik Valk (Online Table Redefinition)
  • Jonathan Lewis (Interpreteren van Statspack)

(van eventuele recensies zal ik hier weblinks plaatsen)

Tussendoor was er meer dan voldoende gelegenheid om na te praten met de sprekers of mede-luisteraars waardoor de dag voor mij een meerwaarde had ten opzichte van een zware cursus-dag. Ook het gevarieerde programma maakte het prettig om bij te wonen (al was ik ‘s avonds bekaf). Na afloop nog een lekker en gezellig diner.

Installatie Oracle database 10g op Windows Server 2008

Mij werd laatst gevraagd om bij een klant een installatie uit te voeren van Oracle-database 10g op een nieuwe (virtual) server.
Bij aankomst bleek dit te gaan om een Windows 2008-server (die Windows-versie had ik nog niet gezien).
Na het starten van de Oracle installer crashte deze meteen.
Volgens de documentatie is de Oracle installer van patchset 2 (naar 10.2.0.3) of hoger gecertificeerd voor Windows Server 2008 en Windows Vista.

In eerdere versies van de Oracle Universal Installer kon je nog browsen naar een ander installatiepunt. Deze mogelijkheid kon ik niet vinden in de installer van 10g.

Oplossing:

  • Ik heb de installer gebruikt van patchset 3 (naar 10.2.0.4). Deze is aanwezig in p6810189_10204_Win32.
  • pas in het bestand oraparam.ini (\Disk1\install) de waarde aan van de parameter SOURCE= (de standaardwaarde is ../stage/products.xml) zodat deze verwijst naar de products.xml van de 10g-basis-installatie (SOURCE=../../../Install/Disk1-database/stage/products.xml).
  • De installer kan nu worden opgestart.
  • Bij het controleren van de prerequisites kun je de melding dat dit Operating System niet is gesupport, negeren door het zetten van een vinkje. De installatie verloopt nu probleemloos.
  • Wil je patchset 3 installeren, pas dan in de oraparam.ini de waarde van SOURCE weer aan naar de default.

Verder bleek de database geen connecties van buitenaf te accepteren.
Reden: de ingebouwde firewall van Windows Server 2008. De fraaiste oplossing is om aan de firewall een uitzondering toe te voegen voor TCP-poort 1521 9standaard poortnummer van de Oracle Listener).

Hierna werkte alles probleemloos.

Oracle collections, records en table-types deel II

In een eerdere bijdrage schreef ik over het gebruik van PL/SQL-records en ref cursoren.

Omdat ik binnenkort aan de slag mag voor een klant waarbij de opdracht luidt een procedure te schrijven die een geneste recordstructuur ontvangt en deze wegschrijft naar de diverse onderliggende tabellen, ben ik aan de slag gegaan om uit te zoeken hoe dit zou kunnen gaan in een voorbeeldsituatie
Ik heb de volgende opzet bedacht:

  • We hebben een bedrijf dat meerdere adressen (vestigingen) heeft en uit meerdere afdelingen bestaat
  • Een afdeling heeft meerdere werknemers
  • Een werknemer heeft een adres.

De bedoeling is, dat de verwerkende programmatuur 1 object ontvangt waarin het bedrijf + de onderliggende gegevens aanwezig zijn, en deze gegevens weer afzonderlijk beschikbaar maakt voor verdere verwerking.

Het bedrijf Ywemacom import/export heeft 2 adressen; een hoofdadres en een nevenadres
Hoofdadres: Hoofdstraat 1, Amersfoort
Nevenadres: Nevenstraat 1, Amersfoort
Het bedrijf heeft 2 afdelingen, elk met 2 werknemers. Iedere werknemer heeft 1 adres
Afdeling 1 :Verkoop
Werknemer 1: Jan de Groot
Adresgegevens: Hugo de Grootstraat, te Utrecht
Werknemer 2: Karen Veenstra
Adresgegevens: Winkelstraat, te Amsterdam
Afdeling 2: Transploft
Werknemer 1: Joop Schroefstra
Adresgegevens: Stadsring, te Amersfoort
Werknemer 2: Henk Woudenberg
Adresgegevens: Vinkenhof, te Scherpenzeel

In dit voorbeeld worden deze gegevens in de eerste procedure in de package body, ‘VUL’ , in regels 38 – 64 aan het object bedrijf_rec toegevoegd.
Hierna wordt dit object in regel 67 aan de tweede procedure, ‘TOON’ als parameter meegegeven.
Deze procedure pluist het object uit-elkaar en toont de inhoud dmv DBMS_OUTPUT.PUT_LINE. In de praktijk zal in plaats hiervan een serie inserts in tabellen plaatsvinden.

De stored-package BEDRIJF:

CREATE OR REPLACE package bedrijf as
--
   type adres_rec is record (straat varchar2(100)
                            ,nummer number
                            ,plaats varchar2(100)
                            ,adrestype varchar2(100)
                            );
   type adres_tab is table of adres_rec index by pls_integer;
   --
   type werknemer_rec is record (naam varchar2(100)
                                ,adres adres_rec
                                );
   type werknemer_tab is table of werknemer_rec index by pls_integer;
   --
   type afdeling_rec is record (naam varchar2(100)
                              , werknemer werknemer_tab
                              );
   type afdeling_tab is table of afdeling_rec index by pls_integer;
   --
   type bedrijf_rec is record (naam varchar2(100)
                          , adres adres_tab
                          , afdeling afdeling_tab
                          );
--
procedure vul;                                                                                                                 
end bedrijf;
/


CREATE OR REPLACE package body bedrijf as
--
procedure toon (p_bedrijf bedrijf_rec);
--
procedure vul is
-- vul een bedrijfsrecord
--
   l_bedrijf bedrijf_rec;
begin
   l_bedrijf.naam := 'Ywemacom import/export';  -- record-type
      l_bedrijf.adres(1).adrestype := 'Hoofdadres'; -- table-type
      l_bedrijf.adres(1).straat := 'Hoofdstraat';
      l_bedrijf.adres(1).nummer :=1;
      l_bedrijf.adres(1).plaats := 'Amersfoort';
      l_bedrijf.adres(2).adrestype := 'Nevenadres';
      l_bedrijf.adres(2).straat := 'Nevenstraat';
      l_bedrijf.adres(2).nummer :=1;
      l_bedrijf.adres(2).plaats := 'Amersfoort';
      l_bedrijf.afdeling(1).naam := 'Verkoop';
         l_bedrijf.afdeling(1).werknemer(1).naam := 'Jan de Groot';
            l_bedrijf.afdeling(1).werknemer(1).adres.straat := 'Hugo de Grootstraat';
            l_bedrijf.afdeling(1).werknemer(1).adres.nummer := 1;
            l_bedrijf.afdeling(1).werknemer(1).adres.plaats := 'Utrecht';
         l_bedrijf.afdeling(1).werknemer(2).naam := 'Karen Veenstra';
            l_bedrijf.afdeling(1).werknemer(2).adres.straat := 'Winkelstraat';
            l_bedrijf.afdeling(1).werknemer(2).adres.nummer := 2;
            l_bedrijf.afdeling(1).werknemer(2).adres.plaats := 'Amsterdam';
      l_bedrijf.afdeling(2).naam := 'Transploft';
         l_bedrijf.afdeling(2).werknemer(1).naam := 'Joop Schroefstra';
         l_bedrijf.afdeling(2).werknemer(1).adres.straat := 'Stadsring';
            l_bedrijf.afdeling(2).werknemer(1).adres.nummer := 15;
            l_bedrijf.afdeling(2).werknemer(1).adres.plaats := 'Amersfoort';
            l_bedrijf.afdeling(2).werknemer(2).naam := 'Henk Woudenberg';
            l_bedrijf.afdeling(2).werknemer(2).adres.straat := 'Vinkenhof';
            l_bedrijf.afdeling(2).werknemer(2).adres.nummer := 78;
            l_bedrijf.afdeling(2).werknemer(2).adres.plaats := 'Scherpenzeel';
--
-- roep de procedure aan met het bedrijfs-object als parameter
   toon(p_bedrijf => l_bedrijf); 
end vul;
--
procedure toon (p_bedrijf bedrijf_rec) is
-- pluis het bedrijfs-object uit en druk de inhoud af
   l_bedrijf bedrijf_rec;
begin
   l_bedrijf := p_bedrijf;
   --
   dbms_output.put_line ('Bedrijf: '||l_bedrijf.naam); -- 1 bedrijf
   dbms_output.put_line ('Adresgegevens: ');
   for bedrijfsadressen in l_bedrijf.adres.first..l_bedrijf.adres.last loop
       dbms_output.put_line (l_bedrijf.adres(bedrijfsadressen).adrestype||': '||l_bedrijf.adres(bedrijfsadressen).straat||' '
                              ||l_bedrijf.adres(bedrijfsadressen).nummer||' te '
                              ||l_bedrijf.adres(bedrijfsadressen).plaats);
    end loop;                                          
   -- afdelingen af
   for afdelingen in l_bedrijf.afdeling.first ..l_bedrijf.afdeling.last loop
      dbms_output.put_line ('Afdeling '||afdelingen||' is: '||l_bedrijf.afdeling(afdelingen).naam);
      -- werknemers af
      for werknemers in l_bedrijf.afdeling(afdelingen).werknemer.first..l_bedrijf.afdeling(afdelingen).werknemer.last loop
         dbms_output.put_line('Werknemer '||werknemers|| ' is: '||l_bedrijf.afdeling(afdelingen).werknemer(werknemers).naam);
         -- bijbehorende adresgegevens
         dbms_output.put_line('Adresgegevens: '||l_bedrijf.afdeling(afdelingen).werknemer(werknemers).adres.straat||' '
                                                  ||l_bedrijf.afdeling(afdelingen).werknemer(werknemers).adres.nummer||' te '
                                                  ||l_bedrijf.afdeling(afdelingen).werknemer(werknemers).adres.plaats);
      end loop;         
   end loop;                                           
end toon;      
--

end bedrijf;
/

Aanroep in sql*plus en het resultaat

SQL> set serveroutput on
SQL> begin
2      bedrijf.vul;
3  end;
4  /

Bedrijf: Ywemacom import/export
Adresgegevens:
Hoofdadres: Hoofdstraat 1 te Amersfoort
Nevenadres: Nevenstraat 1 te Amersfoort
Afdeling 1 is: Verkoop
Werknemer 1 is: Jan de Groot
Adresgegevens: Hugo de Grootstraat 1 te Utrecht
Werknemer 2 is: Karen Veenstra
Adresgegevens: Winkelstraat 2 te Amsterdam
Afdeling 2 is: Transploft
Werknemer 1 is: Joop Schroefstra
Adresgegevens: Stadsring 15 te Amersfoort
Werknemer 2 is: Henk Woudenberg
Adresgegevens: Vinkenhof 78 te Scherpenzeel

PL/SQL procedure successfully completed.

SQL>

Oracle Databaselink via Heterogeneous Services

Je kan niet-Oracle databases benaderen vanuit Oracle. Daartoe maak je gebruik van de Oracle component “Heterogeneous Services”. Het wordt standaard meegeïnstalleerd met een Oracle database server. Als je het apart moet installeren, dan moet je in ieder geval ook het script %ORA_HOME%\rdbms\admin\caths.sql draaien, als user sys.
Heterogeneous Services bestaat uit twee onderdelen: Generic Connectivity en Transparent Gateways. Het eerste gaat met OLEDB of ODBC en is gratis. Het tweede gaat met specifieke gateway componenten (dat wil zeggen: een gateway is specifiek voor de soort databron die je wil benaderen), waarvan er een aantal door Oracle meegeleverd worden, maar kost extra licenties. Dit verhaal gaat verder alleen over Generic Connectivity.

Stap-voor-stap voorbeeld: MS Access database via OLEDB benaderen vanuit Oracle.
OLEDB werkt alleen op Windows. Dus dit voorbeeld werkt ook alleen met een Oracle database op Windows.
1.    Zet je Access file op de database server of op een plek die je vanuit de database server via het file system kan benaderen.
2.    Maak, bijvoorbeeld in diezelfde directory, een nieuw tekstdocument en geef het een naam met de extensie UDL (van universal data link). Dubbelklik op de UDL file. Selecteer de tab Provider, selecteer “Microsoft Jet 4.0 OLE DB Provider”. Klik Next>> Selecteer de MDB file, doe voor de zekerheid Test Connection en klik OK.
3.    Bedenk een naam voor je database connectie van maximaal 8 tekens. Bijvoorbeeld: HSTEST. Dit noemen we de SID (service id). Ga op de database server naar %ORACLE_HOME%\hs\admin. Maak een kopie van de file inithsoledb.ora en noem hem init<SID>.ora. In dit geval dus: initHSTEST.ora. Edit in de file de parameter HS_FDS_CONNECT_INFO. Geef die parameter de waarde “UDLFILE=<Absoluut pad naar de UDL file, met dubbele backslashes>”, inclusief de dubbele quotes er omheen. Dus bijvoorbeeld:
HS_FDS_CONNECT_INFO=”UDLFILE=E:\\oracle\\oradata\\hstest\\hstest.udl”
4.    Edit de file %ORACLE_HOME%\network\admin\listener.ora, om een listener toe te voegen naar de nieuwe SID. Voeg toe aan de SID_LIST:

(SID_DESC =
(PROGRAM = hsolesql)
(SID_NAME = <SID>)
(ORACLE_HOME = E:\oracle\ora92)
)

5.    Edit de file %ORACLE_HOME%\network\admin\tnsnames.ora (op de server!) om een connectie naar de nieuwe SID toe te voegen. Voeg toe:

<SID> =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = <naam db server>)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = <SID>)
)
(HS = OK)
)

6.    Herstart de listener op de database service. Dit gaat het beste op de command-prompt. Type lsnrctl reload.
7.    Alle configuratie is nu klaar. Nu nog bij de data zien te komen. Start daartoe een sessie met de Oracle database. Bijvoorbeeld als scott/tiger. De truc is nu dat je een database link aanmaakt, bijvoorbeeld:

create database link testlink
connect to "Admin" identified by " "
using 'HSTEST’;

Daarbij moet wat er achter using staat overeen komen met de naam van de connectie in de tnsnames.ora op de server (!).
8.    Vervolgens kan je bij de data komen door @<database link naam> achter de tabelnaam te zetten, bijvoorbeeld:

select sysdate
from dual@testlink;

Uit dit stap-voor-stap voorbeeld kan je alle andere situaties verder wel afleiden. Wat je alleen nog moet weten is:
•    Bij ODBC in plaats van OLEDB moet je:
o    hsodbc in plaats van hsolesql gebruiken als PROGRAM in de listener.ora.
o    Bij HS_FDS_CONNECT_INFO in de init<SID>.ora de DSN naam van de System DSN opgeven die je wil benaderen.
•    Naast hsoleqsl en hsodbc is er ook nog hsolefs, voor file based OLEDB providers.

Wees er op bedacht dat, wanneer je met de Oracle Database Creation Assistant (dbca) een nieuwe database aanmaakt, de regel met HS = OK uit de tnsnames.ora verdwijnt (Oracle bug #315752.1).