понедељак, 18. фебруар 2008.

MySQL SHOW u borbi protiv zaborava

Dok sam bio mladji, lepši, zgodniji, ... pamtio sam sve, izmedju ostalog i dizajn baze, neophodna prava da bi se aplikacija koristila, ... Vremenom su me pritisle obaveze, sitna deca, u svakom slučaju prešao sam na zapisivanje, zapišem ovde, onde, pa kad mi zatreba, osvežim pamćenje pa kao nov. A kako vreme neumitno teče, stićiće i mene, ako već i nije, počeću da zaboravljam gde sam zapisao – valjda je to poslednji stadijum.

Na sreću, relacione (relaciono-objektne) baze podataka odlikuje jedno dobro svojstvo a to je da imaju meta podatke. Meta podaci su podaci o podacima, što u konkretnom slučaju znači nema potrebe da preterujete sa pamćenjima tipa: Miletu sam dao pravo da ažurira podatke, pregledava ali ne i da menja strukturu tabela, ili tipa: tabelu zaposleni kreirao sam sa tim i tim kolonama i sa tom i tom internom strukturom i tim i tim indeksima, ..., već me umorila sama pomisao. E tu sad stupaju meta podaci. Različite baze različitim metodama dolaze do tih podataka. Na primer, kod Oracle baze postoji niz tabela i/ili pogleda, poput ALL_OBJECTS, u kojima su upisani svi objekti baze (tabele, indeksi, procedure, funkcije, ...) i odgovarajućim select naredbama i poznavanjem dictionary-a se dolazi do željenih informacija. Kako je to rešeno kod MySQL, ne gubite nadu, sledi u nastavku, mada bih ja o meta podacima mogao nadugo i naširoko.

Mnoge korisne informacije o MySQL bazi, korisnicima i tabelama se mogu dobiti koristeći neku od SHOW komandi. U zavisnosti od prava (privilegija) koje su vam dodeljene, neke SHOW komande mogu da vam budu nedostupne. root korisnik ili onaj koji ima slične privilegije, svakako čovek od poverenja, može koristiti sve SHOW komande, koje će mu pružiti tražene informacije.

Najčešće korišćene SHOW naredbe uključuje sledeće:

SHOW GRANTS FOR user
SHOW DATABASES [LIKE something]
SHOW [OPEN] TABLES [FROM database_name] [LIKE something]
SHOW CREATE TABLE table_name
SHOW [FULL] COLUMNS FROM table_name [FROM database_name] [LIKE something]
SHOW INDEX FROM table_name [FROM database_name]
SHOW TABLE STATUS [FROM db_name] [LIKE something]
SHOW STATUS [LIKE something]
SHOW VARIABLES [LIKE something]
SHOW GRANTS komanda prikazuje privilegije navedeneg korisnika za navedeni host. Najkorisnija je za proveru statusa nekog korisnika, posebno kada postoji zahtev da se modifikuju postojeće korisnikove privilegije. Na kraju krajeva to je lak način da utvrdite da li korisnik stvarno nema zahtevane privilegije. Na primer da proverimo šta ima korisik mile izdali bi smo:

mysql> show grants for mile@localhost;

+-------------------------------------------------------------------------------+

| Grants for mile@localhost |

+-------------------------------------------------------------------------------+

| GRANT USAGE ON *.* TO 'mile'@'localhost'

IDENTIFIED BY PASSWORD '*EC24BE67633C4733D1A70ACB3585F0455F0889D8' |

| GRANT ALL PRIVILEGES ON `cdcol`.* TO 'mile'@'localhost' |

+-------------------------------------------------------------------------------+

2 rows in set (0.00 sec)

Ako pak niste root korisnik ili “čovek od poverenja” a niste ni mile, dobićete poruku o grešci. Svi oni kojima se delimično veruje mogu videti samo relevantne informacije vezane samo za svog korisnika. Na primer, mile nije u mogućnosti da vidi informacije o root korisniku.

mysql> show grants for root@localhost;
ERROR 1044 (42000): Access denied for user 'mile'@'localhost' to database 'mysql'

Budite svesni svojih privilegija i ako niste “od poverenja” da ne kažem root korisnik, da na neke od pomenutih komandi nećete dobiti očekivane informacije već će pristup biti limitiran. Ako vam to smeta, pogledajte članak o xampp-u, i postanite kalif umesto kalifa bar na svojoj radnoj stanici.

