Oracle DB


Formatowanie tabeli wyników w CLI SQL*PLUS

Komendy wpisujemy w aktualnym oknie SQL*Plus, ustawienia są aktywne tylko per sesja. W razie potrzeby stałe ustawienia należy wpisać do qlogin.sql.

Ustawianie szerokości linii:

Jeżeli chcemy ustawić maksymalną liczbę znaków wyświetlanych w jednym wierszu wyników, używamy polecenia:

SET LINESIZE 500
Liczba wierszy na stronę:

SQL*Plus domyślnie powtarza nagłówki tabeli co pewną liczbę wierszy. Możemy to kontrolować za pomocą:

SET PAGESIZE 100
Formatowanie kolumn - szerokość komuny
COLUMN [NAZWAKOLUMNY] FORMAT A52
COLUMN [NazwaKolumnyLiczbowej] FORMAT 999999

FORMAT AXX - Oznacza ilość znaków w nazwie kolumny
FORMAT XXXXXXX (numery) - Oznacza ilość wyświetlonych znaków liczb.

Zmiana nazw nagłówków kolumn

Jeżeli chcemy, aby kolumny miały czytelniejsze bądź inne nagłówki, możemy użyć:

COLUMN [NazwaKolumny] HEADING '[DocelowaNazwyKolumny]'
Alias dla kolumn - formatowanie poprzez AS

Jeżeli chcemy zmienić nazwę kolumny bez ingerencji w nagłówki, możemy użyć aliasu w zapytaniu:

SELECT 
    [NazwaKolumny] AS "DocelowaNazwaKolumny",
    [NazwaKolumny_w_Bajtach]/1024/1024 AS "NazwaKolumny_W_MB",
FROM [NazwaTabeli];

[NazwaKolumny_w_Bajtach]/1024/1024 AS "NazwaKolumny_W_MB" - oznakowanie /1024/1024 wskazuje podwójne podzielenie wartości bajtów poprzez 1024 co daje najpierw kilobajty a później megabajty.

Wyłączenie nagłówków co każdą stronę

Przy większych wynikach, co 10 wierszy SQL*Plus dodaje nagłówki kolumn, co może przeszkadzać w diagnostyce:

SET HEADING ON
SET FEEDBACK OFF
Usuwanie zbędnych "białych" znaków

SQL*Plus domyślnie dodaje spacje na końcu wierszy i używa tabulatorów. Możemy to wyłączyć:

SET TRIMSPOOL ON
SET TAB OFF
Konwersja typu danych

Jest używany, gdy chcemy jawnie określić typ danych kolumny, np. wymusić określoną długość tekstu dla danych typu varchar

CAST(wyrażenie AS nowy_typ)

Dla ułatwienia można przyjąć że wyrażenie to nazwa kolumny, przykład:

CAST(FILE_NAME AS VARCHAR2(52)) AS "Sciezka do pliku"
Pobieranie części tekstu - ucinanie tekstu

Jest używany gdy chcemy całkowicie uciąć kawałek pobieranego tekstu

SUBSTR(tekst, pozycja_startowa, liczba_znaków)

Przykład:

SUBSTR(FILE_NAME, 1, 20) AS "Sciezka do Pliku"
Konwersja liczb i dat na tekst

Jest używany gdy chcemy przekonwertować dany wynik liczbowy na tekst (np. dodać do niego końcówkę jednostki bądź spację)

TO_CHAR(wyrażenie, 'format')

Przykład:

TO_CHAR(bytes/1024/1024, '999999') AS "Size (MB)"

Zmiana separatora kolumn w wynikach

SET COLSEP 'znak'

Przykład: 

SET COLSEP ' | '
Przykład wykorzystania formatowania wyników:
SET LINESIZE 500
SET PAGESIZE 50
SET TRIMSPOOL ON
SET TAB OFF
SET WRAP OFF
SET COLSEP ' | '

COLUMN FILE_PATH FORMAT A52 HEADING 'Sciezka do pliku'
COLUMN SIZE_MB FORMAT 999999 HEADING 'Rozmiar pliku w MB'
COLUMN MAX_SIZE_MB FORMAT 999999 HEADING 'Maksymalny rozmiar pliku w MB'
COLUMN AUTO_EXTEND FORMAT A10 HEADING 'Automatyczne powiekszenie pliku'

