poniedziałek, 2 czerwca 2014

Konfigurowanie połączenia DB2 na Windows z TSM

Jestem, że tak powiem, windowsowo niepełnosprawny, więc pewne rzeczy, które odkryłem, mogą być dla większości oczywiste :-)

Dokumentacja, na którą skieruje nas życzliwy wujek "g" jest, jak się okazuje, równie szowinistyczna względem łindołsów jak i ja. Niby w tytule jest "Linux, Unix and Windows", ale jakoś wszystkie przykłady mają w ścieżkach "/" a nie "\".

W skrócie wszystko wygląda dobrze:
Żeby podłączyć DB2 do TSM wystarczy instancji ustawić 3 zmienne środowiskowe:

  • DSMI_DIR - wskazującą na katalog gdzie jest agent dsmtca.
  • DSMI_CONFIG - pokazującą na plik "dsm.opt" jakiego DB2 ma użyć do połązczeń.
  • DSMI_LOG - katalog, do którego ma zostać zapisany log dsierror.log
Jasne? Tak, ale.
Ale nr 1 - na Windows nie ma dsmtca. Na Unixach to narządko jest odpowiedzialne za odpalanie części klienta na prawach roota (ma suid). Na wiodącym systemie jest to załatwiane inaczej, dlatego na Windzie ta zmienna powinna po prostu wskazywać na katalog "baclient", czyli przeważnie c:\Program Files\Tivoli\TSM\baclient.
Ale nr 2 - Na Windows można ustawiać zmienne środowiskowe na dwa sposoby: Po bożemu: w skrypcie, albo jakoś dziwnie, klikając prawym klawiszem gryzonia na "My Computer" itd.. Oba sposoby działają... połowicznie. To znaczy da się to wszystko ustawić, ale działa tylko częściowo: daje się bazie ustawić hasło z jakim ma się zgłaszać do TSMa, ale sam backup i restore nie działają. I tu dochodzimy do...
... Ale nr 3 - Zmienne środowiskowe dla instancji bazy DB2 należy ustawiać w jej własnym rejestrze zmiennych, którym manipuluje się poleceniem db2set. Ale (nr 4) nie bezpośrednio. Otóż przy pomocy zmiennej DB2_VENDOR_INI, ustawianej tymże narzędziem, wskazuje się plik, w którym ustawia się zmienne DSMI_*. To "Ale nr 4" to już moja złośliwość, bo to tak naprawdę fanaberia DB2 a nie systemu, bo na Unixach jest tak samo. To tyle komentarzy, poniżej zawarłem zatem nieco uściślony algorytm konfigurowania styku DB2 i TSM.

Ustawienia DB2


1. Stworzyć plik c:\db2tsm\db2tsm.env (nazwa i lokalizacja dowolna, liczy się treść) i umieścić w nim zmienne środowiskowe potrzebne do znalezienia TSMa przez DB2:

DSMI_DIR=c:\Program Files\Tivoli\TSM\baclient
DSMI_CONFIG=c:\db2tsm\db2-dsm.opt
DSMI_LOGS=c:\tsmlogs

Tak na prawdę to pliki db2-dsm.opt może leżeć gdzie się chce i nazywać się może dowolnie. Ważne, żeby istniał :-P i miał sensowną treść, o czym później.

Poleceniem db2set ustawić zmienną DB2_VENDOR_INI:
1. Uruchomić "Narzędzia wiersza poleceń" gdzieś z menu Start->DB2-> bla ->bla ->bla. Pewnie wybrać opcję "Jako administrator".
2. Sprawdzić ile mamy instancji, bo może być więcej.

db2ilist

3. Dla każdej instaencji, która ma mieć kontakt z TSM ustawić DB2_VENDOR_INI. UWAGA: Najprawdopodobniej, każdej instancji trzeba będzie ustawić inny plik  *.opt!

db2set -i INSTANCJA DB2_VENDOR_INI=c:\db2tsm\db2tsm.env

