Gå til innhold

Flytte data fra Postgres til Oracle


Anbefalte innlegg

Heisann

Jeg jobber med en relativt stor lokal variant av en database (IMDB) på ca 28mill tuppler fordelt på 21 tabeller. Den ligger idag på en postgres 8.2 server. Jeg ønsker å få flyttet denne over til en Oracle (mener det er v9.2) database for å kjøre noen tester med et program jeg jobber med der.

 

Er det noen som har gjort dette før og vet om en relativt enkel måte å gjøre dette på? Ser helst at det ikke innebærer kjøp av noe programvare eller slikt, men om det er eneste utveien så kan det vurderes.

Lenke til kommentar
Videoannonse
Annonse

Har sett litt på den linken tidligere ja og det er noe sånt jeg gjør akkurat nå. Har akkurat fått på plass et skript som installerer alle tabellene. Måtte, som du sa, endre et par datatyper: integer -> number og text -> varchar2.

 

Har nå kommet til delen hvor selve dataen skal flyttes over. Det ser ut til å kunne ta litt tid :(

 

Er det noen som vet om det går ann å skru av output når jeg kjører en .sql fil inn på oracle? Har en teori om at ALT tar lengere tid når den må skrive ut "inserted 1 row" hele veien nedover når det er snakk om flere millioner linjer. Jeg har ikke tilgang til oppsettet av databasen så det må i så fall være et argument eller noe når jeg skriver "start <filnavn>" i oracle.

Lenke til kommentar
Heisann

Jeg jobber med en relativt stor lokal variant av en database (IMDB) på ca 28mill tuppler fordelt på 21 tabeller. Den ligger idag på en postgres 8.2 server. Jeg ønsker å få flyttet denne over til en Oracle (mener det er v9.2) database for å kjøre noen tester med et program jeg jobber med der.

 

Er det noen som har gjort dette før og vet om en relativt enkel måte å gjøre dette på? Ser helst at det ikke innebærer kjøp av noe programvare eller slikt, men om det er eneste utveien så kan det vurderes.

 

Nå er jo SQL syntaksen i Oracle og PostgreSQL nesten identiske, så så lenge tabell-strukturen er identisk i begge dbene så burde ikke være noe problem å f.eks. eksportere PostgreSQL dataene til et DML script og kjøre dette i Oracle.

 

PostgreSQL pg_dump

Lenke til kommentar
Har sett litt på den linken tidligere ja og det er noe sånt jeg gjør akkurat nå. Har akkurat fått på plass et skript som installerer alle tabellene. Måtte, som du sa, endre et par datatyper: integer -> number og text -> varchar2.

 

Har nå kommet til delen hvor selve dataen skal flyttes over. Det ser ut til å kunne ta litt tid :(

 

Er det noen som vet om det går ann å skru av output når jeg kjører en .sql fil inn på oracle? Har en teori om at ALT tar lengere tid når den må skrive ut "inserted 1 row" hele veien nedover når det er snakk om flere millioner linjer. Jeg har ikke tilgang til oppsettet av databasen så det må i så fall være et argument eller noe når jeg skriver "start <filnavn>" i oracle.

 

Disse to bør du ha i toppen av SQL-fila:

 

SET TERM OFF

SET SCAN OFF

 

Hvis det er snakk om store datamengder, ville jeg heller benyttet meg av Oracle SQL Loader, som er mye raskere enn millioner av INSERT-setninger. Dette følger med de fleste Oracle-installasjoner. En god FAQ om dette finner du her:

 

http://www.orafaq.com/faqloadr.htm

 

Werner

Lenke til kommentar
  • 2 uker senere...

Blåser litt liv i denne tråden igjen jeg.

 

Jeg holder da forsatt på med å få data over fra PostGres til Oracle. Jeg har nå fått tilgang til flatfilene der ALL data for databasen ligger lagret. En fil for hver tabell.

 

Jeg forsøker nå å laste data inn i databasen ved hjelp av sqlldr, men av en eller annen grunn så stopper den etter første commit. Det kommer ut på skjermen noe ala: "commit point reached. 64 entries". Ett eller annet i den duren som vel forteller at den kommer til å lagre for hver 64. linje, men her stopper den altså. Det kommer heller ikke noe data inn i tabellen.

 

Om det er noen som kunne gi meg noen råd/tips til hva som kan være galt så hadde det vært veldig fint :)

 

Legger ved control fila som jeg bruker for selve innlastingen. Denne er for bare en tabell:

OPTIONS (
LOG=Person.log,
BAD=Person.bad,
DATA='<datapath - fjernet akkurat nå :p >',
DISCARD=Person.discard,
ERRORS=0,
DISCARDMAX=1,
)
LOAD DATA
INSERT
INTO TABLE Person
TRAILING NULLCOLS
( personid POSITION(*) TERMINATED BY '^_',
 lastname POSITION(*) TERMINATED BY '^_',
 firstname POSITION(*) TERMINATED BY '^_',
 gender POSITION(*) TERMINATED BY '^_'
)

 

her er en sample av dataen

17^_$^_Steve^_M
18^_'La Mueque'^_^_F
19^_'Abd al-Samad^_'Abd al-Basit^_
20^_Aaes^_Annemarie^_
21^_'t Joen^_Léon^_M
23^_'t Hart^_Martijn^_
24^_'t Hart^_Maarten^_
25^_$hort^_Too^_
33^_'babeepower' Viera^_Michael^_M
34^_'La Tata' Castro^_Maria Tereza^_F
35^_'J'^_Johnny^_
36^_Aalami^_Mohamad Reza^_
37^_1^_Todd^_M
38^_2.0^_Artno^_
41^_Çapin^_Halit^_
49^_'Cartucho' Pena^_Ramon^_M
50^_'La Veneno'^_Cristina^_F
51^_'N Heat^_^_
52^_Aaltonen^_Irma^_F
53^_12 Poissons^_Les^_
54^_A.^_Yuri^_
55^_'t Sant^_Eline^_
56^_'t Serstevens^_Albert^_
57^_'K'^_Murray the^_M
65^_'Chincheta'^_Eloy^_M
66^_'t Hart^_Josine^_F
67^_.38 Special^_^_
68^_Aarar^_Mahmia^_
69^_13^_Phoenix^_
70^_Aagaard^_Sigfred^_
81^_'El de Chipiona'^_Antonio^_M
82^_'t Seyen^_Hilda^_F
83^_04^_Fred^_
84^_Aaron^_Naoj^_
85^_1312^_^_
86^_Aaker^_Grant^_
88^_50 Cent^_^_M
97^_'El Francés'^_José^_M
98^_'ya^_Moni^_F
99^_10% Reptile^_^_
100^_Aartolahti^_Hanna^_
101^_93^_Powers^_
103^_2000^_T.^_
104^_A'Court^_Michele^_F
105^_'t Hoen^_Frans^_M
113^_'El Gato'^_Félix^_M
114^_103^_Martha^_F
115^_100 Folk Celsius^_^_
116^_Aasheim^_Ane^_M
117^_a'Hiller^_Lejaren^_M
118^_Aalto^_Rostislav^_M
120^_A-Mansour^_Khairiya^_
129^_'El Guisa'^_^_M
130^_10X^_Sharon^_F
131^_17 Hippies^_^_
132^_Aastrup^_Lina^_
133^_A^_Nian^_
134^_Aaltonen^_Elizabeth^_
135^_A'Court^_Susan^_
136^_A. Solla^_Ricardo^_
137^_'The Jeweler'^_Jacob^_M
145^_'El Happy' Lora^_Miguel^_M
146^_11:11^_Nicole^_F
147^_2 Skinnee Js^_^_
148^_Aatland^_Liv^_
150^_Aaltonen^_Jouko^_M

 

og det produserer denne logfila

 

SQL*Loader: Release 9.2.0.4.0 - Production on Fri Feb 15 16:54:25 2008

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

Control File:   <path er skjult >
Data File:	  <path er skjult >
 Bad File:	 Person.bad
 Discard File: Person.discard
(Allow 1 discards)

Number to load: ALL
Number to skip: 0
Errors allowed: 0
Bind array:	 64 rows, maximum of 256000 bytes
Continuation:	none specified
Path used:	  Conventional

Table PERSON, loaded from every logical record.
Insert option in effect for this table: INSERT
TRAILING NULLCOLS option in effect

  Column Name				  Position   Len  Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
PERSONID							FIRST	 *		   CHARACTER
Terminator string : '^_'
LASTNAME							 NEXT	 *		   CHARACTER
Terminator string : '^_'
FIRSTNAME							NEXT	 *		   CHARACTER
Terminator string : '^_'
GENDER							   NEXT	 *		   CHARACTER
Terminator string : '^_'

Record 1: Rejected - Error on table PERSON, column PERSONID.
ORA-01722: invalid number


MAXIMUM ERROR COUNT EXCEEDED - Above statistics reflect partial run.

Table PERSON:
 0 Rows successfully loaded.
 1 Row not loaded due to data errors.
 0 Rows not loaded because all WHEN clauses were failed.
 0 Rows not loaded because all fields were null.


Space allocated for bind array:				  66048 bytes(64 rows)
Read   buffer bytes: 1048576

Total logical records skipped:		  0
Total logical records read:			64
Total logical records rejected:		 1
Total logical records discarded:		0

Run began on Fri Feb 15 16:54:25 2008
Run ended on Fri Feb 15 16:54:26 2008

 

Til slutt legger jeg ved tabelldefinisjonen

SQL> describe person;
Name									  Null?	Type
----------------------------------------- -------- ----------------------------
PERSONID										   NUMBER(10)
LASTNAME								  NOT NULL VARCHAR2(255)
FIRSTNAME										  VARCHAR2(255)
GENDER											 CHAR(1)

 

Håper noen kan hjelpe meg litt. Begynner å bli litt småfortvila egentlig :cry:

 

Når det gjelder å kjøre ut tabellene fra postgres som en haug med insert setninger (som det er nevnt lengere opp i tråden her) så fungerer det fint på små tabeller, men når tabellen er på 11millioner tuppler så tar det fryktelig lang tid å skrive ut, tar ENORMT med plass den tekstfila, samt at innsettingen tar veldig lang tid.

 

Edit: La til tabell definisjon og litt kommentarer

Edit 2: la til litt mer av datafila slik at det er mer enn 64 linjer data der i tilfelle det er noe datafeil som forårsaker feilen.

Endret av Nero Burningwr00m
Lenke til kommentar
Record 1: Rejected - Error on table PERSON, column PERSONID.

ORA-01722: invalid number

 

 

MAXIMUM ERROR COUNT EXCEEDED - Above statistics reflect partial run.

 

Table PERSON:

0 Rows successfully loaded.

1 Row not loaded due to data errors.

0 Rows not loaded because all WHEN clauses were failed.

0 Rows not loaded because all fields were null.

 

 

Er ikke oracle 9 litt gammel, btw?

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...