\connect mydatabase analyze verbose myschema.mytable;Documentation here
Minimalistic Oracle contains a collection of practical examples from my encounters with Oracle technologies. When relevant, I also write about other technologies, like Linux or PostgreSQL. Many of the posts starts with "how to" since they derive directly from my own personal experience. My goal is to provide simple examples, so that they can be easily adapted to other situations.
Wednesday, September 8, 2021
How to analyze a table in PostgreSQL
Just like Oracle, PostgreSQL stores statistics about the tables in an internal table called pg_statistics. This is used by the query planner to determine the most efficient execution path.
To gather fresh statistics on a table, use the following simple syntax:
Thursday, August 26, 2021
What is vacuuming in PostgreSQL and how do I vacuum a table?
Under the headline "Vacuuming Basics" in the PostgreSQL documentation, you can read amongst other things:
Further explaination can be found together with the syntax schema for VACUUM:
VACUUM reclaims storage occupied by dead tuples.
In normal PostgreSQL operation, tuples that are deleted or obsoleted by an update are not physically removed from their table; they remain present until a VACUUM is done. Therefore it's necessary to do VACUUM periodically, especially on frequently-updated tables.
Vacuum a specific table in verbose mode:
PostgreSQL's VACUUM command has to process each table on a regular basis for several reasons:
Each of these reasons dictates performing VACUUM operations of varying frequency and scope,
* To recover or reuse disk space occupied by updated or deleted rows. * To update data statistics used by the PostgreSQL query planner. * To update the visibility map, which speeds up index-only scans. * To protect against loss of very old data due to transaction ID wraparound or multixact ID wraparound.
Each of these reasons dictates performing VACUUM operations of varying frequency and scope,
Further explaination can be found together with the syntax schema for VACUUM:
VACUUM reclaims storage occupied by dead tuples.
In normal PostgreSQL operation, tuples that are deleted or obsoleted by an update are not physically removed from their table; they remain present until a VACUUM is done. Therefore it's necessary to do VACUUM periodically, especially on frequently-updated tables.
Vacuum a specific table in verbose mode:
psql mydb You are now connected to database "mydb" as user "postgres".
vacuum (verbose, analyze) myschema.mytable;
Friday, August 20, 2021
How to fetch first n rows only in PostgreSQL
The equivalent of oracles "fetch first n rows only" for postgreSQL is:
select * from myschema.mytable limit 10;If you want to select the coming next 20 rows, but skip the rows you already selected first time, use the keyword OFFSET:
select * from myschema.mytable limit 20 offset 10;The PostgreSQL 11 documentation for this feature can be found here
Wednesday, August 18, 2021
Solution for no ocijdbc18 in java.library.path when using sqlcl
sqlnet.ora:
tnsnames.ora
Using tnsping:
My experience is that sqlcl doesn't seem to accept multiple tnsnames.ora aliases.
Solution: Split up the tnsnames.ora entry in two different entries.
Change it from
to
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT) NAMES.DEFAULT_DOMAIN = oric.no
testdb01,testdb01.oric.no = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = testserver.oric.no)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = testdb01) ) )
Using tnsping:
C:\>tnsping testdb01
TNS Ping Utility for 64-bit Windows: Version 19.0.0.0.0 - Production on 17-AUG-2021 12:42:14
Used parameter files:
C:\app\client\vegard\network\admin\sqlnet.ora
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = testserver.oric.no)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = testdb01)))
OK (40 msec)
Using sqlplus:
C:\>sqlplus system/mypassword@testdb01 SQL*Plus: Release 19.0.0.0.0 - Production on Tue Aug 17 12:39:47 2021 Version 19.3.0.0.0 Last Successful login time: Tue Aug 17 2021 12:36:35 +02:00 Connected to: Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production Version 18.14.0.0.0Using sqlcl:
C:\>sql.exe system/mypassword@testdb01 SQLcl: Release 19.2.1 Production on Tue Aug 17 12:44:36 2021 Copyright (c) 1982, 2021, Oracle. All rights reserved. USER = system URL = jdbc:oracle:oci8:@testdb01 Error Message = no ocijdbc18 in java.library.path USER = system URL = jdbc:oracle:thin:@testdb01 Error Message = IO Error: could not resolve the connect identifier "testdb01 USER = system URL = jdbc:oracle:thin:@testdb01:1521/testdb01 Error Message = IO Error: could not resolve the connect identifier "testdb01:1521/testdb01" Username? (RETRYING) ('system/*********@testdb01'?)Why is sqlcl having trouble connecting, when the listener is accepting requests and connections over sqlplus are indeed accepted?
My experience is that sqlcl doesn't seem to accept multiple tnsnames.ora aliases.
Solution: Split up the tnsnames.ora entry in two different entries.
Change it from
testdb01, testdb01.oric.no = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = testserver.oric.no)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = testdb01) ) )
testdb01 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = testserver.oric.no)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = testdb01) ) ) testdb01.oric.no = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = testserver.oric.no)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = testdb01) ) )
Monday, August 2, 2021
How to work around ORA-38323: policy conflicts with policy
You try to enable a tablespace-wide ADO policy:
Theres is indeed a policy named P43. What kind of policy is it?
So the policy is a directive to the oracle server to compress all objects after one day of no access. If you need to alter this policy, the old one must be dropped:
ORA-38323: policy conflicts with policy 42If you lookup the error with oerr ora 38323, oracle will give you the following solution:
* Cause: An attempt was made to create a policy with the same action type and based on the same statistic as another policy on the object. *Action: Use a different action and/or statistic for the new policy, or delete the old policy.Verify that there is a policy on the tablespace already:
SELECT * FROM DBA_ILMPOLICIES WHERE TABLESPACE IS NOT NULL;Result:
POLICY_NAME | POLICY_TYPE | TABLESPACE | ENABLED | DELETED |
---|---|---|---|---|
P43 | DATA MOVEMENT | DATA1 | YES | NO |
Theres is indeed a policy named P43. What kind of policy is it?
SELECT policy_name,action_type,scope,compression_level,condition_type,condition_days,policy_subtype FROM DBA_ILMDATAMOVEMENTPOLICIES WHERE POLICY_NAME IN (SELECT POLICY_NAME FROM DBA_ILMPOLICIES WHERE TABLESPACE IS NOT NULL);Result:
POLICY_NAME | ACTION_TYPE | SCOPE | COMPRESSION_LEVEL | CONDITION_TYPE | CONDITION_DAYS | POLICY_SUBTYPE |
---|---|---|---|---|---|---|
P43 | COMPRESSION | GROUP | ADVANCED | LAST ACCESS TIME | 1 |
DISK |
So the policy is a directive to the oracle server to compress all objects after one day of no access. If you need to alter this policy, the old one must be dropped:
ALTER TABLESPACE DATA1 DEFAULT ILM DELETE POLICY P43;You are now free to add a new ADO policy to the tablespace:
ALTER TABLESPACE DATA1 DEFAULT ILM ADD POLICY ROW STORE COMPRESS ADVANCED GROUP AFTER 30 DAYS OF NO ACCESS;
How to add a default ADO compression policy to a tablespace
Create the tablespace:
According to the documentation, by default, this will give you advanced compression on heap tables, standard compression for indexes and LOW for LOB segments created in the tablespace.
Any table created in this tablespace from now on will now inherit the ADO policy. Let's see it in action:
The table has inherited the ADO policy from the tablespace it was created in.
CREATE BIGFILE TABLESPACE DATA1 DATAFILE '/oradata/mydb/data1.dbf' SIZE 1024M AUTOEXTEND ON NEXT 256M MAXSIZE 2T DEFAULT COMPRESS FOR OLTP EXTENT MANAGEMENT LOCAL AUTOALLOCATE SEGMENT SPACE MANAGEMENT AUTO DEFAULT ILM ADD POLICY COMPRESS FOR ALL OPERATIONS GROUP AFTER 1 DAYS OF NO ACCESS;Notice the "GROUP" keyword. It states the scope of an ADO policy, and can be a group of related objects, segment level or row-level, indicated by the keywords GROUP, ROW, or SEGMENT.
According to the documentation, by default, this will give you advanced compression on heap tables, standard compression for indexes and LOW for LOB segments created in the tablespace.
Any table created in this tablespace from now on will now inherit the ADO policy. Let's see it in action:
create table sh.test_ado_tabspc_compression as select * from sh.sales; Table created.Verify:
SELECT policy_name, object_owner, object_name, subobject_name, object_type, inherited_from, enabled, deleted FROM dba_ilmobjects WHERE object_owner='SH' AND object_name='SALES' ORDER BY 1;Result:
POLICY_NAME | OBJECT_OWNER | OBJECT_NAME | SUBOBJECT_NAME | OBJECT_TYPE | INHERITED_FROM | ENABLED | DELETED |
---|---|---|---|---|---|---|---|
P43 | SH | TEST_ADO_TABSPC_COMPRESSION | TABLE | TABLESPACE | YES | NO |
The table has inherited the ADO policy from the tablespace it was created in.
Wednesday, June 30, 2021
How to deal with ORA-01110 during export
If you receive errors like this during data pump export
ORA-01187: cannot read from file because it failed verification tests ORA-01110: data file 204: '/datafiles/oradata/proddb/temp.dbf' ORA-06512: at "SYS.DBMS_LOB", line 724 ORA-06512: at "SYS.DBMS_DATAPUMP", line 4546 ORA-06512: at line 1you need to drop and recreate your temporary tablespace(s). If you only use bigfile temporary tablespaces, you can use the following script to rectify the situation:
set trimspool on set lines 200 set feedback off set verify off set heading off set echo off spool 1.drop_non_default_temp.sql select 'spool 1.drop_non_default_temp.log' from dual; select 'drop tablespace ' || ts.name || ' including contents and datafiles;' from v$tempfile tf join v$tablespace ts on (ts.ts# = tf.ts#) and ts.name not in( select property_value FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'DEFAULT_TEMP_TABLESPACE' ); select 'exit' from dual; spool 2.recreate_temp.sql select 'spool 2.recreate_temp.log' from dual; select 'create bigfile temporary tablespace ' || ts.name || ' tempfile ''' || tf.name || ''' SIZE 32M REUSE AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED;' from v$tempfile tf join v$tablespace ts on (ts.ts# = tf.ts#) and ts.name not in( select property_value FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'DEFAULT_TEMP_TABLESPACE' ); select 'exit' from dual; spool off; spool 3.alter_default_temp.sql select 'spool 3.alter_default_temp.log' from dual; select 'alter database default temporary tablespace TEMP;' from dual; select 'exit' from dual; spool off spool 4.drop_default_temp.sql select 'spool 4.drop_default_temp.log' from dual; select 'drop tablespace ' || ts.name || ' including contents and datafiles;' from v$tempfile tf join v$tablespace ts on (ts.ts# = tf.ts#) and ts.name in( select property_value FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'DEFAULT_TEMP_TABLESPACE' ); select 'exit' from dual; spool off; spool 5.create_default_temp.sql select 'spool 5.create_default_temp.log' from dual; select 'create bigfile temporary tablespace ' || ts.name || ' tempfile ''' || tf.name || ''' SIZE 32M REUSE AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED;' from v$tempfile tf join v$tablespace ts on (ts.ts# = tf.ts#) and ts.name in( select property_value FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'DEFAULT_TEMP_TABLESPACE' ); select 'exit' from dual; spool off; spool 6.reset_default_temp.sql select 'spool 6.reset_default_temp.log' from dual; select 'alter database default temporary tablespace ' || ts.name || ';' from v$tempfile tf join v$tablespace ts on (ts.ts# = tf.ts#) and ts.name in( select property_value FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'DEFAULT_TEMP_TABLESPACE' ); select 'exit' from dual; spool off; exitRun the script in your database, and it will product 6 new sql files, numbered 1 to 6. Run them sequenctially and you should have recreated your temporary tablespaces. After this your data pump export will start as expected.
Subscribe to:
Posts (Atom)