Gasite la instalarea de productie VADECO (Oracle 21c XE, Windows Server 2019). 1. Pe serverul VADECO procesul Oracle nu poate atinge nicio cale de pe C:, nici macar C:\Windows\Temp, desi ACL-urile sunt corecte si serviciul ruleaza ca NT SERVICE\OracleServiceXE. D: merge cu exact acelasi grant. Calea DMP era insa hardcodata "C:\DMPDIR" in 01, 02, 05, 06 si in biblioteca, deci instalarea nu se putea muta. Acum e parametrul -DmpDir, expus ca /dmpdest: in FAZA1.cmd si FAZA2.cmd si transmis tuturor pasilor. Cel mai perfid era pasul 02: recrea DIRECTORY DMPDIR pe 'C:\DMPDIR' peste valoarea pusa de 01. Chiar cu restul instalarii mutata, SYS.NEWSCHEMA ar fi cautat FIRMANOUA.dmp in alta parte, iar adaugarea unei firme noi ar fi picat peste luni, fara legatura vizibila cu instalarea. 2. New-OracleDirectory compara doar siruri de caractere: verifica ce scrie in dba_directories, nu daca baza chiar poate scrie acolo. Acum face un UTL_FILE round-trip si esueaza pe loc, cu explicatia cauzei. Inainte, directorul inutilizabil trecea drept bun si importul cadea abia in impdp cu ORA-29283, la zeci de linii distanta. Valoarea de retur nici nu era verificata in 01/03/06 - de aici si "True" ratacit in log. 3. Instalarea ROAClient seteaza TNS_ADMIN de masina spre instantclient-ul ei. Serviciul Oracle mosteneste variabilele de masina, deci citea sqlnet.ora de acolo - unde nu exista niciunul - si nu din Oracle Home, unde il scria pasul 01. Compatibilitatea pentru clienti vechi nu se aplica, iar statiile ar fi primit ORA-28040 cu fisierul scris corect, in locul gresit. Pasul 01 scrie acum sqlnet.ora si in TNS_ADMIN cand difera. 4. Pasul 05 lega schemele de DMP-uri cu "^$schema[_\.]", deci schema DANUBE putea primi DANUBE_20200914.dmp - datele altei firme, fara avertisment. Numele exact are acum intaietate, prefixul se accepta doar daca e unic, iar ambiguitatea se raporteaza. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SzF1hf4aFS1tmJWpPMiwGp
287 lines
11 KiB
Batchfile
287 lines
11 KiB
Batchfile
@echo off
|
|
REM =============================================================================
|
|
REM ROA Oracle - FAZA 2: dupa ce utilizatorii au terminat de lucrat
|
|
REM =============================================================================
|
|
REM Aduce datele reale ale clientului peste sistemul deja instalat si
|
|
REM configurat de FAZA1.cmd. Asta e fereastra de downtime; tine-o scurta.
|
|
REM
|
|
REM Ce face:
|
|
REM - optional, reimporta CONTAFIN_ORACLE de pe serverul vechi (/reimportcontafin)
|
|
REM prin DROP USER CASCADE + recreare + import curat
|
|
REM - importa schemele de firma din DMPDIR (05)
|
|
REM - reface SERVER_INFO, directoarele si joburile (08)
|
|
REM - regenereaza schema.txt pentru exportul zilnic (11 -SchemaOnly)
|
|
REM - verifica (07)
|
|
REM
|
|
REM DE CE se reia pasul 08:
|
|
REM SERVER_INFO e o TABELA in CONTAFIN_ORACLE, nu in SYS. Cand vine
|
|
REM contafin-ul clientului peste, aduce cu el SERVER_INFO de pe serverul
|
|
REM VECHI - cai vechi, parole vechi, SMTP vechi. Fara reluarea pasului 08,
|
|
REM actualizarile ar cauta fisiere pe calea serverului vechi.
|
|
REM
|
|
REM Utilizare:
|
|
REM FAZA2.cmd <IdClient> [optiuni]
|
|
REM
|
|
REM Optiuni:
|
|
REM /reimportcontafin inlocuieste CONTAFIN_ORACLE cu cel din DMPDIR
|
|
REM /smtp:<server> server SMTP (implicit mail.romfast.ro)
|
|
REM /roaupdate:<cale> radacina oglinzii (implicit D:\ROAUPDATE)
|
|
REM /export:<cale> director export (implicit D:\ROA\EXPORT_ORADMP)
|
|
REM /dmp:<cale> de unde se copiaza DMP-urile (implicit <kit>\DMPDIR)
|
|
REM /dmpdest:<cale> de unde le citeste baza (implicit C:\DMPDIR)
|
|
REM Trebuie sa fie aceeasi valoare ca la FAZA1.
|
|
REM /faraschema nu regenera schema.txt
|
|
REM
|
|
REM Exemple:
|
|
REM FAZA2.cmd 138
|
|
REM FAZA2.cmd 138 /reimportcontafin
|
|
REM FAZA2.cmd 214 /dmp:E:\export-client /reimportcontafin
|
|
REM =============================================================================
|
|
|
|
setlocal enabledelayedexpansion
|
|
|
|
set "KIT=%~dp0"
|
|
set "IDCLIENT=%~1"
|
|
set "DMPDEST=C:\DMPDIR"
|
|
|
|
set "SMTP=mail.romfast.ro"
|
|
set "ROAUPDATE=D:\ROAUPDATE"
|
|
set "EXPORTDIR=D:\ROA\EXPORT_ORADMP"
|
|
set "DMPSURSA=%KIT%DMPDIR"
|
|
set "REIMPORT=0"
|
|
set "FARASCHEMA=0"
|
|
|
|
if "%IDCLIENT%"=="" goto :utilizare
|
|
if /i "%IDCLIENT%"=="/?" goto :utilizare
|
|
|
|
shift
|
|
:parsare
|
|
if "%~1"=="" goto :parsare_gata
|
|
set "ARG=%~1"
|
|
|
|
if /i "!ARG!"=="/reimportcontafin" ( set "REIMPORT=1" & shift & goto :parsare )
|
|
if /i "!ARG!"=="/faraschema" ( set "FARASCHEMA=1" & shift & goto :parsare )
|
|
|
|
for /f "tokens=1,* delims=:" %%A in ("!ARG!") do (
|
|
set "OPT=%%A"
|
|
set "VAL=%%B"
|
|
)
|
|
|
|
REM "tokens=1,*" pastreaza in %%B tot ce urmeaza dupa PRIMUL ':', inclusiv
|
|
REM ':' din caile de tip D:\ROAUPDATE. Deci /roaupdate:D:\ROAUPDATE ajunge
|
|
REM corect ca OPT=/roaupdate, VAL=D:\ROAUPDATE.
|
|
if /i "!OPT!"=="/smtp" set "SMTP=!VAL!"
|
|
if /i "!OPT!"=="/roaupdate" set "ROAUPDATE=!VAL!"
|
|
if /i "!OPT!"=="/export" set "EXPORTDIR=!VAL!"
|
|
if /i "!OPT!"=="/dmp" set "DMPSURSA=!VAL!"
|
|
if /i "!OPT!"=="/dmpdest" set "DMPDEST=!VAL!"
|
|
|
|
shift
|
|
goto :parsare
|
|
:parsare_gata
|
|
|
|
echo.
|
|
echo ============================================================
|
|
echo ROA Oracle - FAZA 2 (dupa program)
|
|
echo ============================================================
|
|
echo.
|
|
echo Id client: %IDCLIENT%
|
|
echo DMP sursa: %DMPSURSA%
|
|
echo DMP tinta: %DMPDEST%
|
|
echo ROAUPDATE: %ROAUPDATE%
|
|
echo Export: %EXPORTDIR%
|
|
if "%REIMPORT%"=="1" (
|
|
echo CONTAFIN: SE REIMPORTA ^(drop user cascade^)
|
|
) else (
|
|
echo CONTAFIN: se pastreaza cel din faza 1
|
|
)
|
|
echo.
|
|
|
|
REM ---------------------------------------------------------------------------
|
|
REM [1/6] DMP-urile firmelor
|
|
REM ---------------------------------------------------------------------------
|
|
if not exist "%DMPSURSA%" (
|
|
echo [EROARE] Directorul sursa "%DMPSURSA%" nu exista.
|
|
exit /b 1
|
|
)
|
|
|
|
set /a TOTALDMP=0
|
|
for %%F in ("%DMPSURSA%\*.dmp") do set /a TOTALDMP+=1
|
|
if !TOTALDMP! EQU 0 (
|
|
echo [EROARE] Nu am gasit niciun fisier .dmp in "%DMPSURSA%".
|
|
exit /b 1
|
|
)
|
|
|
|
REM Kitul contine 2 sabloane: *contafin*.dmp si FIRMANOUA.dmp. Orice peste 2
|
|
REM sunt DMP-urile de firma ale clientului.
|
|
if !TOTALDMP! LEQ 2 (
|
|
echo [ATENTIE] In "%DMPSURSA%" sunt doar !TOTALDMP! fisiere DMP, adica doar
|
|
echo sabloanele. Faza 2 are rost doar cu DMP-urile firmelor.
|
|
echo Exporta-le de pe serverul vechi si pune-le acolo.
|
|
echo.
|
|
echo Continui oricum - pasul 05 va raporta ce lipseste.
|
|
echo.
|
|
)
|
|
|
|
if not exist "%DMPDEST%" mkdir "%DMPDEST%"
|
|
echo [1/6] Copiez %TOTALDMP% fisiere DMP in %DMPDEST% ...
|
|
copy /Y "%DMPSURSA%\*.dmp" "%DMPDEST%\" >nul
|
|
if errorlevel 1 (
|
|
echo [EROARE] Copierea DMP-urilor a esuat.
|
|
exit /b 1
|
|
)
|
|
icacls "%DMPDEST%" /grant "NT SERVICE\OracleServiceXE:(OI)(CI)F" /T >nul 2>&1
|
|
echo Gata.
|
|
|
|
REM ---------------------------------------------------------------------------
|
|
REM [2/6] Reimportul lui CONTAFIN_ORACLE (optional)
|
|
REM ---------------------------------------------------------------------------
|
|
echo.
|
|
if "%REIMPORT%"=="0" (
|
|
echo [2/6] Reimport CONTAFIN_ORACLE - sarit.
|
|
echo Foloseste /reimportcontafin daca intre faze s-au adaugat firme
|
|
echo sau s-au modificat nomenclatoare pe serverul vechi.
|
|
goto :pas_05
|
|
)
|
|
|
|
echo [2/6] Reimport CONTAFIN_ORACLE
|
|
echo Se sterge schema existenta si se importa cea din %DMPDEST%.
|
|
echo.
|
|
|
|
powershell.exe -ExecutionPolicy Bypass -NoProfile -File "%KIT%scripts\drop-contafin.ps1" -Force -KillSessions
|
|
if errorlevel 1 goto :esec_drop
|
|
|
|
echo.
|
|
echo 01-setup-database.ps1 (recreare user)
|
|
powershell.exe -ExecutionPolicy Bypass -NoProfile -File "%KIT%scripts\01-setup-database.ps1" -DmpDir "%DMPDEST%"
|
|
if errorlevel 1 goto :esec_01
|
|
|
|
echo.
|
|
echo 03-import-contafin.ps1
|
|
powershell.exe -ExecutionPolicy Bypass -NoProfile -File "%KIT%scripts\03-import-contafin.ps1" -DmpDir "%DMPDEST%"
|
|
set RC=!ERRORLEVEL!
|
|
if "!RC!"=="0" goto :dupa_03
|
|
if "!RC!"=="5" (
|
|
echo [INFO] Cod de iesire 5 - normal pentru Data Pump, se continua.
|
|
goto :dupa_03
|
|
)
|
|
echo [EROARE] 03-import-contafin.ps1 a iesit cu codul !RC!.
|
|
exit /b !RC!
|
|
|
|
:dupa_03
|
|
echo.
|
|
echo 04-create-synonyms-grants.ps1
|
|
powershell.exe -ExecutionPolicy Bypass -NoProfile -File "%KIT%scripts\04-create-synonyms-grants.ps1"
|
|
if errorlevel 1 goto :esec_04
|
|
|
|
:pas_05
|
|
REM ---------------------------------------------------------------------------
|
|
REM [3/6] Schemele de firma
|
|
REM ---------------------------------------------------------------------------
|
|
echo.
|
|
echo [3/6] 05-import-companies.ps1
|
|
powershell.exe -ExecutionPolicy Bypass -NoProfile -File "%KIT%scripts\05-import-companies.ps1" -DumpDirectory "%DMPDEST%" -DmpDir "%DMPDEST%"
|
|
if errorlevel 1 goto :esec_05
|
|
|
|
REM ---------------------------------------------------------------------------
|
|
REM [4/6] Reconfigurare post-import
|
|
REM ---------------------------------------------------------------------------
|
|
echo.
|
|
echo [4/6] 08-post-install-config.ps1 (reluare)
|
|
powershell.exe -ExecutionPolicy Bypass -NoProfile -File "%KIT%scripts\08-post-install-config.ps1" -CustomerId "%IDCLIENT%" -EmailSmtp "%SMTP%" -RoaUpdatePath "%ROAUPDATE%"
|
|
if errorlevel 1 goto :esec_08
|
|
|
|
REM ---------------------------------------------------------------------------
|
|
REM [5/6] schema.txt pentru exportul zilnic
|
|
REM ---------------------------------------------------------------------------
|
|
echo.
|
|
if "%FARASCHEMA%"=="1" (
|
|
echo [5/6] schema.txt - sarit ^(/faraschema^)
|
|
) else (
|
|
echo [5/6] 11-setup-backup-export.ps1 -SchemaOnly
|
|
powershell.exe -ExecutionPolicy Bypass -NoProfile -File "%KIT%scripts\11-setup-backup-export.ps1" -ExportPath "%EXPORTDIR%" -SchemaOnly
|
|
if errorlevel 1 (
|
|
echo [ATENTIE] Nu am putut regenera schema.txt. Exportul zilnic va
|
|
echo exporta lista veche. Reia cu:
|
|
echo Run.cmd 11-setup-backup-export.ps1 -SchemaOnly
|
|
)
|
|
)
|
|
|
|
REM ---------------------------------------------------------------------------
|
|
REM [6/6] Verificare
|
|
REM ---------------------------------------------------------------------------
|
|
echo.
|
|
echo [6/6] 07-verify-installation.ps1
|
|
powershell.exe -ExecutionPolicy Bypass -NoProfile -File "%KIT%scripts\07-verify-installation.ps1"
|
|
set RCVERIF=!ERRORLEVEL!
|
|
|
|
echo.
|
|
echo ============================================================
|
|
if "!RCVERIF!"=="0" (
|
|
echo FAZA 2 COMPLETA - verificarea a trecut integral.
|
|
) else (
|
|
echo FAZA 2 TERMINATA, DAR VERIFICAREA A SEMNALAT PROBLEME.
|
|
echo.
|
|
echo "N company schemas are missing" inseamna ca lipsesc DMP-urile
|
|
echo firmelor respective. Copiaza-le in %DMPDEST% si reia doar pasul 05:
|
|
echo Run.cmd 05-import-companies.ps1
|
|
)
|
|
echo ============================================================
|
|
echo.
|
|
echo INAINTE SA PLECI DE LA CLIENT:
|
|
echo.
|
|
echo 1. Pasul 08 a RECREAT joburile de actualizare, dezactivate.
|
|
echo Daca trebuie sa mearga, activeaza-le:
|
|
echo EXEC DBMS_SCHEDULER.ENABLE('CONTAFIN_ORACLE.UPDATEROA_ZILNIC');
|
|
echo EXEC DBMS_SCHEDULER.ENABLE('CONTAFIN_ORACLE.UPDATERTVAI_ZILNIC');
|
|
echo.
|
|
echo 2. Verifica oglinda de update: http://localhost/roaupdate/
|
|
echo.
|
|
echo 3. Ruleaza o data exportul, sa vezi ca scrie:
|
|
echo Start-ScheduledTask -TaskName "ROA Export Oracle"
|
|
echo.
|
|
echo 4. NU sterge FIRMANOUA.dmp din %DMPDEST% - e folosit la fiecare
|
|
echo firma noua, oricand pe viitor.
|
|
echo.
|
|
echo 5. Opreste serverul VECHI sau cel putin listener-ul, ca sa nu se
|
|
echo conecteze cineva din greseala la datele vechi.
|
|
echo.
|
|
|
|
endlocal & exit /b %RCVERIF%
|
|
|
|
REM ---------------------------------------------------------------------------
|
|
:esec_drop
|
|
echo [EROARE] Nu am putut sterge CONTAFIN_ORACLE. Faza 2 se opreste.
|
|
echo Verifica daca mai are sesiuni deschise:
|
|
echo SELECT sid, serial#, program FROM v$session WHERE username = 'CONTAFIN_ORACLE';
|
|
exit /b 1
|
|
:esec_01
|
|
echo [EROARE] 01-setup-database.ps1 a esuat. Faza 2 se opreste.
|
|
exit /b 1
|
|
:esec_04
|
|
echo [EROARE] 04-create-synonyms-grants.ps1 a esuat. Faza 2 se opreste.
|
|
exit /b 1
|
|
:esec_05
|
|
echo [EROARE] 05-import-companies.ps1 a esuat. Faza 2 se opreste.
|
|
exit /b 1
|
|
:esec_08
|
|
echo [EROARE] 08-post-install-config.ps1 a esuat. Faza 2 se opreste.
|
|
exit /b 1
|
|
|
|
:utilizare
|
|
echo.
|
|
echo Utilizare:
|
|
echo FAZA2.cmd ^<IdClient^> [optiuni]
|
|
echo.
|
|
echo Optiuni:
|
|
echo /reimportcontafin inlocuieste CONTAFIN_ORACLE cu cel din DMPDIR
|
|
echo /smtp:^<server^> server SMTP ^(implicit mail.romfast.ro^)
|
|
echo /roaupdate:^<cale^> radacina oglinzii ^(implicit D:\ROAUPDATE^)
|
|
echo /export:^<cale^> director export ^(implicit D:\ROA\EXPORT_ORADMP^)
|
|
echo /dmp:^<cale^> de unde se copiaza DMP-urile
|
|
echo /faraschema nu regenera schema.txt
|
|
echo.
|
|
echo Faza 2 se ruleaza DUPA FAZA1.cmd, cand utilizatorii au terminat de lucrat.
|
|
echo.
|
|
exit /b 2
|