Avatar billede michael_stim Ekspert
23. maj 2007 - 15:39 Der er 33 kommentarer og
1 løsning

Kopiere fra database til database.

Kan man kopiere fra database til database?
INSERT INTO table_space.schema.tabel SELECT * FROM table_space.schema.tabel

Eller skal man ud i noget eksport/import?
Avatar billede michael_stim Ekspert
23. maj 2007 - 16:26 #1
OK, fandt ud af at det kan lade sig göre:

COPY FROM database TO database action -
destination_table (column_name, column_name...) USING query

Men er der så nogen der ved hvor meget "creme" det tager? Skal kopiere fra PROD til TEST miljö.
Avatar billede Slettet bruger
23. maj 2007 - 16:45 #2
Den kopiering du taler om foregår i SQL*Plus: Data hentes fra server og overføres til testmiljø via den maskine, som du kører SQL*Plus fra.

Hvis du vil have en direkte kopiering fra produktionsserver til testserver, skal du definere produktionsserver i testservers tnsnames-fil. Derefter kan du oprette et databaselink på testserver og overføre data fra server til server:

INSERT INTO TEST_TABEL SELECT * FROM PROD_TABEL@DBLINKNAME;

Hvis der er tale om mange data, er det altid mere enkelt at lave en dump-fil med exp og importere den med imp. Eventuelt med datapump.

