Skocz do zawartości

Błąd podczas aktualizacji z wersji 37.1.0 do 38.0.0/38.0.1

Polecane posty

Dzień dobry.

 

Ogólny rys sytuacyjny:

- baza jest zainstalowana na Windows Server 2019 Standard 64bit

- baza to MSSQL 2019 Standard 64bit

MSSQL-dane.png.c27ef14a3e60309be34df1265bdac01b.png

- na serwerze są trzy bazy dla trzech różnych podmiotów (nazwijmy je A, B i C), z tego co pamiętam wszystkie są w wersji PRO, aktywne od 2018-03-23.

- na serwerze są także bazy dla innych programów (ale to nie powinno mieć znaczenia w tym przypadku)

MSSQL-bazy.png.adf5f88bcd0eab7ad9f7bcd3f2317bbd.png

 

Stan "działający"

Do 18.12.2021 wszystko było OK. Program był w wersji 37.1.0.4997 i do takiej też wersji były przystosowane bazy wszystkich trzech podmiotów.

18.12.2021 została pobrana wersja 38.0.0.5094, a następnie zaktualizowana. Po aktualizacji po kolei nastąpiło logowanie do wszystkich trzech podmiotów celem aktualizacji bazy. Podmiot A i B zostały zaktualizowane bez problemów. Przy podmiocie C wyskoczył komunikat, że aktualizacja nie może zostać przeprowadzona ponieważ inne stanowisko jest podłączone do bazy. 18.12.2021 podmiot C pozostał w stanie bazy dla wersji 37.1.0.4997 i aż do dzisiaj, tj. do 29.12.2021 nikt się tam nie logował (przez okres świąteczny).

Dzisiaj podczas próby logowania aplikacja zapytała czy zaktualizować bazę, po wybraniu "Tak" ukazał się komunikat

 

131290591_Insert-bd.png.2f680c888297403b77622ce868052d1d.png

Raporty z aktualizacji są w załączniku - są to dwa różne raporty - pierwszy jest z pierwszej próby aktualizacji, natomiast drugi z każdej kolejnej. Generalnie najpierw występuje błąd

 

Invalid object name 'dbo.RegulyAutomatyzacjiZmianaPrzesunieciaWykonaniaNaOpoznienieWykonaniaTemp'.

a za każdym kolejnym razem

Cannot insert duplicate key row in object 'ModelDanychContainer.StanyAplikacji' with unique index 'AS_IDX_UzytkownikId_Klucz'. The duplicate key value is (<NULL>, Tagi_Klienci).

i nie ma możliwości dostać się do danych.

 

Po przywróceniu bazy do wersji 37.1.0.4997 programem serwisowym można uruchomić program z bazą w wersji 37.1.0.4997 (przy każdym uruchomieniu jest pokazywany monit o uaktualnienie wersji bazy danych). Jednak ponowna próba aktualizacji bazy do nowej wersji kończy się tymi samymi błędami.

 

Próbowaliśmy także pominąć aktualizację bazy do wersji 38.0.0 i zaktualizować ją do wersji 38.0.1 zarówno z niedziałającej 38.0.0 jak i działającej 37.1.0 - efekt jest taki sam - najpierw błąd `Invalid object name` a następnie cały czas `Cannot insert duplicate key row in object`.

 

Do przeżycia byłby scenariusz, gdzie trzeba by wrócić do kopii z 18.12.2021 (chociaż nie jest to najszczęśliwsze rozwiązanie) ale to też nie zadziałało.

 

Jeśli ktoś ma jakąś wskazówkę co może być przyczyną albo gdzie szturchnąć palcem, żeby aktualizacja zadziałała to będzie super. Nie ukrywam, że nie dość, że jest koniec miesiąca to jeszcze koniec roku i dostęp do danych jednak by się przydał.

 

 

Nexo_raport pierwszy.txt Nexo_raport drugi.txt

Edytowane przez Michał Dyrała
Link to postu

Dzień dobry,

do wersji 38.0.0 oraz 38.0.1 wkradł się problem, który objawia się błędem podczas przeprowadzania konwersji danych. Jest on nam znany i występuje podczas próby jej wykonania na użytkowniku (logującym się na SQL Server), u którego domyślna schema została zmieniona z "dbo" na jakąś inną. Błąd ten zostanie poprawiony w wersji 39.

 

