MySQL (www.mysql.org) Plan wykładu: Wprowadzenie Użytkowanie Administracja
Wprowadzenie Licencjonowanie (serwer półdarmowy ) OpenSource GPL (dotyczy także luźnego powiązania) Commercial license (koszt zakupienia licencji) 2
Wprowadzenie (2) Serwer dostępny na różne systemy operacyjne: Linux, Microsoft Windows, FreeBSD, Sun Solaris, IBM's AIX, Mac OS X, HP-UX, AIX, QNX, Novell NetWare, SCO OpenUnix, SGI Irix, i Dec OSF Szybkość Duże rozmiary bazy danych MySQL w zależności od typu tabeli: MyISAM 65536TB (jeden plik; domyślnie 4GB) Ograniczenie systemu operacyjnego (2GB 16TB) InnoDB 64TB (wiele plików) 3
Wprowadzenie (3) Duży podzbiór ANSI SQL 99 Obecne możliwości i planowane ulepszenia: Feature MySQL version Subqueries 4.1 R-trees 4.1 (dla tabel MyISAM) Stored procedures 5.0 Views 5.0 Cursors 5.0 -------------------------------------------- Foreign keys 5.2 (już w 3.23 dla InnoDB) Triggers 5.0 (niepełne) i 5.1 4
Użytkowanie Typy danych Liczby całkowite: TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT Liczby zmiennoprzecinkowe: FLOAT, DOUBLE Liczby stałoprzecinkowe: DECIMAL(M, N) Data i czas: DATETIME, DATE, TIMESTAMP, TIME, i YEAR Napisy: CHAR, VARCHAR, TEXT Typ wyliczeniowy: ENUM Typ zbiorowy: SET Typ danych binarnych: BINARY, VARBINARY, BLOB 5
Użytkowanie (2) Mapowanie typów dostępnych w innych serwerach w trakcie tworzenia tabeli Inny typ Typ MySQL BINARY(NUM) CHAR(NUM)BINARY CHAR VARYING(NUM) VARCHAR(NUM) FLOAT4 FLOAT FLOAT8 DOUBLE INT1 TINYINT INT2 SMALLINT INT3 MEDIUMINT INT4 INT INT8 BIGINT LONG VARBINARY MEDIUMBLOB LONG VARCHAR MEDIUMTEXT MIDDLEINT MEDIUMINT VARBINARY(NUM) VARCHAR(NUM) BINARY 6
Użytkowanie (3) ENUM('one', 'two', 'three') Wartość Indeks (wartość alternatywna) NULL NULL '' 0 'one' 1 'two' 2 'three' 3 7
Użytkowanie (4) SET('a','b','c','d') (elementom przyporządkowane są bity od najmniej znaczącego) Wartość Indeks (wartość alternatywna) 'a' 1 'b' 2 'c' 4 'd' 8 Kolejność: kol='a,c' lub kol='c,a' da w wyniku 'a,c' (przy SELECT oraz porównywaniu): mysql> SELECT * FROM tab WHERE kol LIKE '%c%'; mysql> SELECT * FROM tab WHERE FIND_IN_SET('c',kol)>0; mysql> SELECT * FROM tab WHERE kol = 'a,c'; mysql> SELECT * FROM tab WHERE kol & 1; 8
Użytkowanie (5) Napisy: 'napis' "inny napis" ' w napisie otoczonym ' można zapisać jako ' ' " w napisie otoczonym " można zapisać jako " " Można także poprzedzić znakiem \ 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello', "hello", "'hello'", "''hello''", "hel""lo", "\"hello" 9
Użytkowanie (6) Napisy: Maski i wyrażenia regularne (REGEXP i NOT REGEXP) SELECT * FROM tab WHERE nazwa LIKE "%fy"; SELECT * FROM tab WHERE nazwa REGEXP "^[bb]"; 10
Użytkowanie (7) BLOB używać jak TEXT, ale wewnętrzna reprezentacja binarna UPDATE tab SET blob_col=load_file('/tmp/picture') WHERE id=1; (uprawnienie FILE) 11
Użytkowanie (8) Sortowanie i porównywanie napisów Domyślna strona kodowa: ISO-8859-1 (Latin1) Ustawienia strony kodowej można ominąć korzystając z atrybutu BINARY dla napisów (nie mylić z typem pola), który nakazuje korzystanie z ustawień regionalnych systemu (np. Windows). Wsparcie dla języka polskiego przez użycie jednej z podanych poniżej stron kodowych: cp1250 (Windows), cp852 (DOS), ISO-8859-2 (Latin2), od wersji 4.1 Unicode (UCS2 i UTF-8). 12
Użytkowanie (9) Generowanie unikalnego klucza: Na polu typu liczbowego: AUTO_INCREMENT odczyt ostatniej wartości przez: LAST_INSERT_ID() Typ: SERIAL => BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE 13
Użytkowanie (10) Rozszerzenie SQL (1) Operacja REPLACE zamiast dwóch DELETE + INSERT (wstawianie nowych lub aktualizacja istniejących elementów). INSERT, REPLACE, DELETE, i UPDATE LOW_PRIORITY niski priorytet z czekaniem DELAYED niski priorytet bez czekania (żądanie wstawione do kolejki) HIGH_PRIORITY wysoki priorytet z czekaniem 14
Użytkowanie (11) Rozszerzenie SQL (2) Operatory i && są traktowane jak logiczne OR i AND (jak w języku C). Zamiast należy korzystać z funkcji CONCAT() przyjmującej dowolną liczbę parametrów Ustawianie wartości zmiennych poprzez := SELECT @a:=sum(total),@b=count(*), @a/@b AS avg FROM test_table; SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3; 15
Użytkowanie (12) Wyszukiwanie pełnotekstowe (tylko MyISAM) Indeks o nazwie FULLTEXT Wyszukiwanie przez funkcję MATCH...AGAINST CREATE TABLE artykuly ( id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, tytul VARCHAR(200), tresc TEXT, FULLTEXT (tytul,tresc) ); W przypadku gdy szukane słowo określałoby ponad połowę wierszy, jest wtedy uznawane za słowo mało znaczące (słabo selekcjonujące) i nie jest brane pod uwagę przy wyszukiwaniu. 16
Użytkowanie (13) Wyszukiwanie pełnotekstowe (2) INSERT INTO artykuly VALUES (NULL,'MySQL Tutorial', 'DBMS stands for DataBase...'), (NULL,'How To Use MySQL Efficiently', 'After you went through a...'), (NULL,'Optimising MySQL','In this tutorial we will show...'), (NULL,'1001 MySQL Tricks','1. Never run mysqld as root. 2....'), (NULL,'MySQL vs. YourSQL', 'In the following database comparison...'), (NULL,'MySQL Security', 'When configured properly, MySQL...'); SELECT * FROM artykuly WHERE MATCH (tytul,tresc) AGAINST ('database'); +----+-------------------+------------------------------------------+ id tytul tresc +----+-------------------+------------------------------------------+ 5 MySQL vs. YourSQL In the following database comparison... 1 MySQL Tutorial DBMS stands for DataBase... +----+-------------------+------------------------------------------+ 2 rows in set (0.00 sec) SELECT * FROM artykuly WHERE MATCH (tytul,tresc) AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE); 17
Użytkowanie (14) Typy tabel niezależny silnik dostępu do danych Nietransakcyjne (szybkie) MyISAM bazuje na ISAM, ('.MYI' MYIndex, '.MYD' MYData) - BTree MEMORY/HEAP używa hash-indeks, BTree ('.frm' format, dane w pamięci RAM) MERGE użycie kilku tabel MyISAM ('.frm' format, '.MRG' linki do tabel) 18
Użytkowanie (15) Transakcyjne, klucze obce InnoDB używa BTree indeksy (ewentualnie automatycznie wygenerowany hash-index na podstawie BTree indeksu) BDB (BerkeleyDB) używa BTree indeksy ('.frm' format, '.db' dane i indeksy) 19
HEAP Użytkowanie (16) CREATE TABLE test ENGINE = HEAP SELECT ip, SUM(downloads) AS down FROM log_table GROUP BY ip; SELECT COUNT(ip),AVG(down) FROM test; DROP TABLE test; CREATE TABLE lookup (id INT) ENGINE = MEMORY; CREATE INDEX id_index USING BTREE ON lookup (id); 20
Użytkowanie (17) InnoDB CREATE TABLE parent(id INT NOT NULL, PRIMARY KEY (id)) ENGINE=INNODB; CREATE TABLE child(id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE SET NULL ) ENGINE=INNODB; 21
Użytkowanie (18) CREATE TABLE product (category INT NOT NULL, id INT NOT NULL, price DECIMAL, PRIMARY KEY(category, id)) ENGINE=INNODB; CREATE TABLE customer (id INT NOT NULL, PRIMARY KEY (id)) ENGINE=INNODB; 22
Użytkowanie (19) CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT, product_category INT NOT NULL, product_id INT NOT NULL, customer_id INT NOT NULL, PRIMARY KEY(no), INDEX (product_category, product_id), FOREIGN KEY (product_category, product_id) REFERENCES product(category, id) ON UPDATE CASCADE ON DELETE RESTRICT, INDEX (customer_id), FOREIGN KEY (customer_id) REFERENCES customer(id)) ENGINE=INNODB; 23
Użytkowanie (20) Transakcje START TRANSACTION / SET AUTOCOMMIT=0 COMMIT / ROLLBACK Punkty kontrolne możliwość wycofania się do określonego miejsca wewnątrz transakcji SAVEPOINT identifier ROLLBACK TO SAVEPOINT identifier 24
Transakcje (2) Użytkowanie (21) Blokowanie tabel dostęp wyłączny LOCK TABLES tbl_name [AS alias] {READ [LOCAL] [LOW_PRIORITY] WRITE} [, tbl_name [AS alias] {READ [LOCAL] [LOW_PRIORITY] WRITE}...]... UNLOCK TABLES 25
Poziomy izolacji Użytkowanie (22) SET [GLOBAL SESSION] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED READ COMMITTED REPEATABLE READ (def.) SERIALIZABLE } global będzie domyślny dla następnych session aktualny w obrębie sesji READ UNCOMMITTED "brudny odczyt" READ COMMITTED czyta zatwierdzone REPEATABLE READ domyślny, odczyt powtarzalny SERIALIZABLE pełna szeregowalność 26
Przykład użycia Użytkowanie (23) Utworzenie bazy danych i podłączenie się do niej SHOW DATABASES; CREATE DATABASE zwierzaki; USE zwierzaki; Utworzenie tabeli SHOW TABLES; CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20), species VARCHAR(20), sex CHAR(1), birth DATE, death DATE); DESCRIBE pet; Załadowanie danych INSERT INTO pet VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL); 27
Przykład użycia (2) Pobranie danych SELECT what_to_select FROM which_table WHERE conditions_to_satisfy; Użytkowanie (24) SELECT DISTINCT owner FROM pet; SELECT name, birth, CURDATE(), (YEAR(CURDATE()) - YEAR(birth)) - (RIGHT(CURDATE(),5) < RIGHT(birth,5)) AS age FROM pet; 28
Użytkownicy i uprawnienia Administracja ACL (Access Control Lists) informacja jest przechowywana w tabelach systemowych: mysql.user mysql.db mysql.host mysql.tables_priv mysql.columns_priv mysql.procs_priv 29
Administracja (2) Użytkownicy i uprawnienia (2) Użytkownicy (autoryzacja) nazwa użytkownika adres, z którego się łączy (może być podana maska) 30
Administracja (3) Użytkownicy i uprawnienia (3) Dostęp do zasobów - poziomy hierarchii Global level GRANT/REVOKE... ON *.* Database level GRANT/REVOKE... ON db.* Table level GRANT/REVOKE... ON db.table Column level tabela: mysql.columns_priv Routine level GRANT/REVOKE... ON... 31
Rodzaje uprawnień Administracja (4) ALL [PRIVILEGES] ALTER CREATE CREATE TEMPORARY TABLES DELETE DROP EXECUTE FILE INDEX INSERT LOCK TABLES PROCESS REFERENCES RELOAD REPLICATION CLIENT REPLICATION SLAVE SELECT SHOW DATABASES SHUTDOWN SUPER UPDATE USAGE (brak uprawnień) GRANT OPTION 32
Administracja (5) Tworzenie użytkownika CREATE USER david [IDENTIFIED BY [PASSWORD] 'password'] Usuwanie użytkownika DROP USER david; 33
Zmiana hasła Administracja (6) SET PASSWORD FOR 'u1'@'h1' = PASSWORD('newpwd'); Zmiana hasła przez tabele systemowe: UPDATE mysql.user SET Password=PASSWORD('new_password') WHERE user='u1' AND host='h1'; FLUSH PRIVILEGES; // bo używał tabeli 34
Administracja (7) Nadawanie praw (gdy brak użytkownika, to zostanie założony) GRANT ALL PRIVILEGES ON db.* TO david@'192.58.197.0/255.255.255.0'; Usuwanie praw nie usuwa użytkownika (DROP USER) usunięcie tabeli nie usuwa praw do tabeli 35
Administracja (8) Ograniczenie wykorzystania zasobów GRANT... WITH MAX_QUERIES_PER_HOUR N1 MAX_UPDATES_PER_HOUR N2 MAX_CONNECTIONS_PER_HOUR N3; 36
Administracja (9) Domyślne uprawnienia 'root' bez hasła z 'localhost' (root@localhost) 'anonymous' bez hasła (@localhost/hostname) do bazy 'test' rozpoczynającej się od 'test_' 37
Administracja (10) Tabele bazy danych są zapisane w oddzielnych plikach Baza danych jest przechowywana w oddzielnym katalogu Można wykonać kopię bazy z poziomu systemu operacyjnego z użyciem: LOCK TABLES zablokowanie tabel FLUSH TABLES zapisanie wszystkich danych z cache tabeli do pliku file copy 38
Administracja (11) Wykonanie kopii danych do pliku SELECT... INTO OUTFILE 'file_name' LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet; Tylko dla MyISAM BACKUP TABLE tbl_name[,tbl_name...] TO '/path/to/backup/directory' RESTORE TABLE tbl_name[,tbl_name...] FROM '/path/to/backup/directory' 39
Administracja (12) Program do zrzucenia bazy do pliku SQL mysqldump [OPTIONS] database [tables] > backup-file.sql mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2...] mysqldump [OPTIONS] --all-databases [OPTIONS] mysql database < backup-file.sql 40
Administracja (13) Sprawdzenie tabeli CHECK TABLE tbl_name[,tbl_name...] [option [option...]] Gdzie option: QUICK FAST MEDIUM EXTENDED CHANGED Naprawa tabeli REPAIR [LOCAL NO_WRITE_TO_BINLOG] TABLE tbl_name[,tbl_name...] [QUICK] [EXTENDED] [USE_FRM] 41
Administracja (14) Kanały komunikacyjne TCP/IP 3306 socket Unix, pipe WinNT (potoki) zawiera SSL, od klienta wymagana konfiguracja tunelu dla portu 3306 42