Archiwum kategorii ‘DB’

MySQL slow_queries

wtorek, 10 Luty 2009

Już kiedyś płakałem z tego powodu – Analiza log-slow-queries (z życia wzięte…), a tu stary klient narzeka na wydajność swojego serwera. I co my tu mamy?

  • tabela 1 – 117’608 wierszy,
  • tabela 2 – 730 wierszy,
  • tabela 3 – 709 wierszy.

Niby niewiele, ale da się z tego zrobić taki wynik:

# Query_time: 11'005  Lock_time: 0  Rows_sent: 1  Rows_examined: 88'891'086

Dla porównania 10 miesięcy temu to samo zapytanie:

# Query_time: 53  Lock_time: 0  Rows_sent: 615  Rows_examined: 8'674'949

Nie mam pytań. Zdecydowanie potrzeba nowego procesora, więcej pamięci i szybszych dysków. Programisty przecież nie przekonamy…

DBD::Sybase na Gentoo

środa, 24 Grudzień 2008

Gdyby ktoś chciał robić DBD::Sybase (ja potrzebowałem do monitorowania bazy MS SQL) na Gentoo, to poniżej Manifest (dla 1.07 i 1.09):

DIST DBD-Sybase-1.07.tar.gz 189553 SHA1 881fc8f1c65e39e8537f4cc2e93308caeab87eed SHA256 be41f930fda27447b520773a1461ba3f43d20e0a859bef0504c40f3f3fe067b0
DIST DBD-Sybase-1.09.tar.gz 194414 SHA1 23cad59ab7892732175336087093b1e3c2bda09a SHA256 516d44567f1c76aa6aba76879a371d3a44f4a69da3b06b304f375eb57bb2daf1
EBUILD DBD-Sybase-1.07.ebuild 669 SHA1 03a85b4da544032957b312dde5b0cf44e910e562 SHA256 14a2eca747ad29e297299ad3282e9f000a6e61f5eb63783f9c79f481250c465a
EBUILD DBD-Sybase-1.09.ebuild 661 SHA1 8719cb6544289ed71d74d9a06c8cab5a60ba021d SHA256 e49e709405fc2b5c3ddf4bf1d27be1925c47446b1b2927b09dad571079aba93b

Ebuild można pobrać z Gentoo Bug (42040 – DBD-Sybase-1.02 (new package)). Przeróbka tego do 1.09 nie powinna być problemem.
Oczywiście wszystko do /usr/portage/dev-perl/DBD-Sybase.

DBD::Oracle – problem z kompilacją

środa, 24 Grudzień 2008

Budowałem DBD::Oracle na Gentoo 1.12.11.1 (Linux 2.6.18-xen-r12 x86_64), ale nie wyszło. Błędy po make:

[...]
x86_64-pc-linux-gnu-gcc -c  -I/usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux/auto/DBI -I../ -DLINUX -D_GNU_SOURCE -D_REENTRANT -g -fno-strict-aliasing -pipe -Wdeclaration-after-statement -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm -O2 -pipe -march=nocona   -DVERSION=\"1.22\" -DXS_VERSION=\"1.22\" -fPIC "-I/usr/lib64/perl5/5.8.8/x86_64-linux/CORE"  -Wall -Wno-comment -DUTF8_SUPPORT -DNEW_OCI_INIT -DORA_OCI_VERSION=\"10.2.0.3\" Oracle.c
In file included from Oracle.xs:1:
Oracle.h:37:17: error: oci.h: No such file or directory
Oracle.h:38:22: error: oratypes.h: No such file or directory
Oracle.h:39:20: error: ocidfn.h: No such file or directory
[...]

Rzeczywiście nigdzie nie ma ścieżki do katalogu z oci.h. Po instalacji dev-db/oracle-instantclient-basic (na Gentoo) wszystkie pliki nagłówkowe są w /usr/lib64/oracle/10.2.0.3/client/include. Żeby budowanie się powiodło, do x86_64-pc-linux-gnu-gcc trzeba dodać tą ścieżkę (-I).

Wszystko po to, by z Nagios można było monitorować stan Oracle (poprzez check_oracle_health).

Przygód z MSDE ciąg dalszy

wtorek, 16 Grudzień 2008

sapwdNa MS Windows 2003 nie udało mi się zainstalować MSDE poprzez dwuklik. Należy posiłkować się wierszem polecenia – wymagane jest podanie hasła do bazy (parametr SAPWD). Więcej tutaj:

svrnetcnDodatkowo po instalacji domyślnie MSDE nie nasłuchuje na TCP. Włączyć to należy za pomocą SVRNETCN, więcej na:

Przy imporcie danych wymagana była ścieżka taka jak na serwerze źródłowym. Zmiana lokalizacji po jest możliwa. Dobry opis znalazłem tutaj:

Używam SQL Server Management Studio Express, w trakcie importu zmianę ścieżki również da się zrobić.