4. Zatrzymać i wystartować database managera (każda instancja ma własnego), dlatego jesli nie pracujesz z jedyną/domyślną/porządaną to najpier wybierz, ustawiając zmienną DB2INSTANCE:

set DB2INSTANCE=INSTANCJA   (to jest jedna z nazw zwróconych przez db2ilist)

a potem, restart instancji:

db2stop
db2start


A po stronie TSM...

TSM nie wymaga specjalnej gimnastyki. Należy tylko zarejestrować klienta dla każdej instancji DB2 jaką będziemy backupować, być może warto się tu zastanowić czy nie chcemy oddzielić klientów bazodanowych od plikowych, np inną domeną. Ja w przykładach posłuże się oddzielną domeną o odkrywczej i nieoczywistej nazwie DB2.
Drugą rzeczą do rozważenia, jest kwestia polityki backupu. TSM w tym wypadku jest zredukowany do roli worka na dane. Cała mądrość jest po stronie bazy, dlatego polityka bezpieczeństwa po stronie TSM może wyglądać na nieco ubogą.

1. Zarejestrować domenę na klientów DB2:

def dom DB2 descr="Bazy DB2"

2. Zdefiniować politykę backupową 

def pol db2 prod
def mgmt db2 prod db2_standard
def copyg db2 prod db2_stndard t=b dest=jakaś_pula vere=1 verd=0 rete=0 reto=0
assign defmgmt db2 prod db2_standard

3. Sprawdzić i zaktywoawać politykję:

val pol db2 prod (będzie marudzić na brak copy grupy archiwalnej, i pewnie na mig destination. te komunikaty można zignorować, ważne żeby powiedział że policy set prod jest ready for activation)
act pol db2 prod (znowu będzie marudzić. Olać).

4. Zarejestrować klienta naszej (naszych)  instancji:

reg node db2inst1 ibm123 dom=db2 backdel=y userid=none

Istotne jest tu, żeby pozwolić mu kasować swoje backupy. Każdy backup zrobiony przez DB2 będzie, z punktu widzenia TSMa, oddzielnym obiektem, dlatego nie ma wersjonowania, a co za tym idzie wygasania nadmiarowych wersji. To baza będzie odpowiedzialna za usuwanie nadmiarowych backupów. 

I jeszcze raz DB2

Teraz przyszedł czas na dokończenie konfigurowania DB2. 
1. Ustawić hasło API TSM:

dsmapipw   (zapyta o hasło, podać to z rejestracji noda, w przykładzie to ibm123)

Sprawdzić w activity logu TSMa, czy węzeł się podłączył. Jeśli nie to pewnie w %DSMI_LOG%\dsierror.log bedzie jakaś informacja o tym co się stało.
2. Zrobić jakiś prosty backup z DB2:

db2 backup db sample use tsm
db2 list history backup for db sample

Na koniec

To co napisałem, to wędka, a nie ryby. Pewnie powinienem o tym wspomnieć na początku :-P Zasadniczo to nic nie powinno się popsuć. Psucie zacznie się wtedy, gdy będziemy odtwarzać bazy, dlatego nie piszę o tym, tylko dosyłam do solidnego przeczytania ze zrozumieniem przynajmniej tego rozdziału dokumentacji.

Zanim uznamy rozwiązanie za kompletne, wypadałoby się także pochylić nad następującą tematyką:
  •  Przestawienie bazy w tryb logowania archiwalnego (domyślnie, logi są cykliczne, więc jedyny możliwy backup, to pełny, offline - nic ciekawego)
  • Włączenie śledzenia zmodyfikowanych stron - umożliwia backupy typu delta.
  • Ustawienie długości historii backupów.
  • Ustawienie automatycznego kasowania backupów.
  • Ustawienie ilości przechowywanych backupów.
  • Wymyślenie metody archiwizacji i retencji logów bazy.

poniedziałek, 17 marca 2014

Kilka uwag u usuwaniu LUNów w Linuxie