SELECT 
    CAST(FILE_NAME AS VARCHAR2(52)) AS "Sciezka do pliku",  
    bytes/1024/1024 AS "Rozmiar pliku w MB",
    maxbytes/1024/1024 AS "Maksymalny rozmiar pliku w MB",
    CAST(autoextensible AS VARCHAR2(25)) AS "Automatyczne powiekszenie pliku"
FROM dba_data_files;

 

image.png


Podłączanie się do backupów networkera i odtworzenie na innym hoście

Podpinamy nowy channel do połączenia się z serwerem networkera. 

Jako że RMAN nie widzi połączeń sieciowych, będziemy poprzez bibliotekę media library udawali urządzenie SBT TAPE

Najpierw podmieniamy ID bazy danych na tą z docelowego odtworzenia (baza o docelowej nazwie musi istnieć na serwerze docelowym - nawet pusta):

Przed włączeniem rmana:

export NLS_DATE_FORMAT="DD-MM-YYYY HH24:MI:SS"
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/lib64/:${LD_LIBRARY_PATH}

image.png

Podpinamy bibliotekę networkera do obsługi SBT_TAPE i oracle
Zmieniamy environment na poprawny oraz logujemy się do rmana:

image.png

Wykonujemy zamkniecie bazy danych:

shutdown immediate;

image.png

startup nomount

image.png

CONFIGURE DEFAULT DEVICE TYPE TO 'SBT_TAPE';

image.png

CONFIGURE CHANNEL DEVICE TYPE 'SBT_TAPE' SEND 'NSR_ENV=(NSR_SERVER=snp2004.vm.local,NSR_CLIENT=ewe013.ewepl.local)';

image.png

CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE 'SBT_TAPE' TO 'ENTIADEV_CONTROLFILE_%F';

image.png

By odzyskać controlfile wyłączamy bazę i uruchamiamy jako nomount:

image.png

----------- Na serwerze skąd pobieramy dane: ----------

Łączymy się do odpowiedniej bazy poprzez rmana ponieważ:

LIST BACKUP OF CONTROLFILE;

I wybieramy ostatni

image.png

RUN {
ALLOCATE CHANNEL CH1 TYPE 'SBT_TAPE';
SEND 'NSR_ENV=(NSR_SERVER=snp2004.vm.local,
          NSR_CLIENT=ewe013.ewepl.local)';
SET CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE 'SBT_TAPE' TO 'ENTIADEV_CONTROLFILE_%F';
RESTORE CONTROLFILE FROM 'ENTIADEV_mv3ccnce_1_1';
}

image.png

Wykonujemy teraz zmianę ID bazy na docelowym serwerze na ID bazy odwarzanej poprzez:
SET DBID NRXXXXXX

image.png

startup mount

image.png

Jeżeli ścieżki różnią się pomiędzy serwerami - wykonujemy sprawdzenie na serwerze źródłowym:

SELECT * 
FROM DBA_DATA_FILES
ORDER BY FILE_ID;

image.png

Porównujemy ze ścieżkami docelowymi i ewentualnie wykonujemy zmiany dla datafiles

image.png

