Pages

Thursday, August 17, 2023

Rebuild Indexes Online. Generate script per schema

Non Partitioned indexes
--gen_rebuild_indexes_online.sql
COL sql_cmd FOR A120
SET LINESIZE 140
SET PAGESIZE 0
SET HEADING OFF
SET FEEDBACK OFF
SET VERIFY OFF
SET ECHO OFF
SET NEWPAGE NONE
SET SHOW OFF
SET TRIMSPOOL ON

spool rebuild_indexes_online.sql
PROMPT COL sql_cmd FOR A120
PROMPT SET LINESIZE 140
PROMPT SET PAGESIZE 0
PROMPT SET HEADING OFF
PROMPT SET FEEDBACK OFF
PROMPT SET VERIFY OFF
PROMPT SET ECHO OFF
PROMPT SET NEWPAGE NONE
PROMPT SET SHOW OFF
PROMPT SET TRIMSPOOL ON

SELECT 'PROMPT Handle '||table_name||'.'||index_name||CHR(10)|| 'ALTER INDEX '||index_name||' REBUILD ONLINE;' as sql_cmd
FROM 
(
SELECT index_name, table_name FROM USER_INDEXES WHERE index_name IN
 (
 SELECT index_name 
   FROM USER_INDEXES WHERE index_type = 'NORMAL' AND partitioned='NO'
 MINUS
 (
          SELECT constraint_name FROM USER_CONSTRAINTS WHERE constraint_type = 'U' AND deferrable = 'DEFERRABLE'
   UNION  SELECT 'SFI_CUSTOMER_PROFILE_PK' FROM DUAL
   UNION  SELECT 'SCP_MSISDN_IDX' FROM DUAL
  )
 )
ORDER BY table_name
);
--Check status
SELECT 'PROMPT ======================' FROM DUAL;
SELECT 'PROMPT Check Non-Pertitioned Indexes Status After Non-Pertitioned Indexes Rebuild' FROM DUAL;
SELECT 'PROMPT ======================' FROM DUAL;
SELECT 'SELECT table_name, index_name, status FROM USER_INDEXES WHERE partitioned=''NO'' AND status NOT IN ( ''VALID'', ''N/A'');' FROM DUAL;
SELECT 'PROMPT ======================' FROM DUAL;
SELECT 'PROMPT Finished Non-Pertitioned Indexes Rebuild' FROM DUAL;
SELECT 'PROMPT ======================' FROM DUAL;
SELECT 'EXIT;' FROM DUAL;
spool off;
EXIT;


Partitioned indexes
--gen_rebuild_part_indexes_online.sql
COL sql_cmd FOR A120
SET LINESIZE 140
SET PAGESIZE 0
SET HEADING OFF
SET FEEDBACK OFF
SET VERIFY OFF
SET ECHO OFF
SET NEWPAGE NONE
SET SHOW OFF
SET TRIMSPOOL ON

spool rebuild_part_indexes_online.sql
PROMPT COL sql_cmd FOR A120
PROMPT SET LINESIZE 140
PROMPT SET PAGESIZE 0
PROMPT SET HEADING OFF
PROMPT SET FEEDBACK OFF
PROMPT SET VERIFY OFF
PROMPT SET ECHO OFF
PROMPT SET NEWPAGE NONE
PROMPT SET SHOW OFF
PROMPT SET TRIMSPOOL ON

SELECT 'PROMPT Handle '||table_name||'.'||index_name||' partition '||partition_name||CHR(10)|| 'ALTER INDEX '||index_name||' REBUILD PARTITION '||partition_name||' ONLINE;' as sql_cmd
FROM 
(
SELECT table_name, UI.index_name, UIP.partition_name  
  FROM USER_INDEXES UI,
       USER_IND_PARTITIONS UIP
 WHERE UI.index_name = UIP.index_name
   AND UI.index_name IN
 (
 SELECT index_name FROM USER_INDEXES WHERE index_type = 'NORMAL'  AND partitioned='YES'
 MINUS
 (        SELECT constraint_name FROM USER_CONSTRAINTS WHERE constraint_type = 'U' AND deferrable = 'DEFERRABLE'
   UNION  SELECT 'SFI_CUSTOMER_PROFILE_PK' FROM DUAL
   UNION  SELECT 'SCP_MSISDN_IDX' FROM DUAL
  )
 )
ORDER BY table_name
);
--Check status
SELECT 'PROMPT ======================' FROM DUAL;
SELECT 'PROMPT Check Pertitioned Indexes Status After Pertitioned Indexes Rebuild' FROM DUAL;
SELECT 'PROMPT ======================' FROM DUAL;
SELECT 'SELECT UI.table_name, UI.index_name, UIP.partition_name, UIP.status 
        FROM USER_INDEXES UI, USER_IND_PARTITIONS UIP
WHERE UI.partitioned=''YES'' AND UIP.index_name = UI.index_name AND UIP.status NOT IN ( ''USABLE'')
UNION ALL 
SELECT UI.table_name, UI.index_name,NULL, UI.status 
        FROM USER_INDEXES UI
