Baza danych na oddzielnym serwerze - stworzenie backupu .bak na komputerze

0

Witam. Mam bazę danych na serwerze, udostępnioną w lokalnej sieci. Chciałbym napisać apkę, która robi backup bazy danych z tego serwera, ale nie na serwerze, a na komputerze z którego tę apkę uruchomiłem. Czyli dla lepszego zrozumienia:
Baza danych stoi na jakimś serverze z Windows Server. Mam sobie laptopa który jest podłączony do tej samej sieci i ma dostęp do bazy danych. Na tym laptopie odpalam sobie apkę, łączę się z bazą danych i plik .bak jest zapisywani na dysku laptopa, a nie serwera.

Jesteście w stanie mi pomóc z tym problemem?
Na ten moment napisałem jedynie tyle i mi niestety nie działa:

private static void CreateDatabaseBackup(string connectionString, string databaseName, string backupFilePath)
        {
            SqlConnection connection = new SqlConnection(connectionString);
            SqlCommand backupCommand = connection.CreateCommand();
            backupCommand.CommandText = $"BACKUP DATABASE {databaseName} TO DISK = '{backupFilePath}'";
            connection.Open();
            backupCommand.ExecuteNonQuery();
            connection.Close();
        }

Wyrzuca mi wyjątek : System.Data.SqlClient.SqlException: „Cannot open backup device 'C:\Backup\backup.bak'. Operating system error 3(The system cannot find the path specified.).
BACKUP DATABASE is terminating abnormally.”

Pewnie z tego powodu, iż próbuje zapisać plik na dysku serwera, a na nim nie ma ścieżki, określonej w zmiennej backupFilePath.
Chciałbym aby .bak był zapisywany na dysku urządzenia odpalającego aplikację.
Jak podejść do tego problemu?

1

Zakładam, ze masz MSSQL serwer. Pamiętaj, ze backup jest wykonywany z uprawnieniami konta systemowego (zwykle) na którym został uruchomiony serwis MSSQL. Jeżeli konto to nie ma uprawnień do danego folderu to się backupu nie zrobi. Poza tym lepszym rozwiązaniem wydaj mi się przygotowanie gotowej procedury przechowywanej odpowiedzialnej za wykonanie backupu (jak parametr można ewentualnie przekazać ścieżkę) i wywołanie tej procedury z programu. Procedurę możesz wtedy przetestować niezależnie od samego programu.

0

Robię to bo chciałbym napisać taką wygodną konsolówkę, która po podaniu danych do configa i odpaleniu, generuje plik backupu na urządzeniu z którego zostało odpalone. Jest takie coś w ogóle możliwe?

0

Tak rozumiem, ale tu jest inny problem.

Zalogowałem się na serwer na którym stoi baza, utworzyłem tam folder w ścieżce C:\Backup</code> i uruchomiłem ten program.
Wykonał się bez wyrzucenia wyjątku. Ponownie zalogowałem się na serwer, i w tym folderze pojawił się plik .bak.
Tu jest problem z tym, że ten plik jest tworzony na serwerze na którym stoi baza, a ja chciałbym aby był dostępny na innym urządzeniu(na którym odpaliłem aplikację).

0

Dobra to może opiszę cały problem. Kilka dni temu pytałem na tym forum jak zsynchronizować dwie bazy danych (np. test i prod). Dostałem informację, że najłatwiej będzie przez replikacje lub backup i restore. Wymogiem jest to, że tę synchronizację mam zrobić bez użycia SSMS i jak najbardziej automatycznie(wprowadzenie informacji do config, jakaś lekka konfiguracja, odpalenie apki). Pomyślałem więc o prostej konsolówce, która najpierw robi backup źródłowej bazy danych a później restore na docelową. Problemem jest właśnie to że bazy mogą być na dwóch różnych serwerach. Jak myślicie, iść dalej tą strategią? Czy jest jakaś lepsza w tym przypadku?

1

Prawdopodobnie na serwerze produkcyjnym masz możliwość ustawić SQL Agent Server Job'a który będzie robił backup bazy co 24h np. o 2-3 w nocy. Nastepnie te backupy są umieszczane w folderze jakimś na serwerze.

Nie będzie prościej napisać sobie konsolówkę która połączy sie do serwera i np. zrobi Ci listę plików z danego serwera/folderu i wybierzesz sobie co chcesz ściągnąć (domyślnie ostatni backup) i załadować do swojego lokalnego serwera dev?

//EDIT
Może rozwiązaniem problemu z zapisywaniem pliku BAK będzie dla Ciebie uruchomienie konsolówki jako autoryzowany użytkownik. Na plik EXE klikasz prawym z SHIFT i masz opcję uruchom jako admin/inny użytkownik.Może trzeba uruchomić jako MSSQLServer??

screenshot-20200516081831.png

0

Załóżmy, że backup jest na serwerze robiony cyklicznie raz dziennie, lecz jeśli nie posiada on usługi FTP, to i tak nie mogę pobrać z serwera tego backupu prawda?

1 użytkowników online, w tym zalogowanych: 0, gości: 1