sidste mulighede: SQL*Loader. Men den kræver at du trækker data ud på en rimelig pæn måde
Hvis du ikke har mere end et par millioner rækker, er database-links det enkleste.
Avatar billede michael_stim Ekspert
23. maj 2007 - 17:10 #3
Jeg har 16 mill
Avatar billede michael_stim Ekspert
23. maj 2007 - 17:10 #4
40 GB :(
Avatar billede michael_stim Ekspert
23. maj 2007 - 17:56 #5
Jørn>>Ved du hvorfor denne ikke fungerer?
COPY...-
INSERT INTO tabel1 USING SELECT * FROM tabel2;

Den bliver ved med at klage over at kolonnerne skal i parantes.

Den fungerer heller ikke når jeg kører:

COPY...-
INSERT INTO tabel1(kolonne1, kolonne2...) USING SELECT * FROM tabel2(kolonne1, kolonne2...);
Avatar billede michael_stim Ekspert
23. maj 2007 - 18:02 #6
Den fungerer fint når jeg creater en ny tabel. Men det kan jeg ikke rigtigt bruge, da jeg skal have ændret en kolonne fra number(38,2) til number(38,4)
Avatar billede Slettet bruger
24. maj 2007 - 08:44 #7
hej Michael

Jeg bliver lige nødt til at checke op på COPY-syntaksen inden jeg kan svare. Måske kan andre?

Men med hensyn til at ændre en kolonne:

ALTER TABLENAME MODIFY (kolonnenavn number(38,4))
/

skulle vel kunne gøre det.
Avatar billede Slettet bruger
24. maj 2007 - 08:59 #8
Jeg går ud fra at du bruger COPY-eksemplerne fra http://download-uk.oracle.com/docs/cd/B19306_01/server.102/b14357/apb.htm#i641276 ? Hvis det ikke fungerer, skal jeg se hele udtrykket for at kunne hjælpe dig.

Det kan være fordi du bruger nye datatyper, der er kommet efter Oracle8i?

"The COPY command is not being enhanced to handle datatypes or features introduced with, or after Oracle8i. The COPY command is likely to be made obsolete in a future release."

Hvis du har 16 millioner rækker er det nemmere at lave en eksport, flytte den komprimerede fil over på modtagerdatabase og lave en import.

Se fx.http://download-uk.oracle.com/docs/cd/B19306_01/server.102/b14215/exp_imp.htm

Her kan du også styre, hvor tit du laver commit under import. Jeg tror ikke, du kan lave en import af 16 millioner rækker uden.
Avatar billede michael_stim Ekspert
24. maj 2007 - 11:00 #9
Og hvis jeg skal gøre det via db-link?

Så skal jeg gøre det på test? Og kan jeg gøre det via sql-plus?

f ex:
CREATE DATABASE LINK prod_link CONNECT TO
        bruger IDENTIFIED BY password
        USING 'TNS_STRINGEN';

eller skal man ændre tnsnames.ora?
Avatar billede Slettet bruger
24. maj 2007 - 11:11 #10
Du kan godt lave et link uden at det skal sættes op i tnsnames.ora.

Jeg har lige prøvet det her:

create database link link_joern_h
connect to username identified by password
using '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(Host = navnpåhost)(Port = 1521)))(CONNECT_DATA = (SID = sidpåhost)))';

select * from dual@link_joern_h;
Avatar billede michael_stim Ekspert
24. maj 2007 - 11:27 #11
Men det skal creates fysisk på serveren hva?
Kan få det til at fungere når jeg laver et link lokalt til prod. Men ikke fra test til prod, så klager den over tns og service name.
Avatar billede Slettet bruger
24. maj 2007 - 11:54 #12
det lyder mærkeligt. kan test i det hele taget se produktion? Hvad er det helt præcist, den skriver til dig?
Avatar billede michael_stim Ekspert
24. maj 2007 - 12:16 #13
Jeg har alle tns-er i min tnsnames. Men tror det er ligegyldigt, for der er long datatyper i tabellen. Så det klager den over nu.
Avatar billede michael_stim Ekspert
24. maj 2007 - 12:21 #14
test og prod er ikke hos mig fysisk.
"ORA-12505: TNS_listener could not resolve SID given in connect descriptor"
Avatar billede Slettet bruger
24. maj 2007 - 12:38 #15
det lyder som en fejl fra prodserver om at sid ikke findes på maskinen.

Der er to muligheder:
  1. du peger på den forkerte maskine, ikke på prod,
  2. du har angivet forkert sid

Begge muligheder er jo ret usandsynlige, fordi du jo har testet det lokalt.

Kan du starte sqlplus på testserver og få forbindelse til prodserver?
Avatar billede michael_stim Ekspert
24. maj 2007 - 12:50 #16
jaja
Avatar billede Slettet bruger
24. maj 2007 - 12:54 #17
så har jeg ikke flere ideer. Er der nogen andre, der kan hjælpe?
Avatar billede michael_stim Ekspert
24. maj 2007 - 13:10 #18
Nu fungerer linket. Men har stadig problemer med long. Når jeg prøver at sætte dbms_metadata_util siger den ugyldig identifiere (ora-00904).

insert into ksd_line_test select

FAKT_ID,

  LINE_NO,     

  INVOICE_NO,

  ITEM_NO,

  ORDER_NO,

  BTN_CODE,

  PROD_NO,

  PROD_GROUP,

  TARIF_NO,

  PREFERENCE,

  GOODS_DESCR1,

  GOODS_DESCR2,

  GOODS_DESCR3,

  GOODS_DESCR4,

  GOODS_DESCR5,

  GOODS_DESCR6,

  GOODS_DESCR7,

  GOODS_DESCR8,

  COUNTRY_OF_ORIGIN,

  GROSS_WEIGHT,

  NET_WEIGHT,

  TARA,

  VOLUME,

  VOLUME_EN,

  QUANTITY,

  OTHERQUANTITY,

  QUALITY,

  QUANTITY_EN,

  ITEM_EN,

  DELIVERY_DATE,

  ORDER_QUANT,

  DELIVERED_QUANT,

  NO_OF_PACKAGES,

  PACKAGETYPE,

  MARKS1,

  MARKS2,

  MARKS3,

  MARKS4,

  MARKS5,

  ITEM_VAL,

  ITEM_AMOUNT,

  TOTAL_AMOUNT,

  FREIGHT_OUTSIDE,

  FREIGHT_INSIDE,

  FREIGHT_INCOMUNITY,

  INSURANCE,

  ADD_COST1,

  ADD_COST2,

  ADD_COST3,

  ADD_COST4,

  TAX_AMOUNT1,

  TAX_AMOUNT2,

  DISCOUNT1,

  DISCOUNT_AMOUNT1,

  DISCOUNT2,

  DISCOUNT_AMOUNT2,

  STATUS,

  ACCOUNT_NO1,

  ACCOUNT_NO2,

  STORAGE_NO,

  ASSIGNMENTID,

  ASSIGNMENT_LINENO,

  FREETXT1,

  FREETXT2,

  FREETXT3,

  FREETXT4,

  FREETXT5,

  FREETXT6,

  FREETXT7,

  FREETXT8,

  FREETXT9,

  FREETXT10,

  dbms_metadata_util.long2varchar(4000, 'KSD_LINE', 'REMARKS',72),

  LICENCE_REQUIRMENT,

  LICENCE_CATEGORY,

  LICENCE_NO,

  PROCEDURE,

  PNC_CODE,

  CERT_TYPE,

  CERT_TXT,

  CERT_REF,

  TRADE_STATUS,

  ADR_NO,

  ADDITIONAL_CODE1,

  REG_STATUS,

  LIC_ID,

  LIC_STATUS,

  RECIPE_FLAG,

  INT_ASSIGNMENTID,

  CERT_STATUS,

  LIC_MISSING_QUANTITY,

  NAT_DUTYCODE,

  KSD_UNITWEIGHT

from ksd_line@temp
Avatar billede Slettet bruger
24. maj 2007 - 13:35 #19
der var orde! datatypen long er anderledes.
Du slipper nemmest om ved det, hvis du laver en export/import
Avatar billede Slettet bruger
24. maj 2007 - 13:37 #20
med mindre du med 'long' taler om number(38,4) og ikke oracle datatypen LONG?
Avatar billede Slettet bruger
24. maj 2007 - 13:41 #21
Nu fandt jeg ud af at læse. Du skal bruge en procedure long2varchar. Og den skal bruges på prodserver-siden. Lav et view over dine data med anvendelse af konverteringen på prodserver-siden. Derefter kan du hente data fra view vha. database link
Avatar billede michael_stim Ekspert
24. maj 2007 - 14:17 #22
OK, på prod:
CREATE OR REPLACE FORCE VIEW schema.long2varchar
(felt1,osv)
AS
SELECT felt1,
dbms_metadata_util.long2varchar(4000, 'KSD_LINE', 'REMARKS',72) AS REMARKS,
felt700
FROM tabel;

Er det sådan du mener, altså konverteringen INDE i viewet.
Avatar billede michael_stim Ekspert
24. maj 2007 - 14:45 #23
Men den brokker sig stadig over dbms....
Avatar billede michael_stim Ekspert
24. maj 2007 - 15:00 #24
Opretter et nyt spørgsmål.
Avatar billede Slettet bruger
24. maj 2007 - 15:07 #25
tak for pointsene. ærgerligt at du stadig har problemer. held og lykke med det, dit view ser rigtigt ud.

hvis du tager en describe på dit view, kan du se, om feltet har en underlig definition.
Avatar billede michael_stim Ekspert
24. maj 2007 - 15:31 #26
SYS skal åbenbart give rettigheder til at bruge pakken dbms_metadata_util.
Kan man selv skrive en procedure der konverterer?
Avatar billede Slettet bruger
24. maj 2007 - 15:38 #27
hvis du er fræk, kan du jo altid køre som SYS, eller grante execute til din bruger.

der findes mange long2varchar ude på netter. du skal bare google:

http://www.akadia.com/services/ora_important_part_2.html

ideen er at oprette et felt mere, og konvertere data ind.

det nemmeste er som sagt at lave en export. hvis du har oracle klient på din maskine, kan du finde exp og imp installeret :-)
Avatar billede Slettet bruger
24. maj 2007 - 15:40 #28
ellers kunne du måske konverter feltet til en clob på begge maskiner? men man skal nok lige læse sig til, om man kan inserte til clobs med almindelig syntaks
Avatar billede michael_stim Ekspert
24. maj 2007 - 15:51 #29
Det var det jeg prøvede (imp/exp) men det tog en million år at importere. Exporterede til en sql-fil mha toad. Og så kørte jeg den sql_fil i sql-plus.
Avatar billede Slettet bruger
24. maj 2007 - 16:16 #30
jeg er ikke så velbevandret i TOAD. men det lyder som om du bare lavede et almindeligt udtræk i formatet INSERT.... med en insert pr. række?