Żeby było jasne – nie miałem nigdy do czynienia z MS SQL, więc dlatego niektóre z problemów mogą okazywać się trywialne, niemniej odkrywam koło sam (powered by Google).

MSDE w Pudełku

piątek, 12 Grudzień 2008

Przyszło mi przenosić aplikację Pudełko napisaną przez firmę SOLVEO Software Solutions na zlecenie AMUR Sp. z o. o. dla OPEK Sp. z o. o. Większego problemu z aplikacją nie ma, pojawił się natomiast z MS SQL (MSDE).

Otóż konfiguracja mówi, że baza uruchamia się nasłuchując na named pipe i TCP, z tym, że po uruchomieniu nie widać żeby słuchało cokolwiek (vide netstat -a). Połączenia lokalne działają, więc z bazą wszystko w porządku. I oto co się okazuje po przejrzeniu dziennika zdarzeń:

Masz uruchomioną wersję systemu Microsoft SQL Server 2000 lub Microsoft SQL Server 2000 Desktop Engine (zwaną także MSDE), w której występują znane usterki zabezpieczeń podczas używania razem z tą wersją systemu Windows. W celu zmniejszenia podatności tego komputera na ataki niektórych wirusów zostały wyłączone porty sieciowe TCP/IP i UDP systemu Microsoft SQL Server 2000, MSDE lub obydwu. Aby włączyć te porty, musisz zainstalować poprawkę lub najnowszy dodatek Service Pack dla systemu Microsoft SQL Server 2000 lub MSDE ze strony http://www.microsoft.com/sql/downloads/default.asp

Aby znaleźć więcej informacji, zobacz http://go.microsoft.com/fwlink/events.asp w Centrum pomocy i obsługi technicznej.

No cóż. Szkoda, że podczas uruchamiania nie ma na ekranie żadnego komunikatu. Zaskakujące jest, że w logach jest informacja o znanym problemie… Zakładam, że firma Microsoft nie wypuściła aplikacji, która sama raportuje o błędzie i wyłącza porty wobec czego nie jest w pełni funkcjonalna, a komunikat pochodzi od jakiegoś zarządcy usług (mimo, że dziennik zdarzeń twierdzi, iż od MSDE), który może wpływać na samo MSDE i wyłączać funkcjonalność.

Problem udało się rozwiązać. Poprawka wraz z opisem dostępna jest na stronie Microsoft.

17148 :
SQL Server is terminating due to ‘stop’ request from Service Control Manager.

17052 :
Microsoft SQL Server  2000 – 8.00.194 (Intel X86)
Aug  6 2000 00:57:48
Copyright (c) 1988-2000 Microsoft Corporation
Desktop Engine on Windows NT 5.1 (Build 2600: Dodatek Service Pack 3)

17104 :
Server Process ID is 3752.

17162 :
SQL Server is starting at priority class ‘normal’(1 CPU detected).

17124 :
SQL Server configured for thread mode processing.

17125 :
Using dynamic lock allocation. [500] Lock Blocks, [1000] Lock Owner Blocks.

17834 :
Using ‘SSNETLIB.DLL’ version ’8.0.311′.

17052 :
Recovery complete.

19013 :
SQL server listening on 192.168.1.105: 1433.

19013 :
SQL server listening on 127.0.0.1: 1433.

19012 :
SuperSocket Info: Bind failed on TCP port 1433.

19012 :
SuperSocket Info: Bind failed on TCP port 1433.

19013 :
SQL server listening on TCP, Shared Memory, Named Pipes.

17126 :
SQL Server is ready for client connections

Product: MSDE 2000/SQL Server 2000 Critical Update — Installation completed successfully.

SQL Relay

czwartek, 4 Wrzesień 2008

Zajmował się ktoś SQL Relay? Wygląda obiecująco, i te wsparcie dostawców – Oracle, MySQL, mSQL, PostgreSQL, Sybase, MS SQL Server (oba przez FreeTDS), IBM DB2, Interbase, SQLite, ODBC, MS Access (MDB Tools)…

Postanowiłem przyjrzeć się temu w połączeniu z PostgreSQL i MySQL z C/C++ i Perl API. Wersja 0.39.4.
Jest w portach dla FreeBSD, nie ma w paczkach dla Gentoo. Potrzebuje dodatkowej biblioteki Rudiments (devel/rudiments we FreeBSD, dev-cpp/rudiments w Gentoo) i jeśli chcemy jakiegoś API, to odpowiednio: Perl, PHP, Python, Ruby, TCL, Java lub Zope. GTK+ i glib da nam GUI.