RUN {
  # Ustaw punkt w czasie, do którego chcemy przywrócić
  SET UNTIL TIME "TO_DATE('2024-12-11:06:00:00', 'yyyy-mm-dd:hh24:mi:ss')";

  # Mapowanie starych plików na nowe lokalizacje
  SET NEWNAME FOR DATAFILE 1 TO '/oracle/db/entiadev/oradata/ENTIADEV/SYSTEM.DBF';
  SET NEWNAME FOR DATAFILE 2 TO '/oracle/db/entiadev/oradata/ENTIADEV/SYSAUX.DBF';
  SET NEWNAME FOR DATAFILE 3 TO '/oracle/db/entiadev/oradata/ENTIADEV/UNDOTBS1.DBF';
  SET NEWNAME FOR DATAFILE 4 TO '/oracle/db/entiadev/oradata/ENTIADEV/USERS.DBF';
  SET NEWNAME FOR DATAFILE 5 TO '/oracle/db/entiadev/oradata/ENTIADEV/RAN.DBF';
  SET NEWNAME FOR DATAFILE 6 TO '/oracle/db/entiadev/oradata/ENTIADEV/KOLEKTOR.DBF';
  SET NEWNAME FOR DATAFILE 7 TO '/oracle/db/entiadev/oradata/ENTIADEV/KOLEKTOR_SMS.DBF';
  SET NEWNAME FOR DATAFILE 8 TO '/oracle/db/entiadev/oradata/ENTIADEV/KOLEKTOR_DD.DBF';
  SET NEWNAME FOR DATAFILE 9 TO '/oracle/db/entiadev/oradata/ENTIADEV/PROGNOZY.DBF';
  SET NEWNAME FOR DATAFILE 9 TO '/oracle/db/entiadev/oradata/ENTIADEV/KOLEKTOR_KEYCLOAK.DBF';

  # Przywrócenie bazy danych
  RESTORE DATABASE;
  
  #Zmiana nazw na poprawne
  SWITCH DATAFILE ALL;

  # Odtworzenie bazy danych i usunięcie archiwalnych logów
  RECOVER DATABASE;

  RELEASE CHANNEL CH1;
}

image.png

image.png

Na tym etapie mamy odtworzone datafile należy więc zrecoverować baze:
SET UNTIL TIME oczywiście zmieniamy

RUN {
  # Ustaw punkt w czasie, do którego chcemy odtworzyć bazę danych
  SET UNTIL TIME "TO_DATE('2024-12-11 06:00:00', 'yyyy-mm-dd hh24:mi:ss')";

  # Odtworzenie bazy danych z logów archiwalnych do wskazanego punktu
  RECOVER DATABASE;

  # Ustawienie nowych nazw plików danych (jeśli były zmieniane w czasie restore)
  SWITCH DATAFILE ALL;

  # Opcjonalne otwarcie bazy w trybie RESETLOGS
  ALTER DATABASE OPEN RESETLOGS;
}

Tworzenie nowej instancji bazy danych W DB Oracle w ver >19

Weryfikacja uprawnień w katalogach /oracle/db/ (775)

Oraz weryfikacja uprawnień dla katalogu /tmp (1777)

Do zmiany będziemy potrzebować program xming oraz putty z skonfigurowanym X11 forwarding.

 

Zalogowanie bezpośrednio na serwer, za pomocą konta oracle jest wymagane dla dobrego przepięcia zmiennej display i możliwości uruchamiania aplikacji graficznych poprzez ssh.

Po zalogowaniu wywołałem Database Configuration Assistant, poprzez komendę dbca





Zweryfikowanie nazwy bazy danych na aktualnie działającym systemie :



Database name oraz sid został zapisany małymi literami, by zgadzał sie z punktami montowania na serwerze. Zrzut jest sprzed tej zmiany.


Utworzenie dwóch sekretów w Secret Serverze oraz wypełnienie okna :


 

EWE013 - DB - ENTIADEV - system

EWE013 - DB - ENTIADEV - sys

 


 











Usunięcie plików redologów, ponieważ w późniejszych krokach utworzę ję z komend SQL:


I utworzonie tymczasowych redologów o numerach 15 i 16


Zmiana wielkości redologów na 100MB



 

Po pomyślnym zainstalowaniu bazy danych, połączyłem się sqldeveloperem do instancji entiadev by dodać prawidłowe pliki redologów:

 

ALTER DATABASE
ADD LOGFILE GROUP 1 ('/oracle/db/entiadev/redoA/redo_g01m1.log', '/oracle/db/entiadev/mredoA/redo_g01m2.log')
SIZE 100M;

ALTER DATABASE
ADD LOGFILE GROUP 2 ('/oracle/db/entiadev/redoB/redo_g02m1.log', '/oracle/db/entiadev/mredoB/redo_g02m2.log')
SIZE 100M;

ALTER DATABASE
ADD LOGFILE GROUP 3 ('/oracle/db/entiadev/redoA/redo_g03m1.log', '/oracle/db/entiadev/mredoA/redo_g03m2.log')
SIZE 100M;

ALTER DATABASE
ADD LOGFILE GROUP 4 ('/oracle/db/entiadev/redoB/redo_g04m1.log', '/oracle/db/entiadev/mredoB/redo_g04m2.log')
SIZE 100M;

