» »

SQL backup import

SQL backup import

meh ::

Pozdravljeni,

Na MsSQL bazi, je pred cca mesecem dni prišlo do spremembe podatkov v nekaterih tabelah. Najverjetneje update, ki je povozil celotno zgodovino.
Danes sem opazil, da imajo vsi zapisi v tabeli nastavljeno isto ceno. Te cene žal ni mogoče izračunati s podatki iz drugih polj. Na takšen način so "popravljene vsaj 3 tabele vse skupaj približno 100.000 zapisov.
Da bi povrnil stanje, kot je bilo pred sprememo, je en način, da si izvozim Backup, ki je bil narejen pred manipulacijo podatkov, ter z nekaj update stavki povoziti ta polja, kjer so bile narejene spremembe.
Ker pa trenutno še ne vem točno, kolikšen je obseg spremenjenih podatkov, me zanima, če bi lahko uvozil stari backup, ki je bil narejen (1.3.2018), da povozi vse podatke do 1.3.2018 na trenutni bazi. Noveješi podatki od 2.3.2018 pa ostanejo? Obstaja takšna možnost?
Oz. kako bi vi rešili tak problem?

Hvala in Lp,
Meh

Iluvatar ::

Pozdravljen.
Jaz ponavadi tako težavo rešim z RedGate Data Compare. Restoram bazo iz backupa v neko drugo bazo, zaženem RedGate Data Compare in povem naj poišče vse kar je različno med obema bazama. Potem lahko za vsak zapis izbereš, ali ga boš prepisal ali ohranil ipd..
Data Compare mi je že dostikrat prišel prav, močno priporočam.

meh ::

Verjameš ali ne, ravno prenašam to orodje.
Koliko sem si uspel prebrati, bi z njim lahko rešil težavo.
Hvala za predlog.
Drugače pa ni možno v SSMS-ju uvoziti celoten backup v trenutno bazo (da prepiše vse podatke), vendar tisti podatki, ki so bili vnešeni po datumu backupa, pa pusti nespemenjene?
Ker kolikor sem gledal, lahko restoraš backup, vendar v takem primeru ne bi imel podatkov po 1.3....

Vazelin ::

Pa ti ne bo ta tul označil vsako vrstico za spremenjeno?

meh ::

Bom videl, kako bo. Ravno nameščam program

GupeM ::

Kaj pa, če restoraš backup na ločeno bazo, nato narediš export podatkov v takšen format, da lahko iz original baze deletaš vnose, ki se "ponovijo" v novi bazi, nato pa narediš insert teh novih.

Primer:
-- Original baza:
tabela1:
id  |xyz       |cena
----+----------+--------
1   |xyz1      |100
2   |xyz2      |100
3   |xyz3      |100
4   |xyz4      |50      -- Ta je bil vnešen po kritičnem datumu

backup_tabela:
id  |xyz       |cena
----+----------+--------
1   |xyz1      |12
2   |xyz2      |14
3   |xyz3      |76

Narediš export tabele iz backupa, ki ti generira delete statement: "Izbriši vse ID-je, ki so v backup tabeli"
DELETE FROM tabela1 WHERE id IN (1,2,3);

Narediš "import" tabele z inserti. Lahko s preprosto skripto, ali pa celo z enim SQL stavkom.: "Vstavi vse vrstice iz backup tabele"
INSERT INTO tabela1
select id,xyz,cena
from backup_tabela


Seveda moraš za ta čas verjetno onemogočiti (nekatere) constrainte, drugače ti lahko briše še kakšne druge podatke, ki jih nočeš izbrisati.

win64 ::

Če imaš na bazi vklopljen full transactional log lahko dobiš zgodovino vseh sprememb v računalniku prijazni obliki.
S programom kot je "SQL Server Transaction Log Reader" pa tudi v obliki SQL stavkov.

frudi ::

Ne rabiš nobenih posebnih orodij, če gre samo za tri tabele in so podatki, ki jih želiš popraviti, res lepo ločeni po datumu od tistih, ki jih ne želiš tikati.

Naredi restore backupa v neko drugo, začasno bazo. Potem pa na roke spiši update stavek, ki vse zapise, starejše od 1.3., popravi s podatki iz backup baze. Nekaj v stilu:

update  t
set     Cena = s.Cena
from    original_baza.dbo.Tabela1 as t
        inner join  backup_baza.dbo.Tabela1 as s on t.Id = s.Id
where   t.DatumZapisa <= '2018-03-01'
1ACDoHVj3wn7N4EMpGVU4YGLR9HTfkNhTd... in case I've written something useful :)

meh ::

Pozdravljeni,

Sem rešil zadevo z updati, ker se je izkazalo, da je bilo spremenjenih samo 6 polj v 3 tabelah.
Sem pa namestil program Data compare in je res uporaben, sploh na koncu, ko sem končal z updati, sem preveril ponovno preveril tabele z data compare-om, ki je lepo pokazal še tiste vrstice, ki so izvisele (kjer so manjkali podatki, ki so bili kot pogoj v updatu).
Tako, da hvala lepa za vaše predloge in pomoč.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

MSSQL na Linuxu

Oddelek: Programska oprema
5728 (506) Iluvatar
»

SQL vprasanje (strani: 1 2 )

Oddelek: Programiranje
687866 (4545) BivšiUser2
»

Izračun normale v C++ in povezava z Excelom

Oddelek: Programiranje
141517 (1167) primoz4p
»

mysql poizvedba

Oddelek: Izdelava spletišč
7766 (585) sebavet
»

[SQL] Unikatni izpisi

Oddelek: Programiranje
212053 (1440) 111111111111

Več podobnih tem