Zapisz jako PDF
Transkrypt
Zapisz jako PDF
Spis treści 1 TI:WTBD/KlientSerwerMySql 1.1 System klient-serwer na przykładzie MySQL 1.1.1 Główne cechy MySQL 1.1.2 dostępne typy tabel (backendy) TI:WTBD/KlientSerwerMySql System klient-serwer na przykładzie MySQL Przykładem implementacji relacyjnego SBD opartego na SQL i na architekturze klient-serwer jest MySQL. Jego zalety to: jest dostępny bezpłatnie niskie wymagania sprzętowe i administracyjne szeroko rozpowszechniony, bdb. poziom oryginalnej dokumentacji ([1]) długo rozwijane, dojrzałe oprogramowanie istnieje wiele książek, artykułów itd. interfejsy we wszystkich szerzej używanych językach programowania Ma też szereg wad: niejasności co do przyszłego rozwoju odstępstwa od standardu SQL brak pełnej transakcyjności Zalety systemów klient-serwer ujawniają się zwłaszcza w sytuacjach: gdy wymagany jest wysoki stopień wielodostępności konieczność centralizacji składowania danych wysokie wymogi bezpieczeństwa zróżnicowanie uprawnień dostępu Najczęstsze zastosowania MySQL - jako elementu backendu aplikacji webowych - zwykle wykorzystują jedynie część mocnych stron architektury klient-serwer. Np. złożony system uprawnień dostępu nie jest prawie nigdy wykorzystywany w takich zastosowaniach. Główne cechy MySQL Danymi zarządza serwer (program mysqld), do którego dostęp mogą mieć klienci zarówno za tej samej maszyny, jak i z maszyn zdalnych dostęp lokalny może być realizowany przez tzw. gniazda unixowe (wysoka wydajność) dostęp zdalny realizowany jest przez TCP/IP, domyślnie połączenia na port 3306. Standardowo połączenia nie są szyfrowane; z założenia powinny one odbywać się w ramach bezpiecznej sieci lokalnej, gdzie szyfrowanie stanowiłoby jedynie narzut ujemnie wpływający na wydajność. Istnieje jednak możliwość skonfigurowania połączeń SSL/TLS. Dane przechowywane są w plikach, w poddrzewie /var/lib/mysql (standardowo w większości dystrybucji). Tabele (i in. obiekty) zarządzane przez daną instancję serwera pogrupowane są w bazy danych, którym odpowiadają podkatalogi w /var/lib/mysql. poza wyjątkowymi sytuacjami nie należy bezpośrednio sięgać do tych plików (zwłaszcza w trakcie pracy serwera!); nie należy ich też wprost przenosić między instancjami serwera (mogą zależeć od wersji oprogramowania, lokalne konfiguracji, ...) dostępnych jest kilka typów tabel, o nieco różnych własnościach i charakterystykach wydajnościowych -- np. transakcyjne i nietransakcyjne; typ tabeli można wybrać w momencie jej tworzenia. do eksploracji bazy czy czynności jednorazowych, wykonywanych poza aplikacją, jest narzędzie o nazwie mysql i własnościach podobnych do programu sqlite3 (tylko lepsze). Są też bardziej wyspecjalizowane narzędzia np. mysqladmin -- do czynności administracyjnych np. tworzenie kont, mysqldump -- do zrzutów i transferu danych, mysqlcheck -- do sprawdzania poprawności i do optymalizacji tabel. istnieją też narzędzia typu GUI do zarządzania bazami, np. phpmyadmin złożony system uprawnień pozwala definiować prawa dostępu na poziomie baz, tabel a nawet poszczególnych kolumn, różnicując prawa do różnych operacji. Uprawnienia są ustalane na podstawie zarówno konta (loginu), jak i adresu źródłowego połączenia. Konta mysql są całkowicie niezależne od kont unixowych. dość zaawansowane możliwości replikacji danych pomiędzy wiele serwerów w układzie masterslave w definicjach tabel, inaczej niż w ~SQLite (ale podobnie, jak w większości relacyjnych SBD), wymagane jest deklarowanie typów danych dla kolumn Python: standardem jest python-mysqldb, zgodne w szerokim zakresie z DBAPI v. 2. Istnieją też alternatywne implementacje: oursql (wygląda obiecująco; pomija wykorzystanie biblioteki klienckiej w C, implementując komunikację z serwerem w Pythonie); pymysql (słabo udokumentowane) dostępne typy tabel (backendy) CREATE TABLE tabela ( ... ) ENGINE = INNODB; ALTER TABLE tabela ENGINE = MYISAM; standard: ~MyISAM największa szybkość operacji niskie wymagania co do przestrzeni dyskowej niskie wymagania pamięciowe dla operacji zmieniających dane brak obsługi transakcji (!) brak obsługi kluczy obcych (!) tabele transakcyjne: InnoDB od MySQL 4.0 obsługuje deklaracje kluczy obcych: (w CREATE TABLE ...): [CONSTRAINT SYMBOL] FOREIGN KEY [ID] REFERENCES TBL_NAME (INDEX_COL_NAME, [ON DELETE {RESTRICT | CASCADE | SET [ON UPDATE {RESTRICT | CASCADE | SET (INDEX_COL_NAME, ...) ...) NULL | NO ACTION | SET DEFAULT}] NULL | NO ACTION | SET DEFAULT}] ew. ALTER TABLE yourtablename ADD [CONSTRAINT SYMBOL] FOREIGN KEY [ID] (INDEX_COL_NAME, ...) REFERENCES TBL_NAME (INDEX_COL_NAME, ...) [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}] [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}] obsługuje transakcje: SET AUTOCOMMIT = 0; BEGIN; INSERT ... UPDATE ... DELETE ... COMMIT; (lub ROLLBACK) tabele nie zapisywane na dysk (MEMORY) CREATE TABLE tabela ( ... ) ENGINE = MEMORY; dane trwają do restartu serwera (definicje pozostają) bardzo szybkie operacje nie dopuszczają kolumn typu BLOB ani TEXT tabele tymczasowe (TEMPORARY) CREATE TEMPORARY TABLE tabela ( ... ) ENGINE = MEMORY; ENGINE może być również MyISAM i InnoDB widziane tylko w aktualnej sesji, niszczone przy jej zamknięciu; niewidoczne dla SHOW TABLES ograniczenie: tylko 1 referencja w zapytaniu (niemożliwe samozłączenie) NB. w SQLite też istnieje możliwość operowania na danych istniejących wyłącznie w pamięci procesu, ale na poziomie całej bazy danych a nie poszczególnych tabel tabele FEDERATED: dołączające dane z serwerów zdalnych (eksperymentalne)