ALTER DATABASE
ADD LOGFILE GROUP 5 ('/oracle/db/entiadev/redoA/redo_g05m1.log', '/oracle/db/entiadev/mredoA/redo_g05m2.log')
SIZE 100M;

ALTER DATABASE
ADD LOGFILE GROUP 6 ('/oracle/db/entiadev/redoB/redo_g06m1.log', '/oracle/db/entiadev/mredoB/redo_g06m2.log')
SIZE 100M;

 


Oraz usunąć „dummy” pliki redologów potrzebnych do instalacji:

SELECT GROUP#, MEMBER, STATUS FROM V$LOGFILE;

ALTER DATABASE DROP LOGFILE GROUP 15;
ALTER DATABASE DROP LOGFILE GROUP 16;

Weryfikacja czy zostały tylko grupy 1-6:

Dla większej czytelności prompta sql, do pliku glogin.sql dodałem :

Dodałem także dodatkowe tablespace o którym była mowa w zgłoszeniu :
https://servicedesk.all-for-one.com/servicecase/881538

CREATE TABLESPACE RAN
DATAFILE '/oracle/db/entiadev/oradata/ENTIADEV/datafile/RAN.dbf' SIZE 1600M;

CREATE TABLESPACE KOLEKTOR
DATAFILE '/oracle/db/entiadev/oradata/ENTIADEV/datafile/KOLEKTOR.dbf' SIZE 1900M;

CREATE TABLESPACE KOLEKTOR_SMS
DATAFILE '/oracle/db/entiadev/oradata/ENTIADEV/datafile/KOLEKTOR_SMS.dbf' SIZE 300M;

CREATE TABLESPACE KOLEKTOR_DD
DATAFILE '/oracle/db/entiadev/oradata/ENTIADEV/datafile/KOLEKTOR_DD.dbf' SIZE 1600M;


 

Oracle - Aktualizacja silnika bazy danych oraz klienta

  1. Wykonanie snapshotu maszyny
  2. Przygotowanie środowiska
     

Należy zweryfikować jaki jest aktualny patch do bazy danych oracle oraz do aktualizatora środowiska (program Opatch).

 


 


 

            image.png

 

                   image.png

 

                   image.png

"OPatch"

        image.png

 Wrzucanie patcha poprzez winscp do lokalizacji /install/oracle_patches
 

         image.png

         image.png

         image.png

         image.png 

  1. Aktualizacja Środowiska:

Aktualizacja OPatch oraz binariów dotyczy zarówno klienta jak i bazy danych Oracle. Aktualizacje i rekompilacje danych (datapatch) wykonuje się tylko dla bazy danych Oracle.

Aktualizacja OPatch

 

Usunięcie starego OPatch - rm -rf * z lokalizacji $ORACLE_HOME/OPatch
 

                   image.png

                   image.png

                  image.png

 

         image.png

 

             image.png

Aktualizacja binariów oraz OJVM bazy/klienta:
 

        image.png

                  image.png

                  image.png

 



                   image.png

4. Weryfikacja aktualizacji 

sqlplus / as sysdba
startup

        image.png 


image.png

          image.png

Po tych działaniach mamy zaktualizowną baze danych, OJVM jak i aktualizator OPatch i możemy przejść do aktualizacji danych:

Przechodzimy do katalogu OPatcha:

image.png

Na niektórych serwerach może być zainstalowane więcej niż jedna instancja! Przełączenie między instancjami odbywa się za pomocą polecenia: 

. oraenv

Po wykonaniu polecenia zobaczymy w nawiasach kwadratowych aktualnie wybraną instancje. Zmiana instancji następuje poprzez wpisanie nazwy instancji, na którą chcemy się przełączyć

image.png

Poniższe kroki wykonujemy każdorazowo dla wszystkich instancji!

Uruchamiamy polecenie datapatch

./datapatch --verbose

image.png

Patche powinny zacząć się instalować: 

image.png

W razie bezproblemowej aktualizacji output powinien wyglądać tak :

image.png

Po poprawnym patchowaniu danych logujemy się do bazy danych poprzez:

sqlplus / as sysdba

