Avatar billede kh-proffcom Nybegynder
14. maj 2002 - 14:08 Der er 35 kommentarer og
1 løsning

Kompliceret Import/Export af data ml. servere.

Hej.

Jeg skal have lavet en scheduled pakke som hver dag kopierer data fra én andens server til min server.

De data den skal kopiere er MANGE data, og den skal derfor ikke kopiere alt, men kun de nyeste. Alle dataene har et unikt ID som man kan genkende dem på.

Jeg har desværre kun read adgang til den anden server, og kan derfor ikke sætte en trigger eller andet op på den.

Det jeg havde tænkt mig at man kunne gøre, var at køre en sætning ala' dette af i en import:

SELECT * FROM src$tabel WHERE src$tabel.id > MAX(dst$table.id) AND src$tabel.id < MAX(src$tabel.id)

Som i kan se er jeg ikke den store SQL mester, men det var mest for at forklare det. Grunden til at jeg tager en max er at der hele tiden bliver genereret nye data i serveren, så jeg er bange for at den ikke stopper.

Problemet er at jeg ved ikke hvordan jeg kan trække dataene fra den anden server. JEg har et login og et password, men hvordan bruger jeg det i en SQL sætning?

Håber i kan hjælpe mig?
Avatar billede rou Nybegynder
14. maj 2002 - 14:16 #1
Du skal have fat i serveren, og sætte det der hedder en Replikering op.
Den kan du lave, så den opdaterer den ene server, til at matche indholdet af den anden, og kun kopiere forskellene.

Det er faktisk den eneste "ansvarlige" måde at gøre det på, da serveren låser tilstanden i de 2 databaser under afviklingen. Ellers risikerer du at der sker ændringer, imedens du arbejder.

Jeg kan kun anbefale at du læser op på lektien. Books Online som følger med MSSQL server, er at anbefale.
Avatar billede ocp Nybegynder
14. maj 2002 - 14:17 #2
Umiddelbart ville det nok være lettest for dig at bruge DTS. Det er godt nok ikke den hurtigste overførsel, men til gengæld er det let at bruge.

Du finder det i Enterprise Manager under "Data Transformation Services" og vælg så at lave en "Local Package".

Det går lidt vidt at forklare hvordan DTS benyttes i detaljer, men fidusen er at du kan kopiere data fra en tabel på en server til en anden tabel på en anden server og benytte sql-sætninger til at begrænse udtrækket.
Avatar billede ocp Nybegynder
14. maj 2002 - 14:18 #3
Replikering kræver da at du har skriveadgang til den server du trækker data fra, så vidt jeg husker?
Avatar billede ocp Nybegynder
14. maj 2002 - 14:19 #4
For at kunne sætte replikering op, mener jeg.
Avatar billede terry Ekspert
14. maj 2002 - 14:22 #5
In your DTS package make a transform data task and set the Query to something like

SELECT * FROM tbl1 T1 WHERE (NOT EXISTS (SELECT 1 FROM tbl2 T2 WHERE T1.IDField = T2.IDField ))
Avatar billede tmceu Praktikant
14. maj 2002 - 14:23 #6
Jeg vil give rou ret i, at replikering er den eneste anstændige måde at gøre det på. Specifikt lyder det som om Snapshot Replication er det rigtige. Men det lyder ikke som om du burde kaste dig ud i det alene, med det SQL kendskab du umiddelbart demonstrerer :-)

Replikering er pærelet at sætte op, men umådelig svært at troubleshoote på for slet ikke at nævne at fjerne igen.

Hvilken adgang der kræves på hvilke servere, afhænger af hvem der er publisher.
Avatar billede terry Ekspert
14. maj 2002 - 14:32 #7
You add your server to the server group and then in th eDTS package you add a connection which uses that  server.

If you use the scheduler to start your package you need to make sure that the server where you run the package has PERMISSIONS to access the data on the other server. It is NOT your permissions!
Avatar billede tmceu Praktikant
14. maj 2002 - 14:53 #8
Det er ikke en særlig robust løsning at anvende DTS til dette formål og slet ikke som det er foreslået. Bl.a. forudsætter det, at der aldrig ændres i eksisterende data eller at ændringer ignoreres ift. server 2.

terry >> du behøver ikke at registrere serveren for at kunne anvende den i en DTS pakke, da du angiver serveren direkte i DTS pakken.
Avatar billede terry Ekspert
14. maj 2002 - 15:03 #9
why is DTS not robust?
"men kun de nyeste" = NEW

