original in es Jose M. Fernández
es to en Jose M. Fernández
en to nl Christ Verschuren
MySQL is een SQL (Structured Query Language) database server die ondersteund wordt op een aantal platforms, waaronder Linux. De Linux versie is ontworpen met een hoge performance als doel.
MySQL is een SQL (Structured Query Language) database server. Het is een client-server applicatie bestaande uit een server en een aantal clients.
De bespreking van een SQL database is erg complex omdat je terug zou moeten gaan naar de oorsprong van de relationele databases en het oogmerk van dit artikel is niet zo ambitieus, we willen enkel een specifieke toepassing van een SQL server beschrijven en demonstreren.
Als historische achtergrond moeten we vermelden dat IBM SQL in 1981 op de markt bracht en sindsdien heeft het product een fundamentele rol gehad in de ontwikkeling van relationele databases. IBM heeft een versie van SQL aangeboden aan het American National Standards Institute (ANSI), die later werd gestandaardiseerd, en daarna heeft het algemene toepassing gevonden in relationele databases. DB2, op dit moment de meest populaire database van dit type, is ontwikkeld in 1983 en wordt over het algemeen gebruikt in mainframe omgevingen.
In de GNU wereld is MySQL een van de meest genoemde databases, als het gaat over relationele databases onder Linux. Deze toepassing is niet beschikbaar in een van de Linux distributies, omdat het geen zuivere GNU licentie kent; commercieel gebruik van MySQL of een andere toepassing die er gebruik van maakt, vraagt om de aanschaf van een licentie.
Deze database server wordt beschouwd als (en dit wordt expliciet genoemd in de documentatie) een van de snelste en meest robuuste voor grote en kleine hoeveelheden data (uiteraard vergeleken met andere database servers in deze categorie). Zoals we later zullen bespreken, wordt de verwerkingssnelheid bereikt ten koste van het niet implementeren van een aantal faciliteiten van de SQL standaard.
MySQL is beschikbaar (Broncode en Binair bestand) voor: Linux 2.0+, SCO, Solaris 2.5, 2.6, SUNOS 4.x, BSDI 2.x, 3.0, SGI IRIX 6.x, AIX 4.x, DEC UNIX 4.x, HPUX 10.20, Windows 95 (excuseer me).
De vrije versie is geschreven door Michael Windenis, en de commerciële versie wordt gedistribueerd door TCX Datakonsulter AB.
Voordat je de database gaat installeren moet je uiteraard eerst de broncode downloaden van het WEB:
http://www.tcx.seEerst moeten we beslissen of we broncode gaan downloaden of een binair bestand. De laatste optie is het eenvoudigst te installeren, maar moet wel beschikbaar zijn voor het gewenste platform (en is inderdaad beschikbaar voor de populairste platforms).
Na het downloaden van het bestand:
mysql-Version.tar.gzga je het uitpakken. Dit kan op verschillende manieren, persoonlijk geef ik de voorkeur aan:
Ik voer de tar opdracht uit vanuit de directory /usr/local, zodat
de bestanden worden teruggevonden in
/usr/local/mysql-3.20.32a-pc-linux-gnu-i586
Dit is geen erg praktische naam, daarom wordt aangeraden (althans dat wordt vermeld in de installatie handleiding) een symbolische link te maken naar deze locatie
> ln -s mysql-3.20.32a-pc-linux-gnu-i586/bin mysqlDe mysql directory bevat het volgende:
met de opdracht cd mysql gaan we naar de directory met de bestanden van MySQL. Als alles goed gegaan is zijn we nu klaar om de database server te starten.
Decomprimeer en pak de broncode uit,zoals aangegeven in de vorige paragraaf.
De broncode distributie bevat een grote hoeveelheid documentatie over het installatie proces. Er is informatie over bekende bugs, platform specifieke aantekeningen en tips voor de verschillende besturingssystemen, beschrijvingen van parameters voor verschillende configuraties en zelfs een verzameling Veel Gestelde Vragen (FAQ). Als het installatie proces goed gaat is het resultaat een directory met bestanden, zoals hiervoor beschreven.
Een installatie vanuit de broncode wordt alleen aanbevolen voor gebruikers met ervaring in het installeren en compileren van programma's en die voldoende tijd en geduld hebben om de problemen die zich ongetwijfeld zullen voordoen tijdens de procedure te kunnen oplossen.
Na de installatie van de server op je systeem volgens een van de hiervoor beschreven methoden, moet de volgende directory :
/usr/local/mysql-3.20.32a-pc-linux-gnu-i586de navolgende bestanden en directories bevatten:
Voor meer informatie over het installeren van de server kun je gebruik maken van de bestanden README, TODO, INSTALL, mysql-faq, etc., die erg compleet en effectief zijn (dit artikel is er deels op gebaseerd).
In de directory /data zullen de databases worden bewaard die je aanmaakt, ze worden opgeslagen in aparte subdirectories. De oorspronkelijke installatie maakt standaard de archeven aan die de beveiligingsfuncties van de server bevatten, dit is de database “mysql”.
Verschillende voorbeelden van SQL vindt je in /bench . Installaties vanuit de broncode bevatten een groter aantal voorbeelden dan die vanuit een binair bestand.
De directory /share bevat de foutmeldingen van de server voor elk van de beschikbare talen.
/include en /lib bevatten de systeembestanden en bibliotheken van de distributie.
Zoals verwacht bevat /bin alle uitvoerbare bestanden, waarvan de belangrijkste zijn:
Een SQL Shell. Het kan interactief gebruikt worden of niet.
Beheer hulpmiddelen. Aanmaken/Verwijderen van databases. Informatie over processen en de programmaversie.
SQL “deamon”. Deze moet altijd opgestart zijn.
Toont informatie over een database, tabel of veld.
Start “mysqld”.
Script om de rechten van de combinatie: Computer, gebruiker en database, te controleren.
Wordt gebruikt om gevonden fouten in de server te rapporteren.
Maakt grote tabellen aan met standaard rechten, en wordt gewoonlijk gedraaid na een eerste installatie op een nieuw systeem.
Controleert, optimaliseert en repareert tabellen.
Het beveiligingssysteem van MySQL waarborgt dat elke gebruiker alleen taken kan uitvoeren waarvoor hij geautoriseerd is (niet meer en niet minder).
Het systeem kiest de rechten voor een transactie conform de volgorde: “WELKE GEBRUIKER” vanaf “WELKE COMPUTER” verbinding maakt met een “GEGEVEN DATABASE”. Het rechtensysteem is gebaseerd op de inhoud van de 3 tabellen, “USER”, “HOST” en “DB” van de database “mysql”.
De kolommen van deze drie tabellen zijn:
Tables |
---|
db |
host |
user |
Field | Type | Null | Key | Default | Extra |
Host | char(60) | PRI | |||
Db | char(32) | PRI | |||
User | char(16) | PRI | |||
Select_priv | char(1) | N | |||
Insert_priv | char(1) | N | |||
Update_priv | char(1) | N | |||
Delete_priv | char(1) | N | |||
Create_priv | char(1) | N | |||
Drop_priv | char(1) | N |
Field | Type | Null | Key | Default | Extra |
Host | char(60) | PRI | |||
Db | char(32) | PRI | |||
Select_priv | char(1) | N | |||
Insert_priv | char(1) | N | |||
Update_priv | char(1) | N | |||
Delete_priv | char(1) | N | |||
Create_priv | char(1) | N | |||
Drop_priv | char(1) | N |
Field | Type | Null | Key | Default | Extra |
Host | char(60) | PRI | |||
User | char(16) | PRI | |||
Password | char(16) | ||||
Select_priv | char(1) | N | |||
Insert_priv | char(1) | N | |||
Update_priv | char(1) | N | |||
Delete_priv | char(1) | N | |||
Create_priv | char(1) | N | |||
Drop_priv | char(1) | N | |||
Reload_priv | char(1) | N | |||
Shutdown_priv | char(1) | N | |||
Process_priv | char(1) | N | |||
File_priv | char(1) | N |
Je kunt zelf beslissen of je SELECT, INSERT, UPDATE en DELETE acties wil toestaan voor velden in een tabel.
Het is ook mogelijk om CREATE of DROP (verwijder) acties al dan niet toe te staan voor tabellen of databases.
Een andere interessante mogelijkheid is om beheeracties als “shutdown”, “reload”, “process”, etc. toe te staan.
De bestaande rechten kunnen worden geïnspecteerd met het script “mysqlaccess”.
Een HOST moet altijd een “local host”, een IP nummer of een SQL expressie zijn. Als in tabel “db” de host kolom leeg is, betekent dat “elke host” in de tabel “host”. Als aan de andere kant in de tabel “host” of “user” de kolom host leeg is betekent dat dat elke HOST een TCP verbinding met onze server tot stand mag brengen.
Db is de naam van de database.
Een lege “USER” kolom betekent elke gebruikernaam.
De snelste manier om de server te starten is de volgende opdracht:
mysql.server startDezelfde opdrachten kunnen ook worden uitgevoerd met het script safe_mysql, zoals aangegeven in de installatie handleiding, maar op welke manier dan ook het resultaat is altijd het uitvoeren van het bestand “mysqld”.
Zoals je zult begrijpen is het noodzakelijk de server te starten, alvorens je enige opdracht kunt uitvoeren op de database; als de server draait kunnen we opdrachten geven als “mysqladmin” waarvan de syntax als volgt luidt:
mysqladmin [OPTIONS] command command …de mogelijke OPTIONS zijn:
waarbij command een van de volgende opdrachten kan zijn:
Bijvoorbeeld:
mysqladmin create newdatabasemaakt een nieuwe database met de naam "newdatabase"
we kunnen een overzicht krijgen van de processen op de server met de opdracht
mysqladmin processlistEen andere belangrijke opdracht is mysqlshow die ons de beschikbare databases laat zien, bijvoorbeeld het geven van deze opdracht zonder verdere opties geeft als resultaat:
> mysqlshow+-----------+ | Databases | +-----------+ | mysql | | people | | test | +-----------+
In de inleiding hebben we al aangegeven dat deze server een van snelste in zijn klasse wordt geacht voor grote en kleinere datasets en dat deze snelheid wordt bereikt door een aantal mogelijkheden van SQL niet op te nemen, die naar mijn mening wel belangrijk zijn. Twee belangrijke mogelijkheden die er uit zijn gelaten zijn Triggers en de Transactional Logic.
Triggers zijn niets anders dan een klein stukje code dat wordt "gestart" --uitgevoerd-- wanneer een gegeven opdracht wordt uitgevoerd op de database (een update, delete, etc..). Het is duidelijk dat de test op de triggerwaarde en het beheer hiervan bronnen van het systeem vergt en dit is dan ook de enige reden waarom het is weggelaten.
De consistentie tussen tabellen in een relationele database is erg belangrijk. SQL voorziet in een min of meer eenvoudig hulpmiddel om deze consistentie te waarborgen: "Transactional Logic". Het is de server die moet zorgen voor het mechanisme van blokkeren van bestanden evenals de consolidatie en het herstel van opdrachten op de database. Wel, MySQL ondersteund de transactieverwerking door meerdere gebruikers niet om de snelheid van de server te verhogen (tenminste dat staat in de documentatie), de enige hulp die we hebben is het gebruik van de opdrachten LOCK tables / UNLOCK tables waarmee het mogelijk is tabellen te blokkeren voor andere gebruikers, maar het maakt het niet mogelijk opdrachten die al zijn uitgevoerd op de data ongedaan te maken.
De beperking van de server in acht nemend, zullen we dadelijk een aantal SQL commando's bespreken, niet om de SQL commando's te analyseren maar om te zien hoe ze door de server geïmplementeerd worden.
Nadat we de server gestart hebben zijn we klaar om opdrachten te geven. Bijvoorbeeld, laten we een database aanmaken die "people" heet en bestaat uit drie tabellen "clients", "states" en "counties". Het is een erg eenvoudig en weinig bruikbaar voorbeeld, maar het geeft een beeld hoe de data in werkelijkheid wordt gemanipuleerd. Eerst moet ik even zeggen dat deze opdrachten op verschillende wijzen kunnen worden verricht: door een API in C, C++, JAVA of door een ODBC als we werken onder Windows95 (Neem me niet kwalijk), of vanaf de opdrachtprompt van het programma. Ik zal kiezen voor de laatste mogelijkheid omdat dat voldoende is voor het doel van artikel en voorkomt dat de kenmerken van de andere programmeertalen moeten beschrijven.
De Mysql shell kan worden gestart met:
mysql databasenamenadat we bij de opdrachtprompt van de server zijn beland, kunnen we opdrachten gaan sturen naar de server.
Het is ook mogelijk in batch mode te werken vanaf de prompt met:
mysql -e (“SQL opdracht …… “)databasenaamdit stuurt een SQL opdracht naar de server.
Om de database "people" aan te maken in ons voorbeeld geven we de opdracht:
mysqladmin create peopleGa dan naar de prompt van de server met
mysql peoplenu kunnen we opdrachten gaan geven aan de server vanaf de prompt, bijvoorbeeld om de tabellen in de database te kunnen bekijken:
> show tables /ghet systeem antwoord met:
+-------------+ | Tables | +-------------+ | clients | | counties | | states | +-------------+
Alle opdrachten aan de server vanaf de prompt moeten eindigen met /g, dat het einde van de opdracht aangeeft en deze verstuurt naar de server voor verwerking.
Uiteraard hadden we bovengenoemd overzicht alleen kunnen krijgen als we de corresponderende tabellen van te voren hebben aangemaakt met de opdracht CREATE. Een typische CREATE opdracht luidt als volgt:
CREATE TABLE clients
CREATE TABLE states
CREATE TABLE counties (Cod_state INT(2) NOT NULL, Cod_county INT(3) NOT NULL, Description_c CHAR(30) NOT NULL, PRIMARY KEY(Cod_state,Cod_county)) /g
Als we vervolgens de volgende opdrachten geven
> show colums from clients from people /gkrijgen we:
Database: people Table: clients Rows: 4 +--------------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+----------+------+-----+---------+-------+ | NIF | char(9) | |PRI | | | | Name | char(15) | YES | | | | | Family_name | char(35) | | | | | | Address | char(50) | | | | | | City | int(5) | | | 0 | | | State | int(2) | | | 0 | | | Phone | int(9) | YES | | | | | Date | date | YES | | | | +--------------+----------+------+-----+---------+-------+
Database: people Table: states Rows: 3 +-----------------+----------+------+-----+---------+-------+ | Field | Type | Null | Key| Default | Extra | +-----------------+----------+------+-----+---------+-------+ | Cod_state | int(2) | | PRI | 0 | | | Descripcion_s | char(30) | | | | | +-----------------+----------+------+-----+---------+-------+
Database: people Table: counties Rows: 9 +------------------+----------+------+-----+---------+-------+ | Field | Type | Null | Key| Default | Extra | +------------------+----------+------+-----+---------+-------+ | Cod_state | int(2) | | PRI | 0 | | | Cod_county | int(3) | | PRI | 0 | | | Descripcion_c | char(30) | | | | | +------------------+----------+------+-----+---------+-------+
Daarna gaan we verder met invoeren van data in elk van de tabellen. Laten we de SQL opdracht INSERT gebruiken, zonder de hulp van andere programmeertalen of een API routine:
Om een record in te voegen in de tabel clients, counties en states doe je dit:
Om onze excursie in de SQL opdrachten af te ronden zullen we records selecteren in de tabellen van de huidige database. Laten we eens records selecteren uit de tabel clients waarbij we de voorwaarde voor het selecteren variëren en eerst selecteren uit de tabel counties:
> SELECT ALL Cod_state, Cod_county, Description_c from counties where Cod_state = 28 /gCod_state Cod_county Description_c 28 1 Fuenlabrada 28 2 Pozuelo 28 3 Madrid> SELECT ALL NIF,Name,Family_name,Address from clientes where City = 28001
NIF Name Family_name Address 23198623N JUAN ANDRES RUIZ MORALES C/ CATEDRAL 12 2B 5316828K PEDRO ROMERO DIAZ C/ HOLA 9 52312844J LUIS ALBERTO LISTO JIMENEZ C/ ROSA DE LOS VIENTOS 129 3I
In het begin van het artikel hebben we aangegeven dat het doel van dit artikel is om de karakteristieken van een specifieke SQL server te tonen, we wilden het artikel niet beperken tot een lijst van recepten en opdrachten om MySQL te gebruiken, maar in plaats daarvan de mogelijkheden en beperkingen van deze software bestuderen: alleen als je een programma als dit diepgaander begrijpt kun je profiteren van de voordelen die het te bieden heeft. MySQL ziet af van de implementatie van triggers en transactional logic en maakt daardoor het beheer van data (invoegen, wijzigen en verwijderen van records) erg complex bij multi-user toepassingen en het gebruik van een groot aantal aan elkaar gerelateerde tabellen. Desalniettemin, beveel ik deze server aan voor toepassingen die snelle toegang tot grote databases nodig hebben.
Tot slot wil ik opmerken dat het merendeel van de informatie voor dit artikel is verkregen uit de MySQL documentatie behorende bij het programma, uit verschillende artikelen in technische tijdschriften en een al enigszins vergeelde IBM handleiding voor SQL.