Kroki, które należy podjąć w celu samodzielnego rozwiązania problemu:

1. Należy przywrócić podmiot do wersji sprzed aktualizacji, czyli np. 37.1

2. Należy wykonać załączony skrypt - wykona on się poprawnie tylko na koncie użytkownika, u którego domyślna schema jest inna niż "dbo".

3. Można dokonać próby aktualizacji do wersji 38.

NaprawaKonwersji_V38.sql

Edytowane przez Michał Gałecki
Link to postu

Dziękuję bardzo za odpowiedz.

 

Udało mi się przywrócić podmiot do życia. Skrypt okazał się bardzo pomocny, jednak sam problem rozwiązałem trochę inaczej. Po pierwsze faktycznie ten felerny podmiot miał ustawioną inną schema niż dbo w mapowaniu użytkownika (wszystkie trzy podmioty korzystają z tego samego usera do połączenia do bazy) i tabele ze skryptu zostały utworzone w tym schema a nie w dbo.

 

Wracając do naprawy (może komuś się przyda) to tak:

1. zmienić default_schema użytkownikowi na dbo

2. utworzyć w schemacie dbo trzy tabele ze skryptu

3. przekopiować do nich rekordy z istniejących tabel, które zostały utworzone podczas aktualizacji

4. usunąć tabele utworzone przez aktualizację

5. usunąć z tabeli ModelDanychContainer.StanyAplikacji, o ile istnieją, cztery OSTATNIE rekordy Tagi_Klienci, Tagi_Przychody, Tagi_Rozchody oraz Tagi_Asortyment. Jeśli tego nie zrobimy to podczas aktualizacji dostaniemy wyjątek 

Cannot insert duplicate key row in object 'ModelDanychContainer.StanyAplikacji' with unique index 'AS_IDX_UzytkownikId_Klucz'. The duplicate key value is (<NULL>, Tagi_Klienci).

Teraz można uruchomić aktualizację i trzymać kciuki, żeby się udała. Oczywiście nie muszę przypominać o wykonaniu kopii zapasowej PRZED jakimikolwiek zmianami w bazie.

Poniżej skrypt, który realizuje kroki 2-4 (u mnie zamiast dbo był ustawiony schemat ModelDanychContainer więc jeśli ktoś będzie miał inny to musi to zmienić)

 

CREATE TABLE dbo.RegulyAutomatyzacjiZmianaPrzesunieciaWykonaniaNaOpoznienieWykonaniaTemp
(
    idReguly int not null,
    przesuniecieWykonania int,
    godzinaWykonania time
);
insert into dbo.RegulyAutomatyzacjiZmianaPrzesunieciaWykonaniaNaOpoznienieWykonaniaTemp select * from ModelDanychContainer.RegulyAutomatyzacjiZmianaPrzesunieciaWykonaniaNaOpoznienieWykonaniaTemp;
drop table ModelDanychContainer.RegulyAutomatyzacjiZmianaPrzesunieciaWykonaniaNaOpoznienieWykonaniaTemp;

CREATE TABLE dbo.UbezpieczeniaWlascicielskieZUSPrzeniesieWartosciPreferencyjneOdTmp
(
    IdUbezpieczenia int NOT NULL,
    PreferencyjneOd DateTime
);

INSERT INTO dbo.UbezpieczeniaWlascicielskieZUSPrzeniesieWartosciPreferencyjneOdTmp SELECT * FROM ModelDanychContainer.UbezpieczeniaWlascicielskieZUSPrzeniesieWartosciPreferencyjneOdTmp;
drop table ModelDanychContainer.UbezpieczeniaWlascicielskieZUSPrzeniesieWartosciPreferencyjneOdTmp;
    
CREATE TABLE dbo.ParametryDokumentowDoKsiegowania_InterwalAutomatyznejWymianyOnline_Tmp
(
  InterwalAutomatycznejWymianyOnline int not null
);

insert into dbo.ParametryDokumentowDoKsiegowania_InterwalAutomatyznejWymianyOnline_Tmp select * from ModelDanychContainer.ParametryDokumentowDoKsiegowania_InterwalAutomatyznejWymianyOnline_Tmp;
drop table ModelDanychContainer.ParametryDokumentowDoKsiegowania_InterwalAutomatyznejWymianyOnline_Tmp;

 

  • Lubię to 2
Link to postu
×
×
  • Dodaj nową pozycję...