Na początek motto:
- Co to jest: nie świeci i nie mieści się w dupie?
- Radzieckie urządzenie do świecenia w dupie.

To tyle emocji na temat organizacji mpio i używalności komend LVM w Linuxie, a może to są tylko frustracje starego AIXowca? :-P

Wprowadzenie

Sytuacja jest taka: Trzeba usunąć z RedHat Linuxa wystawione z macierzy IBM StorWize V7000 LUNy.
Oryginalna procedura jest tutaj i nie zamierzam jej przepisywać, tylko trochę poprawić, bo niektóre potrzebne informacje można sobie skasować, podczas gdy mogą być potrzebne później.

Aha - tutaj się usuwa dane. W zasadzie nieodwracalnie, więc jak nie wiesz co robisz, to przestań to czytać, albo kup bilet w jedną stronę do kraju, z którym nie ma umowy o ekstradycję... i happy deleting!

Procedura + komentarze

1. Przestać korzystać z urządzenia. Pewnie odmontować filesystem. Może się okazać, że będzie zajęty przez kogoś. Polecenia fuser i lsof na Linuxie mogą być bardzo pomocne.
Warto takżę zadbać o to, żeby filesystemy nie próbowały się już więcej montować. Można to zrobić np poprzez usunięcie bądź zakomentowanie w /etc/fstab wpisów je montujących:

#/dev/tsmadpvg/tsmadplv         /tsm/stgpools/adpool            xfs     defaults        1 2
#/dev/tsmstg2vg/tsmcbdxdplv     /tsm/stgpools/cbdxpool          xfs     defaults        1 2


To jest też dobry moment do zapamiętania w jak się nazywają wolumeny logiczne i do jakiej grupy należą.

2. Znaleźć pozostałe informacje potrzebne do poprawnego usunięcia tego co się chce (i tylko tego). Do znalezienia są jeszcze:
  • UUID LUNów
  • nazwy PV
  • Nazwy ścieżek.
Zatem od początku:
Logiczne wolumeny według grupy wolumenów:

root@c2-tsm01:mapper# vgscan        
  Reading all physical volumes.  This may take a while...
  Found volume group "tsmstgvg" using metadata type lvm2
  Found volume group "tsmactlogvg" using metadata type lvm2
  Found volume group "tsmadpvg" using metadata type lvm2
  Found volume group "vg_c2tsm01" using metadata type lvm2
  Found volume group "tsmvg" using metadata type lvm2

Grupa, którą chcę usunąć to tsmadpvg. trzeba się dowiedzieć, jakie wolumeny logiczne są w niej:

root@c2-tsm01:~# lvscan | grep tsmadpvg
  ACTIVE            '/dev/tsmadpvg/tsmadplv' [20.00 TiB] inherit

Ten krok był tylko, żeby upewnić się, czy na pewno wszystko zostało odmontowane.
Dla porządku wypadałoby się dowiedzieć, jak logiczny wolumen został nazwany przez devmappera:

root@c2-tsm01:~# ls -la /dev/tsmadpvg/tsmadplv
lrwxrwxrwx 1 root root 8 Feb 10 19:58 /dev/tsmadpvg/tsmadplv -> ../dm-25

Pora zidentyfikować fizyczne wolumeny jakich używa usuwana grupa:

root@c2-tsm01:~# pvscan | grep tsmadpvg
  PV /dev/mapper/360050768028601c91000000000000002     VG tsmadpvg      lvm2 [5.00 TiB / 0    free]
  PV /dev/mapper/360050768028601c91000000000000001     VG tsmadpvg      lvm2 [5.00 TiB / 0    free]
  PV /dev/mapper/360050768028205359800000000000001     VG tsmadpvg      lvm2 [5.00 TiB / 0    free]
  PV /dev/mapper/360050768028205359800000000000002     VG tsmadpvg      lvm2 [5.00 TiB / 0    free]

Te cyferki: 36005.... to UUID LUNu wystawionego z macierzy. Dzięki nim można ustalić jak w systemie nazywają się urządzenia reprezentujące pojedyncze ścieżki:

root@c2-tsm01:~# multipath -l | egrep -A 11 "360050768028601c91000000000000002|360050768028601c91000000000000001|360050768028205359800000000000001|360050768028205359800000000000002"
360050768028205359800000000000002 dm-12 IBM,2145
size=5.0T features='1 queue_if_no_path' hwhandler='0' wp=rw
|-+- policy='round-robin 0' prio=0 status=active
| |- 2:0:4:1 sdbd 67:112 active undef running
| |- 3:0:4:1 sdbl 67:240 active undef running
| |- 5:0:4:1 sdbr 68:80  active undef running
| `- 8:0:4:1 sdbx 68:176 active undef running
`-+- policy='round-robin 0' prio=0 status=enabled
  |- 2:0:5:1 sdbf 67:144 active undef running
  |- 3:0:5:1 sdbz 68:208 active undef running
  |- 5:0:5:1 sdcb 68:240 active undef running
  `- 8:0:5:1 sdcd 69:16  active undef running
360050768028205359800000000000001 dm-11 IBM,2145
size=5.0T features='1 queue_if_no_path' hwhandler='0' wp=rw
|-+- policy='round-robin 0' prio=0 status=active
| |- 2:0:5:0 sdbe 67:128 active undef running
| |- 3:0:5:0 sdby 68:192 active undef running
| |- 5:0:5:0 sdca 68:224 active undef running
| `- 8:0:5:0 sdcc 69:0   active undef running
`-+- policy='round-robin 0' prio=0 status=enabled
  |- 2:0:4:0 sdbc 67:96  active undef running
  |- 3:0:4:0 sdbk 67:224 active undef running
  |- 5:0:4:0 sdbq 68:64  active undef running
  `- 8:0:4:0 sdbw 68:160 active undef running
--
360050768028601c91000000000000002 dm-9 IBM,2145
size=5.0T features='1 queue_if_no_path' hwhandler='0' wp=rw
|-+- policy='round-robin 0' prio=0 status=active
| |- 2:0:3:1 sdaj 66:48  active undef running
| |- 3:0:2:1 sdbh 67:176 active undef running
| |- 5:0:2:1 sdbn 68:16  active undef running
| `- 8:0:3:1 sdbv 68:144 active undef running
`-+- policy='round-robin 0' prio=0 status=enabled
  |- 2:0:2:1 sdah 66:16  active undef running
  |- 3:0:3:1 sdbj 67:208 active undef running
  |- 5:0:3:1 sdbp 68:48  active undef running
  `- 8:0:2:1 sdbt 68:112 active undef running
360050768028601c91000000000000001 dm-10 IBM,2145
size=5.0T features='1 queue_if_no_path' hwhandler='0' wp=rw
|-+- policy='round-robin 0' prio=0 status=active
| |- 2:0:2:0 sdag 66:0   active undef running
| |- 3:0:3:0 sdbi 67:192 active undef running
| |- 5:0:3:0 sdbo 68:32  active undef running
| `- 8:0:2:0 sdbs 68:96  active undef running
`-+- policy='round-robin 0' prio=0 status=enabled
  |- 2:0:3:0 sdai 66:32  active undef running
  |- 3:0:2:0 sdbg 67:160 active undef running
  |- 5:0:2:0 sdbm 68:0   active undef running
  `- 8:0:3:0 sdbu 68:128 active undef running

Tak naprawdę to interesujące są tylko te cześći, które w ostatnim akapicie są zaznaczone na czerwono. Dlatego trzeba się posłużyć dodatkowyum polecem, które przygotuje tę listę w sposób użyteczny dla następnego kroku:

 root@c2-tsm01:~# multipath -l | egrep -A 11 "360050768028601c91000000000000002|360050768028601c91000000000000001|360050768028205359800000000000001|360050768028205359800000000000002" | grep running | cut -c 13-18 | while read path; do echo -n $path " " ; done ; echo " "