WHERE UI.partitioned=''YES'' AND UI.status NOT IN ( ''VALID'', ''N/A'')
;' FROM DUAL;

SELECT 'PROMPT ======================' FROM DUAL;
SELECT 'PROMPT Finished Non-Pertitioned Indexes Rebuild' FROM DUAL;
SELECT 'PROMPT ======================' FROM DUAL;
SELECT 'EXIT;' FROM DUAL;
spool off;
EXIT;

To manually execute generated files:
@rebuild_indexes_online.sql
@rebuild_part_indexes_online.sql

Bash script
#!/bin/bash
#. /etc/sh/orash/oracle_login.sh igt
#. ~oracle/.set_oracle_env
USER_NAME=$1
USER_PASS=$2
ORA_INST=$3

WORK_DIR=`pwd`

LOG_NAME='rebuild_indexes.log'
LOG_FILE=${WORK_DIR}/${LOG_NAME}
RUN_DATE=`date "+%Y%m%d"_"%H%M"`

echo "Start Indexes Rebuild at $RUN_DATE" >> ${LOG_FILE}
echo "Schema Details: ${USER_NAME}/${USER_PASS}" >> ${LOG_FILE}

sqlplus -s ${USER_NAME}/${USER_PASS}@${ORA_INST} @gen_rebuild_indexes_online.sql
sqlplus -s ${USER_NAME}/${USER_PASS}@${ORA_INST} @gen_rebuild_part_indexes_online.sql
sqlplus -s ${USER_NAME}/${USER_PASS}@${ORA_INST} @rebuild_indexes_online.sql
sqlplus -s ${USER_NAME}/${USER_PASS}@${ORA_INST} @rebuild_part_indexes_online.sql
echo "Finished Indexes Rebuild at $RUN_DATE" >> ${LOG_FILE}
echo "" >> ${LOG_FILE}

Bash wrapper script
#!/bin/bash
. /etc/sh/orash/oracle_login.sh igt

WORK_DIR=`pwd`

USER_NAME=SOME_USER
USER_PASS=SOME_PASS
ORA_INST=igt

./main_rebuild_indexes.sh ${USER_NAME} ${USER_PASS} ${ORA_INST}

Wednesday, August 16, 2023

ORA-12514: TNS:listener does not currently know of service requested in connect descriptor

Error:
ORA-12514: TNS:listener does not currently know of service requested in connect descriptor

tnsping is working
tnsping igt
TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 16-AUG-2023 12:46:17
Copyright (c) 1997, 2020, Oracle.  All rights reserved.
Used parameter files:
/software/oracle/1910/network/admin/sqlnet.ora

Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.90.98)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = igt)))
OK (0 msec)

but sqlplus gives error:
oracle@qarec-1-aps01:/software/oracle/1910>% sqlplus a/a@igt
SQL*Plus: Release 19.0.0.0.0 - Production on Wed Aug 16 12:46:33 2023
Version 19.10.2.0.0
Copyright (c) 1982, 2020, Oracle.  All rights reserved.
ERROR:
ORA-12514: TNS:listener does not currently know of service requested in connect descriptor

What to check
/software/oracle/122/network/admin/listener.ora
/software/oracle/122/network/admin/tnsnames.ora
/etc/hosts
lsnrctl status

Many things can be defined wrongly...
hostname can be configured to a wrong IP, port 1521 can be closed, and more...


telnet qarec-1-aps01 1521
Trying 10.10.90.88...
telnet: connect to address 10.10.90.88: No route to host

lsnrctl status
LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 16-AUG-2023 12:47:58
Copyright (c) 1991, 2020, Oracle.  All rights reserved.
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
TNS-12543: TNS:destination host unreachable
 TNS-12560: TNS:protocol adapter error
  TNS-00513: Destination host unreachable
   Linux Error: 113: No route to host


In this case
/etc/hosts had a wrong IP for server qarec-1-aps01

listener.ora was configured with HOST = qarec-1-aps01, but tnsnames.ora with HOST = 10.10.90.98.

tnsping worked, it was using 
tnsnames.ora with a correct IP
sqlplus failed, it was using listener.ora with HOST = qarec-1-aps01, which got translated to a wrong IP address in /etc/hosts

Thursday, August 10, 2023

ORA-00257: Archiver error. Connect AS SYSDBA only until resolved.

ORA-00257: Archiver error. Connect AS SYSDBA only until resolved.
df -hP

Archive destination /oracle_db/db2 is 100% full

Need to delete some archive files + run RMAN backup

Once /oracle_db/db2 has space, issue 

ALTER SYSTEM SWITCH LOGFILE;

/dev/mapper/OraVG02-OraVol03   200G  25M  200G   100% /oracle_db/db2


To delete old archive files:
rman target /
DELETE OBSOLETE;
or
DELETE FORCE COPY OF ARCHIVELOG ALL;

once there is space, issue
ALTER SYSTEM SWITCH LOGFILE;


/dev/mapper/OraVG02-OraVol03   200G   33M  200G   1% /oracle_db/db2