W tym krótkim poradniku chciałbym opisać jak zainstalować serwer MS SQL, jak przywrócić bazę z kopii oraz w jaki sposób można wykonać kopię bazy. Całość będzie działać na serwerze QNAP z procesorem x86 a do instalacji wykorzystamy kontenery dockera od Microsoftu. Postaram się pokazać jak zrobić wszystko z linii komend oraz w skróconej formie jak wyklikać to w interfejsie Portainer.
Czego będziemy potrzebować?
Opis istotnych części polecenia:
Zmienne dockera: Docker run reference
Instalacja przez Portainer
JAK PODŁĄCZYĆ SIĘ DO SERWERA?
W aplikacji klienckiej podajemy następujące informacje:
IMPORTOWANIE / PRZYWRACANIE BAZY DANYCH
Jeśli posiadamy pliki .MDF oraz .LDF możemy spróbować podłączyć taką bazę do serwera SQL. Nie ma żadnej gwarancji, że to zadziała bo przyczyn może być wiele (niezgodne architektury serwera, nieobsługiwana wersja bazy / serwera itd.) ale jeśli nie mamy innej opcji to próbujemy :!
Jeśli posiadamy plik .BAK/.BAC lub ogólnie plik z kopią bazy wykonaną z serwera SQL jest większa szansa na odzyskanie bazy.
KOPIA ZAPASOWA BAZY DANYCH
Wykonać kopię bazy danych możemy na kilka sposobów. Podstawowym (ale nie zawsze bezpiecznym) będzie kopia samych plików MDF/LDF - zatrzymujemy kontener z serwerem, robimy kopię plików z woluminu mssql-data i uruchamiamy na nowo kontener.
Jednak lepszą metodą będzie zrobienie kopii bezpośrednio przez serwer bazy danych.
To polecenie wrzucamy tyle razy ile baz danych posiadamy (zmieniając nazwę bazy i pliku) lub tworzymy skrypt SQL np: Simple script to backup all SQL Server databases umieszczamy w woluminie mssql-backup i wywołujemy poleceniem:
Dokumentacja polecenia BACKUP: BACKUP (Transact-SQL) - SQL Server
FAQ
P: Gdzie znajdę kopie zapasowe utworzone w Management Studio (lub z konsoli)? Na Qnapie nie mam folderu
O: Domyślnie przykład tworzy odrębny wolumin na kopie zapasowe. Aby odnaleźć ścieżkę do tego katalogu trzeba przez SSH wykonać polecenie:
W tej ścieżce znajdziesz swoje kopie.
Alternatywnym rozwiązaniem może być bezpośrednie podłączenie katalogu
Podczas tworzenia kontenera należy zamienić jedną linię z
na
Tym sposobem kopie wykonane do katalogu
P: Problemy z uruchomieniem wersji 2019 - brak możliwości połączenia z serwerem, serwer wali błędy w konsoli!
O: Najprawdopodobniej problem z prawami dostępu do katalogów. Rozwiazaniem jest dodanie praw 777 do katalogów zawierających twoje woluminy. np.:
Dokładne ścieżki do woluminu można uzyskać poleceniem:
https://forum.qnap.net.pl/threads/ts-x31k-i-docker-mssql.39858/post-177066
Jeśli macie jakieś uwagi, konstruktywną krytykę lub dodatkowe informacje warte umieszczenia piszcie, post będzie uzupełniany.
Czego będziemy potrzebować?
- Serwera QNAP z procesorem x86
Serwery NAS firmy QNAP - oficjalna strona w Polsce (NAS) - Aplikacji Container Station
https://www.qnap.com/pl-pl/app_cent...on=2.2.14.1638&II=313&qts=4.5.1&seq=16&os=qts - Podstawowej wiedzy nt. linuksa, SSH i dockera
- (opcjonalnie) Aplikacji Portainer do łatwiejszego zarządzania kontenerami
Docker Hub
Jak zainstalować: Rozwiązany - Moje dockery - (opcjonalnie) SQL Server Management Tools
Download SQL Server Management Studio (SSMS) - SQL Server Management Studio (SSMS)
- Łączymy się z serwerem QNAP przez SSH
- Tworzymy trzy woluminy np. o nazwach mssql-data, mssql-log oraz mssql-backup - jeden będzie przechowywał bazy danych, drugi wykorzystamy do sprawdzania logów serwera a trzeci na kopie zapasowe i do odtwarzania danych w przypadku awarii / migracji itp.
Bash:docker volume create mssql-data docker volume create mssql-log docker volume create mssql-backup
Możemy pominąć tworzenie woluminu mssql-backup a zamiast tego wskazać dowolny katalog na Qnapie (patrz kolejny krok). - Następnie tworzymy kontener MS SQL Server (tutaj w ostatniej wersji 2017)
Bash:docker run \ --name 'mssql' \ -e 'ACCEPT_EULA=Y' \ -e 'MSSQL_PID=Express' \ -e 'SA_PASSWORD=yourStrong(!)Password' \ -v mssql-data:'/var/opt/mssql/data/' \ -v mssql-log:'/var/opt/mssql/log' \ -v mssql-backup:'/var/backups/' \ -p 1433:1433 \ -e 'MSSQL_MEMORY_LIMIT_MB=4096' \ --memory="4096m" \ --restart=unless-stopped \ -d mcr.microsoft.com/mssql/server:2017-latest
Mapujemy katalog/share/Public
do katalogu/var/backups/
w kontenerze. Tym sposobem kopie zapasowe stworzone w katalogu/var/backups/
będą widoczne w katalogu/share/Public
na Qnapie.
Bash:docker run \ --name 'mssql' \ -e 'ACCEPT_EULA=Y' \ -e 'MSSQL_PID=Express' \ -e 'SA_PASSWORD=yourStrong(!)Password' \ -v mssql-data:'/var/opt/mssql/data/' \ -v mssql-log:'/var/opt/mssql/log' \ -v /share/Public:'/var/backups/' \ -p 1433:1433 \ -e 'MSSQL_MEMORY_LIMIT_MB=4096' \ --memory="4096m" \ --restart=unless-stopped \ -d mcr.microsoft.com/mssql/server:2017-latest
Opis istotnych części polecenia:
-e 'MSSQL_PID=Express'
– jakiej edycji serwera SQL użyć - w tym przypadku Express, można podać swój klucz produktu. Domyślnie uruchamiany jest SQL Server Developer-e 'SA_PASSWORD=yourStrong(!)Password'
– po znaku = podajemy hasło do serwera SQL, tym hasłem będziemy się posługiwali w aplikacjach itd. Hasło powinno być trudne do odgadnięcia oraz wystarczająco długie / skomplikowane aby nie dało się go złamać metodą siłową.-p 1433:1433
– port serwera (domyślny 1433), w większości aplikacji nie musimy podawać domyślnego portu połączenia.-e 'MSSQL_MEMORY_LIMIT_MB=4096' --memory="4096m"
– ustawiamy limit pamięci na 4096 MB - dopasowujemy tą wartość w zależności od przewidywanego obciążenia serwera (+20%) oraz możliwości QNAP-a.
Zmienne dockera: Docker run reference
Instalacja przez Portainer
JAK PODŁĄCZYĆ SIĘ DO SERWERA?
W aplikacji klienckiej podajemy następujące informacje:
- Nazwa serwera / host / adres serwera: ADRES IP QNAPA
- Port (jeśli takie pole występuje): 1433 (lub ten który podaliśmy przy -p)
- Użytkownik: sa
- Hasło: hasło podane przy tworzeniu kontenera po SA_PASSWORD=
ADRES_IP:pORT
np. 192.168.0.1:21433
IMPORTOWANIE / PRZYWRACANIE BAZY DANYCH
Jeśli posiadamy pliki .MDF oraz .LDF możemy spróbować podłączyć taką bazę do serwera SQL. Nie ma żadnej gwarancji, że to zadziała bo przyczyn może być wiele (niezgodne architektury serwera, nieobsługiwana wersja bazy / serwera itd.) ale jeśli nie mamy innej opcji to próbujemy :!
- Kopiujemy pliki bazy na wolumin mssql-data (zarówno plik MDF jak i LDF)
- Uruchamiamy SSMS i logujemy się do serwera
- Klikamy prawym przyciskiem na Databases i wybieramy Attach...
- Dodajemy plik i wskazujemy nasz plik MDF (LDF podłączy się automatycznie)
- Klikamy OK i czekamy
- Jeśli nie wystąpią błędy baza powinna pojawić się na liście i w aplikacji która ma jej używać - weryfikujemy czy zawiera dane których potrzebujemy.
Jeśli posiadamy plik .BAK/.BAC lub ogólnie plik z kopią bazy wykonaną z serwera SQL jest większa szansa na odzyskanie bazy.
- Kopiujemy plik kopii na wolumin mssql-backup (lub do katalogu który wskazaliśmy podczas tworzenia kontenera)
- Uruchamiamy SSMS i logujemy się do serwera
- Klikamy prawym przyciskiem na Databases i wybieramy Restore Database...
- Source zmieniamy na Device
- Klikamy na ... i dodajemy nasz plik .BAK/.BAC z lokalizacji
/var/backups
(jeśli go nie widać zmieniamy filtr na All Files (**)) i klikamy OK
- Klikamy OK i czekamy, pojawi się komunikat o zakończeniu operacji.
- Jeśli nie wystąpią błędy baza powinna pojawić się na liście i w aplikacji która ma jej używać - weryfikujemy czy zawiera dane których potrzebujemy
- Kopiujemy plik kopii zapasowej do woluminu mssql-backup (lub do katalogu który wskazaliśmy podczas tworzenia kontenera)
- Logujemy się do serwera QNAP przez SSH
- Dostajemy się do kontenera przez polecenie:
Bash:docker exec -i mssql /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'yourStrong(!)Password'
- Wpisujemy polecenie odtworzenia kopii (zmieniamy nazwę bazy oraz nazwę pliku na własną)
SQL:RESTORE DATABASE NAZWA_BAZY FROM DISK = '/var/backups/PLIK-KOPII.BAK' GO
SQL:RESTORE DATABASE CDN_FIRMA_DEMO FROM DISK = '/var/backups/CDN_FIRMA_DEMO-210101.BAK' GO
KOPIA ZAPASOWA BAZY DANYCH
Wykonać kopię bazy danych możemy na kilka sposobów. Podstawowym (ale nie zawsze bezpiecznym) będzie kopia samych plików MDF/LDF - zatrzymujemy kontener z serwerem, robimy kopię plików z woluminu mssql-data i uruchamiamy na nowo kontener.
Jednak lepszą metodą będzie zrobienie kopii bezpośrednio przez serwer bazy danych.
- Logujemy się do serwera QNAP przez SSH
- Dostajemy się do kontenera przez polecenie:
Bash:docker exec -i mssql /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'yourStrong(!)Password'
- Wpisujemy polecenie wykonania kopii (zmieniamy nazwę bazy na własną)
SQL:BACKUP DATABASE NAZWA_BAZY TO DISK = '/var/backups/PLIK-KOPII.BAK' GO
SQL:BACKUP DATABASE CDN_FIRMA_DEMO TO DISK = '/var/backups/CDN_FIRMA_DEMO-210101.BAK' GO
- Tak stworzona kopia pojawi się w woluminie mssql-backup (lub w katalogu który wskazaliśmy przy tworzeniu kontenera) skąd możemy go skopiować w dowolne miejsce.
Bash:
docker exec -i mssql /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'yourStrong(!)Password' -Q "BACKUP DATABASE CDN_FIRMA_DEMO TO DISK = '/var/backups/CDN_FIRMA_DEMO.BAK'"
Bash:
docker exec -i mssql /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'yourStrong(!)Password' -i '/var/backups/backup-all.sql'
Dokumentacja polecenia BACKUP: BACKUP (Transact-SQL) - SQL Server
FAQ
P: Gdzie znajdę kopie zapasowe utworzone w Management Studio (lub z konsoli)? Na Qnapie nie mam folderu
/var/backups/
?!O: Domyślnie przykład tworzy odrębny wolumin na kopie zapasowe. Aby odnaleźć ścieżkę do tego katalogu trzeba przez SSH wykonać polecenie:
Bash:
docker volume inspect mssql-backup | jq .[0].Mountpoint
Alternatywnym rozwiązaniem może być bezpośrednie podłączenie katalogu
/var/backups/
kontenera do katalogu na Qnapie.Podczas tworzenia kontenera należy zamienić jedną linię z
-v mssql-backup:'/var/backups/' \
na
-v /share/Public:'/var/backups/' \
Tym sposobem kopie wykonane do katalogu
/var/backups/
wylądują w /share/Public
na Qnapie.P: Problemy z uruchomieniem wersji 2019 - brak możliwości połączenia z serwerem, serwer wali błędy w konsoli!
O: Najprawdopodobniej problem z prawami dostępu do katalogów. Rozwiazaniem jest dodanie praw 777 do katalogów zawierających twoje woluminy. np.:
Bash:
chmod -R 777 /share/CACHEDEV1_DATA/Container/container-station-data/lib/docker/volumes/mssql-data
chmod -R 777 /share/CACHEDEV1_DATA/Container/container-station-data/lib/docker/volumes/mssql-logs
chmod -R 777 /share/CACHEDEV1_DATA/Container/container-station-data/lib/docker/volumes/mssql-backups
Bash:
docker volume inspect NAZWA_WOLUMINU | jq .[0].Mountpoint
Jeśli macie jakieś uwagi, konstruktywną krytykę lub dodatkowe informacje warte umieszczenia piszcie, post będzie uzupełniany.