sdbd  sdbl  sdbr  sdbx  sdbf  sdbz  sdcb  sdcd  sdbe  sdby  sdca  sdcc  sdbc  sdbk  sdbq  sdbw  sdaj  sdbh  sdbn  sdbv  sdah  sdbj  sdbp  sdbt  sdag  sdbi  sdbo  sdbs  sdai  sdbg  sdbm  sdbu

Słowo komentarza do powyższego polecenia. Użyłem cut -c 13-18 - to wycina znaki od 13 do 18 w każdej podanej na wejściu linii. To jest mało zgrabne, jak ścieżki będą miały inną długość nazwy (bardzo prawdopodobne!!!) to się zawali. - jako proste zadanie dla czytelnika, zostawiam przerobienie tego na jakiegoś ładnego sed'a czy awk'a :-P. Dlaczego wypisałem wszystkie ścieżki w jednej linii okaże się za chwilę.

3. Jak już wszystkie informacje są na miejscu, można zacząć wycinać. Zaczynamy od góry:

  • Umount filesystemu
  • Wyciąć w /etc/fstab
  • Zdeaktywować grupę wolumenów
root@c2-tsm01:~# vgchange -a n tsmadpvg
  0 logical volume(s) in volume group "tsmadpvg" now active

  • Usunąć grupę wolumenów:
root@c2-tsm01:~# vgremove tsmadpvg
Do you really want to remove volume group "tsmadpvg" containing 1 logical volumes? [y/n]: y
  Logical volume "tsmadplv" successfully removed
  Volume group "tsmadpvg" successfully removed

  • Usunąć (dla porządku) sygnatury fizycznych wolumenów z LUNów:
root@c2-tsm01:~# pvscan
  PV /dev/mapper/360050768028601c91000000000000003     VG tsmstgvg        lvm2 [738.99 GiB / 0    free]
  PV /dev/mapper/360050768028205359800000000000004     VG tsmstgvg        lvm2 [738.99 GiB / 0    free]
  PV /dev/mapper/360050768028601c91000000000000004     VG tsmstgvg        lvm2 [738.99 GiB / 0    free]
  PV /dev/mapper/360050768028205359800000000000003     VG tsmstgvg        lvm2 [738.99 GiB / 0    free]
  PV /dev/mapper/3600605b004b4ef3017c973413b957cf7p1   VG tsmactlogvg     lvm2 [271.94 GiB / 34.49 GiB free]
  PV /dev/sda3                                         VG vg_c2tsm01      lvm2 [135.29 GiB / 77.43 GiB free]
  PV /dev/mapper/360080e50002eb72c00000348503ae6e6     VG tsmvg           lvm2 [299.99 GiB / 0    free]
  PV /dev/mapper/360080e50002eb72c0000034b503ae711     VG tsmvg           lvm2 [299.99 GiB / 0    free]
  PV /dev/mapper/360080e50002ebe0600000349503ae707     VG tsmvg           lvm2 [299.99 GiB / 0    free]
  PV /dev/mapper/360080e50002ebe060000034b503ae732     VG tsmvg           lvm2 [299.99 GiB / 0    free]
  PV /dev/mapper/360080e50002eb72c00000361503aecec     VG tsmvg           lvm2 [587.99 GiB / 0    free]
  PV /dev/mapper/360080e50002ebe0600000371503aed3a     VG tsmvg           lvm2 [999.99 GiB / 0    free]
  PV /dev/mapper/360050768028601c91000000000000002                        lvm2 [5.00 TiB]
  PV /dev/mapper/360050768028601c91000000000000001                        lvm2 [5.00 TiB]
  PV /dev/mapper/360050768028205359800000000000001                        lvm2 [5.00 TiB]
  PV /dev/mapper/360050768028205359800000000000002                        lvm2 [5.00 TiB]
  Total: 16 [26.01 TiB] / in use: 12 [6.01 TiB] / in no VG: 4 [20.00 TiB]