i weryfikujemy czy wszystkie komponenty są VALID:

select comp_name,version,status from dba_registry where STATUS <> 'VALID';

Bezproblemowy output powinien wyglądać tak: 

image.png

Należy też zweryfikować wersję:

col comp_id for a10
col VERSION_FULL for a12
col STATUS for a10
col MODIFIED for a21
SELECT comp_ID, version_full, status, modified FROM DBA_REGISTRY;

image.png

Uruchamiany : 

@?/rdbms/admin/utlrp.sql

output który powinniśmy zobaczyć to :

image.png

W razie problemów ze z którymś modułem:

image.png

image.png

Np dla modułu XDB uruchamiamy walidację:

exec DBMS_REGXDB.VALIDATEXDB;

image.png

Może się zdarzyć że schema SYS zablokowała wszystkie statystyki - odblokowujemy za pomocą:

exec dbms_stats.unlock_schema_stats('SYS');

image.png

Oraz uruchamiamy ponownie:

exec DBMS_REGXDB.VALIDATEXDB;
@?/rdbms/admin/utlrp.sql

Na koniec ustawiamy z poziomu konta z uprawnieniami roota poprawne uprawnienia dla extjob (aktualizacje może je zmienić, więc lepiej wykonać dla pewności poniższe komendy):

chown root $ORACLE_HOME/bin/extjob
chmod 4750 $ORACLE_HOME/bin/extjob

image.png

RMAN - Walidacja oraz wyczyszczenie archiwizacji logów

By sprawdzić aktualnie dostępne archiwa logów wykonujemy komendę: 

CROSSCHECK ARCHIVELOG ALL;

Przykładowy output, w momencie braku odpowiednich plików :

image.png

Output w momencie gdy pliki są poprawne:

image.png

By wyczyścić uszkodzone / brakujące pliki logów z działań RMAN'a należy najpierw zweryfikować istnienie ich komendą powyżej, a później wykonać komendę: 

DELETE EXPIRED ARCHIVELOG ALL;

image.pngimage.png

Po weryfikacji, RMAN spyta o usunięcie z aktywnych jobów, wskazane obiekty : 

Zgadzamy się, wpisując "y", następnie RMAN usuwa obiekty z listy:

image.png

Zwiększenie parametru inicjalizującego "PROCESSES"

Weryfikacja parametrów startowych

Łączymy się do bazy z poziomu usera oracle:

sqlplus / as sysdba

Dla pewności przed tymi zmianami zapisujemy plik startowy SPFILE z aktualnie działającej konfiguracji

CREATE SPFILE FROM PFILE; 
exit;

Wyłączamy listener z poziomu basha:

 lsnrctl stop NazwaListenera

Logujemy się z powrotem do bazy: 

  sqlplus / as sysdba

Sprawdzamy aktualne parametry sesji:   

show parameter sessions;

image.png

Sprawdzamy aktualne parametry processów:

show parameter processes;

image.png

Sprawdzemy aktualne parametry transakcji:

show parameter transactions;

image.png

Ważne jest by w momencie powiększenia parametrów maksymalnej ilości procesów ("PROCESSES") Powiększyć także parametry powiązane: "sessions oraz "transactions"

   Parametry oblicza się następująco:

processes=x
sessions=x*1.1+5
transactions=sessions*1.1

Gdzie X to liczba procesów jaką chcemy wpisać w konfigurację

Edycja parametrów startowych   

Parametry startowe nie mogą być zmienione na działającej bazie (online), zapisuje się je do pliku startowego spfile po czym restartuje bazę

alter system set processes=LiczbaProcesów scope=spfile;
alter system set sessions=LiczbaSesji scope=spfile;
alter system set transactions=LiczbaTransakcji scope=spfile;
shutdown immediate;   
startup

Uruchamiamy listener z poziomu basha:

lsnrctl start NazwaListenera

Włączanie / wyłączanie zapisywania transakcji do plików redolog.

Wszystkie komendy uruchamiamy z SQL*Plus zalogowanym kontem jako sysdba

Sprawdzenie parametrów logowania
select name,force_logging from v$database;

image.png

Włączanie logowania transakcji do plików

alter database force logging;

Wyłączanie logowania do plików

alter database no force logging;