Informacije o bazama i tabelama

Komada SHOW DATABASES će uraditi baš to, odnosno prikazaće informacije o bazama koje se nalaze na MySQL serveru:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| cdcol              |
| mysql              |
| phpmyadmin         |
| test               |
| webauth            |
+--------------------+
6 rows in set (0.01 sec)

Nakon što odaberete bazu sa kojom ćete raditi (USE database) SHOW naredba se može koristiti za prikaz liste tabela u toj bazi. Ako dobijete drugačiji prikaz nije reč o grešci već o vašim kreativnim sposobnostima:

mysql> show tables;

+----------------------+

| Tables_in_phpmyadmin |

+----------------------+

| pma_bookmark |

| pma_column_info |

| pma_designer_coords |

| pma_history |

| pma_pdf_pages |

| pma_relation |

| pma_table_coords |

| pma_table_info |

+----------------------+

8 rows in set (0.03 sec)

Ako se doda još i OPEN u SHOW TABLES komandu, dobiće se lista svih tabela u kešu, uz informaciju koliko su puta keširane i da li se trenutno koriste:

mysql> show open tables;
+----------+--------------+--------+-------------+
| Database | Table        | In_use | Name_locked |
+----------+--------------+--------+-------------+
| mysql    | procs_priv   |      0 |           0 |
| mysql    | db           |      0 |           0 |
| mysql    | host         |      0 |           0 |
| mysql    | tables_priv  |      0 |           0 |
| mysql    | user         |      0 |           0 |
| mysql    | columns_priv |      0 |           0 |
+----------+--------------+--------+-------------+
6 rows in set (0.00 sec)

Ako SHOW OPEN TABLES prikazuje tabele koje su višestruko puta korišćene a trenutno se ne koriste (in_use=0) izdajte FLUSH TABLES komandu da oslobodite memoriju (pravilo kod svih baza podataka memorije nikad dosta).

Prikupljane informacija o strukturi tabele

Vrlo korisna komanda je SHOW CREATE TABLE, koja uradi ono što bi čovek i očekivao, prikaže SQL komandu koja se koristila pri kreiranju tabele:

mysql> show create table pma_table_info;
+----------------+----------------------------------------------------+
| Table          | Create Table                                        |
+----------------+----------------------------------------------------+
| pma_table_info | CREATE TABLE `pma_table_info` (
  `db_name` varchar(64) collate latin1_general_ci NOT NULL default '',
  `table_name` varchar(64) collate latin1_general_ci NOT NULL default '',
  `display_field` varchar(64) collate latin1_general_ci NOT NULL default '',
  PRIMARY KEY  (`db_name`,`table_name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci COMMENT='Table
information for phpMyAdmin' |
+----------------+----------------------------------------------------+
1 row in set (0.08 sec)

Njena korisnost ogleda se u tome što može biti podsetnik (i to brz) ili brza referenca na naredbu kojom je kreirana neka tabela (u slučaju da vam papirić nije pri ruci). Iste informacije dobijaju se ako bi ste dump-ovali šemu (ali na sporiji i nepregledniji način).

Ako vam je potrebna samo struktura tabele, ne i SQL komanda za kreiranje, komanda je SHOW COLUMNS:

mysql> show columns from pma_table_info;
+---------------+-------------+------+-----+---------+-------+
| Field         | Type        | Null | Key | Default | Extra |
+---------------+-------------+------+-----+---------+-------+
| db_name       | varchar(64) | NO   | PRI |         |       |
| table_name    | varchar(64) | NO   | PRI |         |       |
| display_field | varchar(64) | NO   |     |         |       |
+---------------+-------------+------+-----+---------+-------+
3 rows in set (0.03 sec)

SHOW COLUMNS je isto što i DESCRIBE komanda.

SHOW INDEX komanda prikazuje informacije o indeksima odredjene tabele. Sintaksa je:

SHOW INDEX FROM ime-tabele [FROM ime-baze]

Ova komanda pruža dosta informacija, počev od imena kolone do kardinalnosti indeksa. Kolone koje se vraćaju komandom opisane su u tabeli koja sledi:

Ime kolone

Opis

Table

Ime tabele

Non_unique

1 ili 0.

1 - indeks može sadržati duplikate

0 – indeks je jedinstven

Key_name

Ime indeksa

Seq_in_index

Redosled kolone u indeksu. Počinje od 1.

Column_name

Ime kolone koja je deo indeksa

Collation

Redosled sortiranja za tu kolonu:

A – rastući (ascending)

Null – ne sortirana

Cardinallity

Broj jedinstvenih vrednosti u indeksu

Sub_part

Na parcijalno indeksiranim kolonama, prikazuje broj znakova koji je indeksiran. NULL ako je cela kolona indeksirana.

Packed

Veličina numeričkih kolona

Comment

Komentar

Sledeća komanda koja vraća tabelu prepunu informacijama je SHOW TABLE STATUS. Sintaksa je:

SHOW TABLE STATUS [FROM database_name] LIKE ‘nešto’

Kolone koje se vraćaju komandom opisane su u tabeli:

Ime kolone

Opis

Name

Ime tabele

Type

Tip tabele: MyISAM, BDB, InnoDB ili Gemini.

Row_format

Format smeštanja zapisa: fixed, dynamic ili compressed.

Rows

Broj redova

Avg_row_length

Prosečna dužina zapisa

Data_length

Veličina fajla sa podacima

Max_data_length

Maksimalna veličina fajla sa podacima

Index_length

Veličina indeksnog fajla

Data_free

Broj bajtova koji su alocirani a nisu iskorišćeni

Auto_increment

Sledeća vrednost koja će biti iskorišćena u auto_increment polju

Create_time

Datum i vreme kreiranja tabele (datetime format)

Update_time

Datum i vreme poslednjeg ažuriranja

Check_time

Datum i vreme kad je tabela poslednji put “proverena”

Create_options

Sve ekstra informacije koje su bile korišćene kod CREATE TABLE naredbe

Comment

Bilo koji komentar dodan kada je tabela kreirana. Pored toga, InnoDB tabele će iskoristiti ovu kolonu da daju informaciju o praznom prostoru u tablespace-u.

Sistemski statusi

SHOW STATUS i SHOW VARIABLES komande pružaju informacije o serveru baze. Sintaksa je baš kao i prethodno napisana, ništa uzbudljivo.

Ono što se desi nakon izdavanja komandi je mnoštvo informacija (i od popa uši). Sreća je da ćemo izdvojiti samo neke

Aborted_connects

Broj neuspelih pokušaja da se pristupi MySQL serveru. Svaki put kad je taj broj različit od nule treba istražiti slučaj. Moguće je da je loša kombinacija username, password u skriptu ili je broj simultanih konekcija postavljen na premalu vrednost.

Connections

Ukupni broj konekcija na MySQL server od trenutka startovanja istog.

Max_used_connections

Maksimalni broj konekcija koje su bile simultane od trenuta startovanja servera.

Slow_queries

Broj upita koji su trajali duže long_query_time (default je 10 sekundi). Ako je broj veći od 1 vreme je da se zabrinete i proverite SQL-ove, razmislite o performansama hardvera ili zovete vatrogasce.

uptime

U sekundama izraženo koliko server radi.

Detaljnu listu sa iscrpnim opisima statusa možete naći na: http://dev.mysql.com/doc/refman/5.0/en/show-status.html.

SHOW VARIABLES takodje obiluje, reklo bi se, brdo informacija. Shodno tome izdvojićemo samo neke a o ostalima možete saznati na: http://dev.mysql.com/doc/refman/5.0/en/show-variables.html.

connect_timeout

Prikazuje u sekundama koliko će MySQL server čekati na konekciju dok je ne odbije

have_innodb

Prikazuje YES ako su InnoDB tabele podržane

have_bdb

YES ako su Berkeley DB tabele podržane

max_connections

Dozvoljeni broj simultanih konekcija na MySQL, preko tog broja se konekcije odbijaju

port

Port na koji MySQL osluškuje kada je startovan

table_type

Podrazumevani tip tabela, obično MyISAM

version

MySQL broj verzije


Ukoliko neki od ovih parametara nije odgovarajući on se može promeniti u konfiguracionom fajlu ili startup komandom (o čemu ću nekom drugom prilikom ako ne zaboravim već o čemu sam hteo).

Нема коментара:

Постави коментар