root@c2-tsm01:~# pvremove /dev/mapper/360050768028601c91000000000000002 /dev/mapper/360050768028601c91000000000000001 /dev/mapper/360050768028205359800000000000001 /dev/mapper/360050768028205359800000000000002
  Labels on physical volume "/dev/mapper/360050768028601c91000000000000002" successfully wiped
  Labels on physical volume "/dev/mapper/360050768028601c91000000000000001" successfully wiped
  Labels on physical volume "/dev/mapper/360050768028205359800000000000001" successfully wiped
  Labels on physical volume "/dev/mapper/360050768028205359800000000000002" successfully wiped
  • Korzystając w wypisanych w jednej linii nazw ścieżek usunąć je z systemu:
root@c2-tsm01:~# for i in sdbd  sdbl  sdbr  sdbx  sdbf  sdbz  sdcb  sdcd  sdbe  sdby  sdca  sdcc  sdbc  sdbk  sdbq  sdbw  sdaj  sdbh  sdbn  sdbv  sdah  sdbj  sdbp  sdbt  sdag  sdbi  sdbo  sdbs  sdai  sdbg  sdbm  sdbu 
> do
> echo "echo 1 > /sys/block/$i/device/delete"
> done
echo 1 > /sys/block/sdbd/device/delete
echo 1 > /sys/block/sdbl/device/delete
echo 1 > /sys/block/sdbr/device/delete
echo 1 > /sys/block/sdbx/device/delete
echo 1 > /sys/block/sdbf/device/delete
echo 1 > /sys/block/sdbz/device/delete
echo 1 > /sys/block/sdcb/device/delete
echo 1 > /sys/block/sdcd/device/delete
echo 1 > /sys/block/sdbe/device/delete
echo 1 > /sys/block/sdby/device/delete
echo 1 > /sys/block/sdca/device/delete
echo 1 > /sys/block/sdcc/device/delete
echo 1 > /sys/block/sdbc/device/delete
echo 1 > /sys/block/sdbk/device/delete
echo 1 > /sys/block/sdbq/device/delete
echo 1 > /sys/block/sdbw/device/delete
echo 1 > /sys/block/sdaj/device/delete
echo 1 > /sys/block/sdbh/device/delete
echo 1 > /sys/block/sdbn/device/delete
echo 1 > /sys/block/sdbv/device/delete
echo 1 > /sys/block/sdah/device/delete
echo 1 > /sys/block/sdbj/device/delete
echo 1 > /sys/block/sdbp/device/delete
echo 1 > /sys/block/sdbt/device/delete
echo 1 > /sys/block/sdag/device/delete
echo 1 > /sys/block/sdbi/device/delete
echo 1 > /sys/block/sdbo/device/delete
echo 1 > /sys/block/sdbs/device/delete
echo 1 > /sys/block/sdai/device/delete
echo 1 > /sys/block/sdbg/device/delete
echo 1 > /sys/block/sdbm/device/delete
echo 1 > /sys/block/sdbu/device/delete

Oczywiście jestem ciut nieufny w stosunku do automatów, dlatego wolę jak mi to coś wypisze komendę zamiast ją wykonać. Potem to sobie "przekleję". Opcja dla hardkorowców: Usunąć z powyższego polecenia to co jest na zielono. 

  • Odmapować luny na macierzy.
  • Być może warto usunąć też zoning z SANu.

Zamiast podsumowania


Na AIXie procedura wyglądałaby tak:
  • lsvg -o (lista włączonych grup wolumenów)
  • lsvg -l grupa_do_usunięcia (lista wolumenów logicznych do zamknięcia/odmontowania)
  • umount wszystkich wolumenów z tej grupy
  • lsvg -p grupa_do_usunięcia (lista hdisków do wycięcia)
  • varyoffvg grupa_do_usunięcia
  • exportvg grupa_do_usunięcia
  • for każdy PV z grupy_do_usunięcia; do rmdev -Rdl $PV; done
Trochę prościej :-P