hvis du går ned i oracles bin-katalog kan du køre det som

exp userid=navn/kode@prodforbindelse file=outputfil.dmp compress=N  log=exp.log tables=(mintable)

og importere med

imp userid=navn/kode@testforbindelse file=outputfil.dmp log=imp.log tables=(mintable)feedback=100000
Avatar billede michael_stim Ekspert
24. maj 2007 - 16:48 #31
Men så tager den vel tabelstrukturen med? Og så er jeg lige vidt med konverteringen fra number(38,2) til number(38,4). Det var grunden til at jeg tømte tabellen fra starten. Skal lige siges at jeg var så dum at IKKE checke størrelsen på den inden :(
Avatar billede michael_stim Ekspert
24. maj 2007 - 16:50 #32
PS. Hvor lang tid tror du 40 gig tager at importere/exportere. Og hvor lægger filen sig.
Avatar billede michael_stim Ekspert
24. maj 2007 - 16:51 #33
PS. du skal have 16 mill tak for hjælpen så længe.
Avatar billede Slettet bruger
24. maj 2007 - 18:39 #34
en imp kan godt foregå til nogenlunde kompatible rækker. der skulle ikke være noget problem med et number felt der er blevet til et number 38,4-felt.

Jeg tror import vil tage nogen tid. Men det er jo altid svært at sige. Husk at fjerne evt. indeks på target-tabellen først. Dem kan du bygge bagefter.

det er nok hurtigst, hvis du foretager export på prodserver, komprimerer den, kopierer den over på testserver, dekomprimerer og importerer.

PS: jeg synes det var godt du oprettede et spørgsmål mere. det er godt at se holdam komme på banen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester