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;   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} Podpinamy bibliotekę networkera do obsługi SBT_TAPE i oracle Zmieniamy environment na poprawny oraz logujemy się do rmana: Wykonujemy zamkniecie bazy danych: shutdown immediate; startup nomount CONFIGURE DEFAULT DEVICE TYPE TO 'SBT_TAPE'; CONFIGURE CHANNEL DEVICE TYPE 'SBT_TAPE' SEND 'NSR_ENV=(NSR_SERVER=snp2004.vm.local,NSR_CLIENT=ewe013.ewepl.local)'; CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE 'SBT_TAPE' TO 'ENTIADEV_CONTROLFILE_%F'; By odzyskać controlfile wyłączamy bazę i uruchamiamy jako nomount: ----------- Na serwerze skąd pobieramy dane: ---------- Łączymy się do odpowiedniej bazy poprzez rmana ponieważ: LIST BACKUP OF CONTROLFILE; I wybieramy ostatni 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'; } Wykonujemy teraz zmianę ID bazy na docelowym serwerze na ID bazy odwarzanej poprzez: SET DBID NRXXXXXX startup mount 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; Porównujemy ze ścieżkami docelowymi i ewentualnie wykonujemy zmiany dla datafiles 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; } 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 Wykonanie snapshotu maszyny Przygotowanie środowiska   Pobieranie odpowiedniego patcha : Należy zweryfikować jaki jest aktualny patch do bazy danych oracle oraz do aktualizatora środowiska (program Opatch).   Logujemy się na stronę supportu oracle  Po zalogowaniu się wybieramy "Patches & Updates"    Po prawej stronie wczyta nam się formularz, w którym musimy wybrać "Product or Family (Advanced)":    Na potrzeby tego poradnika wykorzystujemy silnik bazy oracle w wersji 19c, więc szukamy patcha "DATABASE", wypełniając jak poniżej:               Interesuje nas "COMBO OF OJVM COMPONENT + DB RU (Patch)", w tym przypadku do wersji 19.24                        Klikamy w numer, po tej akcji klikamy w "download"                      I na samym końcu w nazwę pliku by rozpocząć pobieranie. "OPatch" Aby znaleźć odpowiedni, najnowszy patch aplikacji "OPatch" wyszukiwanie ustawiamy w następujący sposób:         Klikamy w numer patcha po lewej stronie, otworzy nam się taki widok:             Klikamy download i pobieramy dany patch.   Wrzucanie patcha poprzez winscp do lokalizacji /install/oracle_patches   Pobrane wcześniej patche wrzucamy poprzez winscp do lokalizacji /install/oracle_patches. Do folderu "OPatch_repo" wrzucamy paczkę z OPatchem:   Natomiast do folderu "combo_RU_OJVM" patch docelowy dla db:           Zmiamy ownera paczek na oracle:oinstall, a następnie wykonujemy unzip patchy korzystając z konta "oracle"                                 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   Sprawdzamy ścieżkę do aktualnie wykorzystywanej aplikacji OPatch:                     przechodzimy do danej lokalizacji i usuwamy wszystkie pliki:                      Wykopiowanie nowego opatch do $ORACLE_HOME/Opatch z lokalizacji /install/Opatch                      Weryfikujemy poprawnosć aktualizacji poprzez komendę: opatch version             Wyłączamy bazy danych - Ważne należy zweryfikować wcześniej czy istnieje tylko jedna instancja, jeżeli nie wyłączamy każdą instancję :   sqlplus / as sysdba shutdown immediate;               Aktualizacja binariów oraz OJVM bazy/klienta:   Wchodzimy do katalogu patcha bazy danych, znajdują się tam dwa podkatalogi - jeden zawiera patch dla OJVM, a drugi to patch dla samej DB. Należy wejść do każdego katalogu z danym patchem i wykonać poniższą komendę:  opatch apply         Log który nam się wyświetla warto wyświetlić drugim połączeniem poprzez tail -f "ścieżka"                                       Jeżeli wszystko jest w porządku zgadzamy się wpisując "y" i zatwierdzamy enterem Potwierdzamy także wyłączenie wszystkich instancji bazy danych: Opatch powinien rozpocząć patchowanie: Po poprawnym wykonaniu aktualizacji otrzymamy komunikat : OPatch succeded.                     4. Weryfikacja aktualizacji  Startujemy bazę podczas logowania widać już wersję bazy danych podniesioną do 19.24: sqlplus / as sysdba startup           Uruchamiamy Listenera poprzez lsnrctl start Weryfikujemy status listenera poprzez lsnrctl status Należy odczekać około minuty :           Po tych działaniach mamy zaktualizowną baze danych, OJVM jak i aktualizator OPatch i możemy przejść do aktualizacji danych: Przechodzimy do katalogu OPatcha: 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ć Poniższe kroki wykonujemy każdorazowo dla wszystkich instancji! Uruchamiamy polecenie datapatch ./datapatch --verbose Patche powinny zacząć się instalować:  W razie bezproblemowej aktualizacji output powinien wyglądać tak : 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:  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; Uruchamiany :  @?/rdbms/admin/utlrp.sql output który powinniśmy zobaczyć to : W razie problemów ze z którymś modułem: Np dla modułu XDB uruchamiamy walidację: exec DBMS_REGXDB.VALIDATEXDB; Może się zdarzyć że schema SYS zablokowała wszystkie statystyki - odblokowujemy za pomocą: exec dbms_stats.unlock_schema_stats('SYS'); 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 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 : Output w momencie gdy pliki są poprawne: 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; 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: 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; Sprawdzamy aktualne parametry processów: show parameter processes; Sprawdzemy aktualne parametry transakcji: show parameter transactions; 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; Włączanie logowania transakcji do plików alter database force logging; Wyłączanie logowania do plików alter database no force logging;