The example I gave ONLY copies new records over, it would be simple enough to check if there have been updates and copy those over too.
No need to make it sound difficult tmceu :o)
Avatar billede ocp Nybegynder
14. maj 2002 - 15:19 #10
Det er da noget vrøvl at DTS skulle være u-robust (hedder det virkelig det?). I DTS kan man lave præcis det samme som kan lade sig gøre gennem query analyzer (+ en del mere, bl.a. benytte VB-script). Derfor kan det selvfølgelig lade sig gøre at håndtere gentagne opdateringer - også af eksisterende data.
Avatar billede terry Ekspert
14. maj 2002 - 15:25 #11
At the moment I am working on a similar project involving many tables and servers and DTS has NO problems at all! Also large amounts of data!

What amount of data are we talking about?
Avatar billede tmceu Praktikant
14. maj 2002 - 15:43 #12
terry / ocp >> én af de grundregler man aldrig bør forbryde sig mod er, at data skal være konsistente. En så simpel "replikering" som det reelt er der foreslås (og som der ganske rigtig spørges efter), vil skabe inkonsistens mellem de 2 servere, hver gang en record ændres i kilden, hvis dette sker.

Dette er uacceptabelt i de fleste situationer. Jeg prøver derfor ikke at gøre det mere svært end det er, men vil blot sikre mig at spørgeren er klar over disse konsekvenser/begrænsninger. Hvis man vil holde flere servere synkrone, er ægte replikering måden at gøre det på.

Mange spørgsmål i et forum som dette oprettes i "kampens hede", hvor spørgeren måske ikke altid har tænkt alle konsekvenser igennem, eller ikke forstår konsekvenserne. Jeg mener derfor at vi, der måske er mere erfarne bør sikre os at vi ikke blot gør spørgeren en bjørnetjeneste.

Og sidst men ikke mindst: Skyldes Jeres varme anbefaling reelle erfaringer med DTS vs. replikering, eller er det fordi I bare altid har anvendt DTS ?

- det er ikke min mening at lyde overklog, men det er min erfaring, at de fleste ikke har reelle erfaringer med replikering.
Avatar billede terry Ekspert
14. maj 2002 - 15:47 #13
I hope hkh-proffcom HAS thought about the question placed ....
"men kun de nyeste." !!!!!!!

Otherwise replication would also be an idea
Avatar billede ocp Nybegynder
15. maj 2002 - 10:17 #14
Jeg har benyttet både replikering og DTS og begge metoder egner sig glimrende til hver deres opgave. Denne opgave kræver tydeligvis en bedre "styring" af hvilke data der overføres end normal replikering kan klare. Desuden er der problematikken med at få sat replikering op når man ikke er administrator på publisher-maskinen.

Jeg mener helt klart at min anbefaling er den mest korrekte og enkleste måde at løse det beskrevne problem. Jeg er ikke specielt pro-DTS da performance gør det uegnet til DataWarehouse-brug, men til mindre opgaver er det et godt værktøj.
Avatar billede terry Ekspert
15. maj 2002 - 10:19 #15
If you have bad performance with DTS then your doing something wrong!
Avatar billede ocp Nybegynder
15. maj 2002 - 10:22 #16
In my experience it is a lot faster to transfer data using only T-SQL while DTS generates some overhead on most operations.
Avatar billede kh-proffcom Nybegynder
17. maj 2002 - 08:29 #17
De data jeg har liggende på serveren er faste data. De har allesammen et ID og bliver oprettet i rækkefølge. De bliver ikke opdateret eller ændret.
Jeg skal have dataene over på en anden server, da den står og tygger dataene igennem. Iøjeblikket kopierer vi dem manuelt, hvor vi tager det højeste tal/ID fra destination serveren og lægger én til, og så tager vi den højeste på source serveren og kopierer de data over. Jeg vil gerne have den til at gøre det automatisk om natten, hvilket også er grunden til at jeg skrev sql sætningen som jeg gjorde.
Spørgsmålet er bare hvordan jeg får lov til at tage det højeste tal fra destination serveren?

Som det er nu ser den sådan her ud i en DTS pakke:
select    *
from    [src$tabel]
where    ([src$tabel].[Entry No.] >= 314060705)
      and ([src$tabel].[Entry No. ] < 314390947)

Og tallene bliver indtastet manuelt og dermed bliver den også kørt manuelt. Jeg ønsker at kunne sætte den til det selv om natten, og så den selv finder de tal den skal finde.

Håber i er med?
Avatar billede terry Ekspert
21. maj 2002 - 13:57 #18
Should we be, you have rejected all answers!
Avatar billede kh-proffcom Nybegynder
22. maj 2002 - 15:18 #19
my problem havent been solved.
Avatar billede terry Ekspert
22. maj 2002 - 15:47 #20
SELECT * FROM [src$tabel] L WHERE (NOT EXISTS (SELECT 1 FROM TheServer.dbo.[src$tabel] SV WHERE L.[src$tabel] = SV.[src$tabel]))


