... or save your time by generating this script ...
Renato, August 21, 2008 - 5:16 pm UTC
SELECT 'insert into '
|| table_name
|| ' select * from '
|| table_name
|| '@database_link;'
FROM user_tables
SQL*Plus COPY Command
Eric Yen, August 21, 2008 - 7:58 pm UTC
updates during data migration
Ben, August 22, 2008 - 11:53 am UTC
The idea of limiting DML (or DDL for that matter) during a migration is critical, and not limited to using the SQL*PLUS copy command. I hope the original poster knows this already, but it seems good to say that out loud anyway. :-)
Table Copy From One DB to Another DB (longraw/blob)
Shravan, August 22, 2008 - 6:53 pm UTC
Dear Tom,
We will face issues if the table contains long raw column/blob. The insert statement you have provided gave error to me when I tried with table with longraw column. Kindly tell us how we can transfer longraw/blob objects from db to db
Shravan
August 26, 2008 - 7:44 pm UTC
long raw, not going to happen over a database link
blob - no problem.
long raw - export/import (i don't care if you don't "want" to use it, you might have to), transport (using export/import again)
need urgent help
MAYUR, August 27, 2008 - 8:24 am UTC
HI TOM, CAN U TELL ME PLEASE HOW TO CREATE DATABASE LINK BETWEEN TWO SYSTEM WHICH ARE IN LAN CONNECTION. PLEASE SPECIFY STEPS FOR THAT....
THANK YOU
August 28, 2008 - 8:54 am UTC
CREATE DATABASE LINK
read about it in the documentation, fully documented command and syntax is there.
you need to have setup the listener on at least one instance and from the machine you want to create the database link on (the machine - the server), you need to be able to "sqlplus user/password@remote_site", where remote_site is a tns connect string you configured in that machines tnsnames.ora
then create database link remote_database using 'remote_site', maybe with other options like identified by, connect to, and so on - you'll figure out what options you want to use after you study the documentation and see what is available to meet your needs.
DB Links best syntax
Govind, August 28, 2008 - 8:19 pm UTC
Hi,
Here is a syntax I find very useful when it comes to creating DB links. This works even without the TNS entry on the server.
create database link <db link name>
connect to <username>
identified by <password>
using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS =(PROTOCOL = TCP)
(HOST = <your host>)
(PORT = 1521)))
(CONNECT_DATA = (SID = <your sid> )))'
Regards, Govind
orafind.blogspot.com - Oracle Search with a difference
August 29, 2008 - 11:10 pm UTC
that works but in general is a bad idea except for testing.
think about it, what happens when you restore this to 'test' - you don't really want your test database link to connect to production right?
there is a reason we commonly use indirection in coding/software.
and this syntax is so easily documented and understood.... documentation is something to embrace, not reject.
so, I in some ways find your comment dangerous. It offers an "easy way" with lots and lots of unmentioned caveats.
need more explanation for the following example
venkat, February 17, 2010 - 6:47 am UTC
Hi Tom,
What if the table on the remote database has some 50M of data? The following query will take lot of time depending on the resources available.
insert into local_table select * from table@database_link;
But If i go with the following query its a bit faster,
insert /*+APPEND PARALLEL(local_table,x)*/into local_table select /*+prallel(a,x)* from table@database_link a;
but I want to improve that even more. Is it possible? I tried it using the bulk collect implementaion as follows:
OPEN c1 FOR (SELECT * FROM table@database_link);
LOOP
FETCH c1 BULK COLLECT INTO tab LIMIT 2000;
EXIT WHEN tab.count = 0;
FORALL idx IN 1..tab.count
INSERT INTO local_table
VALUES tab(idx);
END LOOP;
CLOSE c1;
Thanks
Venkat.
February 17, 2010 - 9:32 am UTC
50mb - that is tiny, I can type that in myself. 50mb is TINY, teeny tiny. Nothing.
The append is probably the only thing doing anything for you in that statement. The parallel full scan won't do much since the DBLINK will serialize the data anyway (so what if you have 10 readers, if they all feed a SINGLE process on the remote site that will write data on the dblink - the full scan won't benefit very much).
And you know what, I want to know exactly why you think procedural code like that would be better???
mfz, February 17, 2010 - 6:08 pm UTC
Venkat -
I am assuming you are referring M as million.
It is always not to use these abbreviation , as this causes confusion.
For 50 million records , by placing the hint you are
a) inserting the records above the HWM
b) using PQ jobs .
where as the insert (with out hint) does not use PQ process . Why dont you get the execution plan for these inserts and paste it in the question. That should answer your question.
A reader, March 08, 2010 - 11:43 pm UTC
Db Link solves a critical error
A reader, April 26, 2012 - 10:28 am UTC
Thanks v much.
Created a DB Link and imported table within no time !
Thanks a ton guys.
copy partition table to another database
sanat Nayak, May 31, 2012 - 12:51 pm UTC
Hi tom
which command i have to use for copy single partition of table to another database using dblink.
May 31, 2012 - 1:02 pm UTC
you can either
a) create a view at the remote site that selects from this partition and use that
b) use a where clause that includes the right range to select the rows
how to push data os a table from one oracle Db to another oracle DB
amit, October 11, 2012 - 3:54 am UTC
Hi,
I need to push the data of one oracle table to another.
The source table have real time data.
this real time data should be flown into other oracle db.
earlier we used Oracle streams between this 2 DB.
Now we are facing some problems with this.
Can we have other methods to replicate data from one to another db. other then using Dblink and MV.
Thanks,
amit
October 11, 2012 - 8:21 am UTC
Auto Purge of MV LOgs files
amit, October 13, 2012 - 2:05 am UTC
To Purge the log files of fast refresh mv we follow the below syntax
CREATE MATERIALIZED VIEW LOG on Amit
TABLESPACE Amit_tzt
WITH ROWID
(
EMP_NAME ,
ID ,
DOLLAR_VALUE ,
LOCAL_VALUE ,
UNITS
)
INCLUDING NEW VALUES
PURGE REPEAT INTERVAL '1' DAY;
But when i give PURGE REPEAT INTERVAL '1' MINUTE; Its not working
can anybody give more suggestion on it
Thanks,
Amit
October 13, 2012 - 8:45 am UTC
why would you do this every single *minute*. The sole goal of using purge repeat would be to spread the purges out over many refreshes - instead of doing it every refresh. the goal of this is to reduce the number of purges, not make it an ongoing thing forever, constantly, continuously.
what is your thinking, your rationale behind this???
PURGE REPEAT INTERVAL
amit, October 15, 2012 - 1:23 am UTC
Yes Got it.
Can anybody explain me How does Purge work internally.
Can see when ever a log is create,A table mlog$_<> is also creates to note down the changed records.How does it get propagated to target.
CREATE MATERIALIZED VIEW LOG on amit
TABLESPACE EXT_DATA_TS
WITH ROWID
(
store_id ,
measure_name ,
billing_dollar_value ,
billing_currency_value ,
billing_units
)
INCLUDING NEW VALUES
PURGE REPEAT INTERVAL '1' DAY;
select * from mlog$_amit;
October 15, 2012 - 10:32 am UTC
the purge repeat uses the scheduler to run a job that does the purge.
the log doesn't get propagated to the target, the target connects to the source, queries the log to find changes and pulls them.
Log Purge
amit, October 18, 2012 - 6:15 am UTC
Can i know the exact job name which purges it.
As we have giving the purging time 1 hour.but some time its purging within 40 minutes.
If a job exists for it then we can monitor it
October 18, 2012 - 8:29 am UTC
query the scheduler views. you'll see it.
Purging of Logs
amit, October 22, 2012 - 1:30 am UTC
Can u please explain me in detail.
about the scheduler View
October 23, 2012 - 12:11 pm UTC
U is not available, sorry. did you check out the documentation at all? all of the views are documented???
INSERT SELECT vs CREATE AS SELECT
Rustam Kafarov, June 06, 2013 - 4:35 pm UTC
Hi Tom.
I have table on remote DB (Oracle 11.1) which consists of 2 columns:
ID - varchar2(50)
XMLCOLUMN - XMLType stored as bacisfile CLOB.
There are about 200.000 rows with 5K avg size of lob;
I need to create local "snapshot" of this table on my local db over db_link. Local table has following structure
ID varchar2(50),
TAGVALUE varchar2(50)
I tried 3 methods:
method 1:
truncate table local_table;
insert /*+ append */ into local_table
select extractvalue(xmlcolumn, '/tag_xpath') from remote_table@db_link;
commit;
method 2:
drop table local_table;
create local_table as select extractvalue(xmlcolumn, '/tag_xpath') from remote_table@db_link;
method 3:
declare
cursor cur is
select * from remote_table@db_link;
arr1 str_array;
arr2 str_array;
begin
open cur;
loop
fetch cur bulk collect into arr1, arr2 limit 1000;
forall I in 1..arr1.count
insert into local table values(arr1(I), arr2(I));
commit;
exit when arr1.count = 0;
end loop;
close cur;
end;
/
Method 1 - 2500 seconds,
Method 2 - 160 seconds,
Method 3 - 180 seconds
Difference between 2 and 3 is expected and understood. But huge difference between 1 and 2 - I don't understand. Why create as select works faster (and significantly faster in my case) than direct path insert?
Thanks,
Rustam
June 06, 2013 - 6:06 pm UTC
I'd have to see each run a few times to understand that the insert append is always slower - could be that the insert append warmed things up.
or at the very least, a way to reproduce, creates, data generator, etc.
INSERT SELECT vs CREATE AS SELECT
Rustam Kafarov, June 07, 2013 - 9:11 am UTC
It is reproducible on all tables. I suspect that there is a generic problem in the network and all my tests show that insert into .. select ... from @dblink simply doesn't work properly.
I'm confused because CTAS uses same approach - direct path write above HWM but works ok.
June 07, 2013 - 1:36 pm UTC
evidence please?
ops$tkyte%ORA11GR2> set timing on
ops$tkyte%ORA11GR2> insert /*+ append */ into t1 select * from big_table@ora11gr2@loopback;
1000000 rows created.
Elapsed: 00:00:04.02
ops$tkyte%ORA11GR2> create table t2 as select * from big_table@ora11gr2@loopback;
Table created.
Elapsed: 00:00:04.11
ops$tkyte%ORA11GR2> set timing off
Further tuning
Dheeraj Mehra, May 22, 2015 - 10:38 am UTC
Hi Tom,
Going back to the original query, how could we further tune below SQL in addition to APPEND hint etc.?
We are using 12c
insert into local_table select * from table@database_link;
Thanks,
Dheeraj
what is oracle (error) code to know for copying huge data from one db to another db.
Mangesh, June 07, 2016 - 1:51 am UTC
what is oracle (error) code to know for copying huge data from one db to another db.
June 07, 2016 - 2:16 am UTC
Any error code generally isn't a good one.
Load Huge data From Sql Table to Oracle Table
Sachin, November 02, 2021 - 10:32 am UTC
I am loading data via Wherescape RED, which uses Database link to load data from SQL server to oracle. Similar to below.
insert into OracleTable select * from SQLTable@database_link;
But it is taking lot of time to load. I did partitioning on SQL table but it didn't improve the performance now I am planning to create partioning Oracle table as well.
Is the approach correct to load data Faster or is there a better way to load huge data (Billions)
November 09, 2021 - 2:52 am UTC
For billions, the best way will be to unload the data to flat file in SQL Server and load it via SQLLoader or external table in Oracle.