set long 10000 set heading off set trimspool on set lines 300 set longchunksize 300 spool mytrigger.sql exec dbms_metadata.set_Transform_param(dbms_metadata.session_transform,'SQLTERMINATOR',true); select dbms_metadata.get_ddl('TRIGGER','MYTRIGGER','SCOTT') FROM DUAL;
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.
Monday, January 18, 2016
How to use dbms_metadata to generate DDL for a trigger
Tuesday, January 12, 2016
On a Linux system, what do the parameters shmall, shmmax and shmmni define?
shmall
* indicates the total amount of shared memory that the system can use at one time (measured in pages)
shmmax
* defines the maximum size in bytes of a single shared memory segment that a Linux process can allocate in its virtual address space, in bytes.
Oracle recommends that more than half of the physical memory is assigned to shmmax
shmmni
* defines the system wide maximum number of shared memory segments
* indicates the total amount of shared memory that the system can use at one time (measured in pages)
shmmax
* defines the maximum size in bytes of a single shared memory segment that a Linux process can allocate in its virtual address space, in bytes.
Oracle recommends that more than half of the physical memory is assigned to shmmax
shmmni
* defines the system wide maximum number of shared memory segments
Thursday, January 7, 2016
How to join v$database with v$instance
Here is a useful query which displays basic information about the database, using v$database and v$instance.
Take the opportunity to calculate the uptime for the database by subtracting the value of startup_time from the current date.
Result may look like the following:
Take the opportunity to calculate the uptime for the database by subtracting the value of startup_time from the current date.
col platform_name format a30 col open_mode format a20 col host_name format a20 col version format a10 col status format a20 col uptime format a30 col name format a10 set lines 300 SELECT D.NAME,D.PLATFORM_NAME,D.CREATED, D.OPEN_MODE,I.HOST_NAME,I.VERSION, I.ARCHIVER,I.STATUS, TO_DSINTERVAL( TO_CHAR( TO_TIMESTAMP(SYSDATE)-I.STARTUP_TIME ) ) "UPTIME", (SELECT ROUND(SUM(BYTES)/1024/1024/1024) FROM DBA_DATA_FILES) "DB size GB", ( SELECT ROUND(BYTES/1024/1024/1024) "mem GB" FROM V$SGAINFO WHERE NAME = 'Maximum SGA Size' ) "SGA max size GB" FROM V$DATABASE D INNER JOIN V$INSTANCE I ON UPPER(D.NAME) = UPPER(I.INSTANCE_NAME);
Result may look like the following:
NAME | PLATFORM_NAME | CREATED | OPEN_MODE | HOST_NAME | VERSION | ARCHIVER | STATUS | UPTIME | DB size GB | SGA max size GB |
---|---|---|---|---|---|---|---|---|---|---|
proddb01 | Linux x86 64-bit | 10.12.2015 14:16:46 | READ WRITE | prodserver01.mycompany.com | 11.2.0.4.0 | STARTED | OPEN | +00 13:59:55.000000 | 929 | 12 |
Tuesday, December 22, 2015
Generate "drop user" statement for schemas with and without objects
set lines 200 col owner format a20 col username format a30 col schema format a30 PROMPT =================================================== PROMPT List of all schemas and number of Objects they own: PROMPT =================================================== select u.username "Schema", decode(count(*),1,0, count(*)) "Number of Objects" from dba_users u left outer join dba_objects o on u.username = o.owner where u.username in (USER1','USER2','USER3') group by u.username order by username ASC; set heading off set trimspool on set lines 200 set feedback off spool drop_users.sql select 'spool drop_users_SD4440.log' from dual; select 'DROP USER ' || u.username || DECODE(decode(count(*),1,0, count(*)), '0',';' , ' CASCADE;') from dba_users u left outer join dba_objects o on u.username = o.owner where u.username in ('USER1','USER2','USER3') group by u.username; select 'exit' from dual; exit
Friday, December 18, 2015
How to solve ORA-27102: out of memory on startup
You want to increase your SGA to a larger value, and you have taken care to increase the value of shmmax in the /etc/sysctl.conf file.
When starting up the database with increased values for sga_max_size and sga_target, you hit
Solution:
Increase the value of shmall as well. Shmall indicates the total amount of shared memory that the system can use at one time (measured in pages).
To find the page size:
Make sure that the shmall is larger, not identical, than the setting of your SGA.
For example, if you want a 12G SGA, do not set shmall to 3145728 which would be the number of pages for 12G
Set it to a value larger instead, for example 3670016, which is the number of pages equivalent to 14G:
As root, open /etc/sysctl.conf in an editor.
Search for the string kernel.shmall
Change the value
Save and exit.
Then, still as root, execute
Check that the new settings are in place:
The database should now be possible to open.
When starting up the database with increased values for sga_max_size and sga_target, you hit
SQL> startup ORA-27102: out of memory Linux-x86_64 Error: 28: No space left on device Additional information: 1543503872 Additional information: 1
Solution:
Increase the value of shmall as well. Shmall indicates the total amount of shared memory that the system can use at one time (measured in pages).
To find the page size:
getconf PAGE_SIZE 4096
Make sure that the shmall is larger, not identical, than the setting of your SGA.
For example, if you want a 12G SGA, do not set shmall to 3145728 which would be the number of pages for 12G
Set it to a value larger instead, for example 3670016, which is the number of pages equivalent to 14G:
3670016*4096=15032385536 15032385536/1024/1024/1024 = 14G
As root, open /etc/sysctl.conf in an editor.
Search for the string kernel.shmall
Change the value
Save and exit.
Then, still as root, execute
sysctl -p
Check that the new settings are in place:
/sbin/sysctl -a | grep shm
The database should now be possible to open.
How to check memory consumption and swapping on a Linux server
The easiest way to check for memory consumption on Linux is in my opinion the "free" utility:
Add totals with the -t flag:
So in this case I am using 7701 MB of memory, while 8354 MB is free for use.
To get a quick glance, you can have a look at the file /proc/meminfo, grep for the highlights, like this:
oracle@prodserver1:[proddb01]# free -m total used free shared buffers cached Mem: 16056 9027 7029 0 233 1093 -/+ buffers/cache: 7700 8356 Swap: 8191 2674 5517
Add totals with the -t flag:
free -t -m total used free shared buffers cached Mem: 16056 9029 7027 0 233 1093 -/+ buffers/cache: 7701 8354 Swap: 8191 2674 5517 Total: 24248 11703 12545
So in this case I am using 7701 MB of memory, while 8354 MB is free for use.
To get a quick glance, you can have a look at the file /proc/meminfo, grep for the highlights, like this:
egrep 'Mem|Cache|Swap' /proc/meminfo MemTotal: 16442312 kB MemFree: 7255224 kB Cached: 1120380 kB SwapCached: 45632 kB SwapTotal: 8388600 kB SwapFree: 5650100 kBA good option for finding out if a server is swapping, is by using vmstat:
oracle@myserver# vmstat -w 10 4 procs -----------------------memory---------------------- ---swap-- -----io---- -system-- --------cpu-------- r b swpd free buff cache si so bi bo in cs us sy id wa st 3 0 2772764 659396 20340 10764836 4 4 19 9 3 4 13 6 81 0 0 6 0 2771740 735076 20364 10766444 82 0 82 7 68360 52089 57 30 13 0 0 10 0 2771484 767816 20376 10766628 8 0 12 4 67349 52155 55 31 15 0 0 7 0 2771228 747480 22832 10768888 34 0 495 12 67799 52119 57 30 13 0 0where * The flag -w indicates wide output * Sample every 10 second * 4 iterations Columns: * si: Amount of memory swapped in from disk (/s) * so: Amount of memory swapped to disk (/s) When a lot of negative swapping occurs the value of "so" (swap out) is increasing.
Wednesday, December 16, 2015
How to resolve PLS-00201: identifier 'DBMS_SYSTEM.SET_BOOL_PARAM_IN_SESSION'
During migration of an EBS (E-Business Suite) database, I was left with some packages in the APPS schema that couldn't be compiled.
I first tried granting execute on dbms_system directly to the user app - no luck.
Then I found the following blog post
https://blogs.oracle.com/mandalika/entry/resolving_pls_00201_identifier_dbms
Which points to the following solution:
SQL> alter package apps.ad_parallel_updates_pkg compile body; Warning: Package Body altered with compilation errors. SQL> show errors Errors for PACKAGE BODY APPS.AD_PARALLEL_UPDATES_PKG: LINE/COL ERROR -------- ----------------------------------------------------------------- 338/8 PL/SQL: Statement ignored 338/8 PLS-00201: identifier 'DBMS_SYSTEM.SET_BOOL_PARAM_IN_SESSION' must be declared
I first tried granting execute on dbms_system directly to the user app - no luck.
Then I found the following blog post
https://blogs.oracle.com/mandalika/entry/resolving_pls_00201_identifier_dbms
Which points to the following solution:
SQL> create public synonym dbms_system for dbms_system; Synonym created. SQL> grant execute on dbms_system to apps; Grant succeeded. SQL> alter package apps.ad_parallel_updates_pkg compile body; Package body altered. SQL>
Subscribe to:
Posts (Atom)