Konfiguracja nietrudna – w pliku XML. W tagu instance definiujemy proces nasłuchu. Tag user to definicje użytkowników wraz z hasłami. Na koniec tag connection, który wskazuje konfigurację do konkretnej bazy.
W bardziej złożonej konfiguracji mamy jeszcze router i filter. Pierwszy tag odpowiada za kierowanie zapytań do odpowiedniej bazy, drugi – za filtrowanie zapytań (zdefiniowane nie będą w ogóle przesyłane do serwera, a klient dostanie błąd). W obu przypadkach jest możliwość dopasowania zapytań za pomocą wyrażeń regularnych.

Jeżeli uruchamiamy SQL Relay za pomocą sqlr-start, musimy pamiętać, że wszystkie programy, które wywołuje, np. sqlr-listener muszą być w ścieżce ($PATH). Baza również musi działać. Jeśli nie, pozostaje walka z czyszczeniem shared memory segment i semaphore (ipcs, ipcrm), bo SQL Relay nie sprząta po sobie.

Na tym skończyłem walkę. To znaczy próbowałem uruchomić SQL Relay zarówno z MySQL jak i PostgreSQL, ale niestety zakończyło się to niepowodzeniem (SQL Relay nasłuchiwał, przy połączeniu cisza). Mam nadzieję, że kiedyś wrócę do tego tematu.

Przepraszam, jeśli ktoś był pełen nadzieji, że czegoś się dowie z tego artykułu. Zmieniłem pracę i już nie robię tego co robiłem, więc wiele rzeczy pozostało niedokończonych…

Bezpieczne połączenia z MySQL (C API)

niedziela, 10 Sierpień 2008

Ostatnio coraz więcej kodu w C piszę z użyciem MySQL API, a że dane przy jednym z projektów są poufne i serwer nie jest lokalny, przyjrzałem się połączeniom SSL. W zasadzie po stronie kodu to nic wielkiego – wystarczy wywołać mysql_ssl_set() przed mysql_real_connect() (mysql_connect() jest deprecated). Oczywiście pod warunkiem, że klient jest skompilowany ze wsparciem OpenSSL (lub yaSSL, ale nigdy nie testowałem).

Uruchomienie samego serwera (również przy założeniu, że skompilowany ze wsparciem SSL) sprowadza się do podania dodatkowych parametrów w linii komend. Przykładowo może to wyglądać tak:

mysqld --defaults-file=/etc/mysql/my.cnf --ssl --ssl-ca=</path/to/CA.crt> --ssl-cert=</path/to/file.crt> --ssl-key=</path/to/file.key>

Ewentualnie odpowiednie parametry podać w pliku konfiguracyjnym (my.cnf):

ssl-ca = </path/to/CA.crt>
ssl-cert =</path/to/file.crt>
ssl-key =</path/to/file.key>

Pamiętać należy, że w przypadku, gdy certyfikat jest zabezpieczony hasłem, MySQL może być jedynie uruchomiony ręcznie. Korzystając ze skryptów startowych (na pewno w Gentoo Linux) czy nawet wrzucając proces w tło (&) serwer nie skorzysta z certyfikatu i nie nawiążemy szyfrowanej transmisji. Próba takiego uruchomienia zakończy się podobnym wpisem w logach:

[Warning] Failed to setup SSL

Testowe połączenie do serwera z konsoli mysql możemy wykonać podając jedynie ścieżkę do certyfikatu CA (format PEM), np.

mysql -h <host> -u <user> -p --ssl-ca=</path/to/CA.crt> <database>

Wywołując STATUS możemy sprawdzić czy bieżące połączenie ma wsparcie SSL:

SSL:            Cipher in use is DHE-RSA-AES256-SHA

czy też nie:

SSL:            Not in use

Wymuszanie szyfrowanych połączeń możliwe tylko poprzez REQUIRE SSL przy nadawaniu praw użytkownikowi (GRANT). W takim przypadku połączenie bez SSL zakończy się komunikatem podobnym jak w przypadku np. podania błędnego hasła:

ERROR 1045 (28000): Access denied for user 'exg'@'192.168.1.101' (using p assword: YES)

Więcej o używaniu SSL w MySQL można poczytać tutaj:

Wracając do samej funkcji mysql_ssl_set(), to jako parametry przyjmuje: uchwyt połączenia zwrócony przez mysql_init(), ścieżkę do pliku klucza, certyfikatu i certyfikatu CA oraz ścieżkę do katalogu z certyfikatami CA w formacie PEM, a także listę wspieranych algorytmów.
Nieużywane parametry powinny przyjmować wartość NULL.
Funkcja zawsze zwraca 0, o błędach SSL informuje mysql_real_connect().

ERROR 2026 (HY000): SSL connection error

Na koniec łyżka dziegciu – libmysql (i klient mysql) dla Windows (ten z binarnej paczki) nie jest skompilowany z obsługą SSL. Aby korzystać z bezpiecznych połączeń należy pobrać źródła i samodzielnie dokonać kompilacji. Mi się nie udało… Może przez zbyt stare Visual C++.