14. maj 2002 - 14:08Der 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?
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.
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.
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.
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!
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.
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)
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.
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.
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.
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.
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? :/
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
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.
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.
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.
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 :/
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.