This query will ONLY select records from the LOCAL database which DO NOT exist on the server

You don NOT need to reject my answer until we are finished with this question!
Avatar billede terry Ekspert
22. maj 2002 - 15:47 #21
you need to replace TheServer with the name of the server you are copying to
Avatar billede kh-proffcom Nybegynder
23. maj 2002 - 16:59 #22
Wont this take a lot of resources?
I'm going to transfer 220000 records each time.
Avatar billede terry Ekspert
23. maj 2002 - 19:01 #23
Are you saying that you are going to INSERT 220000 NEW records or do some of them already exist?

It is just a normal select so should require more resources than other methods! I use the same method, also with MANY records an dit works fine!
Avatar billede kh-proffcom Nybegynder
27. maj 2002 - 16:37 #24
Jeg har nu fået konstrueret en SQL sætning som kan give mig de rigtige data. Denne SQL sætning har jeg lavet via Query Analyser på destination serveren. Nu er problemet så at når jeg laver en Import/Export DTS via wizarden, så vil den have SQL sætningen til at køre på Source serveren.

Det kan jeg ikke bruge til noget, da jeg har oprettet source serveren som en linked server. Det kan jeg ikke få lov til på source serveren, så SQL sætningen SKAL køre på destination maskinen.

Hvordan kan jeg bestemme at den skal køre den SQL sætning på destination serveren? :/
Avatar billede terry Ekspert
27. maj 2002 - 18:47 #25
Now I cant see you DTS but you will more than likely have two connections one for the local and one for the "other"

Now select a Transform Data Task from the Task menu. Once this is done you should have black arrow(line) between both connections.
Double click the line. This will now open th eproiperties window. Choose SQL Query from the two radion buttons. Now eneter your SQL in the window. For the tables which are local you do not need to give the server group just the table name. For those on another server you will need to add the complete name of the tables. (server.database.owner_name.object_name )
owner name is normally dbo
Avatar billede kh-proffcom Nybegynder
28. maj 2002 - 10:19 #26
The problem is that the SQL query will be run on the source server.

My SQL query looks like this:
USE DstTable
SELECT *
FROM    SrcServer.SrcDB.dbo.SrcTable
WHERE [Entry No.] BETWEEN (SELECT MAX([Entry No.])
              FROM dbo.DstTable)
      AND (SELECT MAX([Entry No.])
                FROM SrcServer.SrcDB.dbo.SrcTable)

SrcServer er oprettet som en linked server. Jeg har ikke mulighed for at oprette linked server på DstServer.
Avatar billede ocp Nybegynder
28. maj 2002 - 11:03 #27
Den skal ikke oprettes som linked server - blot som almindelig server på linie med den "lokale" server.
Avatar billede kh-proffcom Nybegynder
28. maj 2002 - 11:09 #28
Jeg har ingen rettigheder på SrcServeren til at oprette noget som helst. Jeg har kun en ODBC.
Avatar billede kh-proffcom Nybegynder
28. maj 2002 - 11:34 #29
Derudover kan SrcServeren ikke se DstServeren.
Avatar billede ocp Nybegynder
28. maj 2002 - 12:31 #30
Opret DTS-pakken på DstServeren og lav din connection som ODBC (vælg "Other" i "Data source") - det er således ikke nødvendigt at Src kan se Dst.
Avatar billede kh-proffcom Nybegynder
28. maj 2002 - 13:11 #31
Den SQL sætning jeg laver, bliver kastet imod SrcServeren, og det er det jeg vil undgå. Jeg kan sagtens få de data jeg vil have hvis jeg sender sætningen til DstServeren, men når det er en import/export kan jeg kun smide sætningen imod SrcServeren.
Avatar billede kh-proffcom Nybegynder
28. maj 2002 - 13:35 #32
Jeg tror jeg har fundet en løsning. Jeg kopier fra DstServer til DstServer, hvor så serveren selv finder data'ene frem.
Jeg tester det lige her senere. Der er ret meget tryk på serveren lige nu.
Avatar billede kh-proffcom Nybegynder
28. maj 2002 - 18:42 #33
Hmm.. Det resulterede i at den bare stod og kopierede flere data end den skulle, indtil jeg stoppede den.
Når jeg tog samme query, bare med en COUNT(), så fik jeg 140000, men jeg stoppede den da den havde kopieret over 400000?! ¨Så det virkede altså ikke :/
Avatar billede kh-proffcom Nybegynder
18. juli 2002 - 16:41 #34
Lukkes
Avatar billede kh-proffcom Nybegynder
18. juli 2002 - 16:43 #35
Lukkes
Avatar billede terry Ekspert
18. juli 2002 - 17:52 #36
tak for !
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