| MySQLA Database Server
![[Ilustration]](../../common/images/illustration21.jpg)  
Abstract: 
MySQL is an SQL  (Structured Query Language) database server supported by
a number of platforms, including Linux. Its Linux version is design with
fast performance in mind.
 
 
 
 IntroductionMySQL is a SQL (Structured Query Language) database server. It is a 
        client-server application formed by a server and a number of clients.  Discussing an SQL database is very complex since one would have to go back
	to the origins of relational databases and the aim of this article is not that
	ambitious, we simply seek to describe and demonstrate a specific implementation
	of an SQL server. As a historical reminder let us mention that IBM began to market
	SQL in 1981 and since then this product has had a fundamental role 
	on the development of relational databases. IBM proposed a version
	of SQL (which was later accepted) to the American National Standards Institute
	(ANSI) and since then it has found generalized  use in relational databases.
	DB2, at the moment the most popular database of this type, was created
	in 1983 and is used mostly in the mainframe environment. In the GNU world one of the databases most often quoted in the
	context of relational databases under Linux is MySQL. This application
	is not included in any Linux distribution because it does not have a GNU
	type license per se; commercial use of MySQL or any application that uses it
	requires acquiring a license. This database server is considered (even mentioned explicitly in its documentation)
	as the fastest and most robust for large and small volumes of data 
	(of course when comparing it with other servers within its own category).
	As we will discuss later on, the speed in processing is acomplished at
	the expense of not implementing a number of features of the SQL standard. MySQL is available (Sources and Binary) for:
        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 (pardon me) , amongst the most popular 
	operating systems. The free version was written by Michael Windenis, and the comercial 
	version is distributed by TCX Datakonsulter AB. Main Characteristics
	The main design goal of Mysql is speed and robustnessWritten in  C and C++,
	tested with GCC 2.7.2.1. Uses GNU autoconf for portability.Clients in C, C++, JAVA, Perl, TCL.Multiprocessor support, the server can use several CPUs if available.Runs on various platforms and O.S.System of passwords and privileges very flexible and secureAll passwords travel through the net encryptedVariable and fixed size records16 indices per table, each index can be made of 1 to 15 columns or
	a part of them with a maximum length of 127 bytesAll columns may have default valuesA utility (Isamchk) to check, optimize and fix tablesAll data is stored in ISO8859_1- formatClients use TCP or UNIX Sockets to communicate with the
	serverThe server supports error messages in several languagesAll commands have the options -help or -? to provide
	helpSeveral types of columns, like integers of 1, 2, 3, 4 and 8 bytes,
	floats, double precision, character, dates, enum, etc.ODBC for Windows 95
	(with sources), ACCESS can be used to connect with the server InstallationNaturally, before installing the database it is necessary to download
	the sources from the WEB:http://www.tcx.se 
 
 or FTP :
 ftp://ftp.sunet.se/pub/unix/databases/relational/mysql
 
 First, we must decide to download a source or binary distribution. 
	The last option is the easiest to install but it must be available
	for our target platform (it is indeed available for most popular platforms). Binary Installation After downloading the file:mysql-Version.tar.gz 
 proceed to unpack it. It can be done many ways, I personally prefer: 
		uncrompress first :gunzip -dfv	mysql-Version.tar.gz
 retrieve files from the archive second:tar -xvf mysql-Version.tar
 
 I run the tar command from the  /usr/local directory, therefore the
	extracted files will be found under/usr/local/mysql-3.20.32a-pc-linux-gnu-i586
 this is not a very practical name so it is recommended (also mentioned
	in the installation guide) that we make a symbolic link to this location> ln -s mysql-3.20.32a-pc-linux-gnu-i586/bin   mysql 
 The mysql directory contains the following: 
	drwxr-xr-x      8192
	Nov 24  1993 bin
	drwxr-xr-x      8192 Nov
	24  1993 etc
	drwxr-xr-x      8192 Aug
	17  1997 i18n
	drwxr-xrx       8192 Mar
	16  1994 include
	drwxr-xr-x      8192 Mar
	19 02:03 jdk1.1.3
	drwxr-xr-x      8192 Aug
	17  1997 jre
	drwxr-xr-x      8192 Mar
	16  1994 lib
	lrwxrwxrwx        36 Jan
	18 19:40 mysql 
	drwxr-xr-x      8192
	Feb  5 00:07 mysql-3.20.32a-pc-linux-gnu-i586
	drwxr-xr-x      8192 Nov
	24  1993 sbin
	drwxr-xr-x      8192 Nov
	24  1993 src
         and executing cd mysql we get to the directory of binaries of MySQL.
	If everything went well you are ready to lauch the database server. Source Installation Uncompress and unpack the sources as suggested in the previous
	section. 
 
	  cd mysql-Version 
	  ./configure
	 
	  make install
	 The source distribution comes with a large amount of documentation
	on the installation process. There is information on known bugs, 
	platform specific notes as well as suggestions for various operating systems,
	descriptions of the parameters for several configurations and even
	a collection of FAQ. If the process of installation goes well the first
	time (and that may be the first time anything that happens) the result would be
	a binary directory like the one described in the binary installation. An installation from sources is only recommended for users with good
	experience in installation and compilation of programs and who have enough time
	and patience to tackle on the number of problems that will undoubly emerge during the
	procedure. First Steps. Administration (Security)Upon installation of the server in your system following either of the
	two methods already described the following  directory :/usr/local/mysql-3.20.32a-pc-linux-gnu-i586 
 
 should contain these files and directories: 
	-rw-r--r--       1
	root       root         4133    Oct     1  1997	INSTALL-BINARY
	-rw-r--r--       1 root   
	   root        16666   Oct     7 21:10 	INSTALL-SOURCE
	-rw-r--r--       1 root   
	   root        24088   Oct     27 23:06 	NEWS
	-rw-r--r--       1 root   
	   root         3562    Apr     11  1997 	PORTING
	-rw-r--r--       1 root   
	   root         8512     May    21  1997 	PUBLIC
	-rw-r--r--       1 root   
	   root         1963     Jul      31  1997 	README
	-rw-r--r--       1 root   
	   root         3416     Jun     4  1997 	TODO
	drwxr-xr-x    6 root      
	root         8192     Oct     28 00:44 	bench
	drwxr-xr-x    2 cuenta1 
	users        8192    Mar     27 00:42 	bin
	drwxr-xr-x    5 root      
	root         8192     Mar     31 00:26 	data
	drwxr-xr-x    2 root      
	root         8192    Oct      28 00:44 	include
	drwxr-xr-x    2 root      
	root         8192    Oct     28 00:44 	lib
	-rw-r--r--      1 root    
	  root       132883  Jun        8  1997 	mysql-faq.html
	-rw-r--r--      1 root    
	  root       117622  Jun      10  1997 	mysql-faq.txt
	-rw-r--r--      1 root    
	  root         9301    Jun      8  1997 	mysql-faq_toc.html
	drwxr-xr-x   4 root       
	root         8192   Oct     28 00:44 	mysqlperl
	drwxr-xr-x   2 root       
	root         8192   Oct     28 00:44 	scripts
	drwxr-xr-x   3 root      
	root         8192    Oct     28 00:44 	share
	drwxr-xr-x   2 root      
	root         8192    Oct     28 00:44 	tests
	 For more information on the installation of the server take a look
	at the files README, TODO, INSTALL, mysql-faq, etc., which are very 
	complete and effective (part of this article is based on them). The directory /data will host any databases that you create
	on the system, they will be stored in separate subdirectories. The initial 
	installation creates by default the archives supporting security features
	in the server, that database is  mysql. There are several examples of SQL in  /bench . Notice that 
	installations from source code include a larger amount of examples than
	binary installations. Now the directory /share contains the error messages for the server
	in each of the languages available. /include and /lib contain the header files and libraries
	of the distribution. As expected  /bin  contains all the executables, among them the most
	important are: `mysql'
 
      An SQL Shell (with GNU readline). It can be used either interactively 
	or not. `mysqladmin'
 
      Administration Tools. Create/Delete databases. Information about processes and
	version. `mysqld'
 
     SQL deamon
	.It must be running all the time. `mysqlshow'
 
      Views information concerning a database, table or field. `safe_mysqld'
 
      Launches mysqld. `mysqlaccess'
 
      Script  to check the privileges of a combination: Host, User and Databse. `mysqlbug'
 
      Use to report possible bugs found in the server. `mysql_install_db'
 
      Creates huge tables with default privileges, it is usually
	run after installing for the first time a new system. `isamchk'
 
 Checks, optimizes and fixes tables. Security The security system on MySQL warranties that each user can only perform
	strictly authorized tasks (no more no less). The system chooses privileges for a transaction according to 
	WHICH USER from WHICH HOST is connected to
	a  GIVEN DATABASE. The system of permissions is based, 
	why not, on the contents of 3 tables,  USER, HOST and  DB
	of the database  mysql. 
 The columns of these three tables are:Database: mysql 
 
 Table: db
 
 
	
	| 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 |  |  Table: host
 
 
	 
	| 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 |  |  Table: user
 
 
	 
	| 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 |  |  
 If can be decided whether to authorize or not SELECT, INSERT, UPDATE,
	and DELETE files in a table. It is also possible to allow or not to CREATE or DROP (delete) tables
	or databases. Another interesting permission available is access to the 
	administrative commands like shutdown, reload, process,
	etc. The current permissions can be inspected with the script  mysqlaccess. A HOST must always be a host local, an IP number or an SQL expression.
	If in the table  db the host column is empty it means  any host#148; in the table
	of  host. If on the other hand in the table  host or user
	the column host is empty it means that any HOST can establish a TCP connection with our server. Db is the name of the database. An empty  USER column means any user name. First StepsThe fastest way to launch the server is running the following command:mysql.server  start 
 and to stop it :
 
 mysql.server stop
 
 The same operations can be performed with the script safe_mysql, as 
	indicated in the installation guide, but one way or another the file 
	result is to execute the deamon  mysqld. As it can be easily understood, it is necessary to launch the 
	server to perform any operation with the database; with the server running
	we can run operations like  mysqladmin whose syntax is:mysqladmin [OPTIONS] command command 
  where OPTIONS can be : 
	  -f, --force	Does not prompt the user for confirmation 
	when deleting a table.
	  -?,
	--help		Shows the present help menu .
	  -h, --host=#		Connection to the host.
	  -p,
	--password[=...]	Access password to the server.
	  -P  --port=...	
	  Port number to use for the connection.
	  -S  --socket=...        
	       Socket file to be used for the connection
	  -u, --user=#	 
          User for the connection if not the current user.
	  -V, --version	      
	       Show information about the current server version .
	 where command can be one or more of the following: 
	create  database_name Creates a new database
drop    database_name Deletes the database named and all its tables
 kill    process_idkill a process associated with mysql
  processlist		           List the processes running on the server
 shutdown		               Shutdown the server
  status	Show current status of the server
version		               Show the version number of the server
 For instance running:mysqladmin create  newdatabase 
 creates a new database with the name "newdatabase" we can see the processes running on the server by runningmysqladmin 	processlist 
 Another important command is mysqlshow which let us see
	the databases available, for example executing that command
	without options gives:> mysqlshow 
 
 
	+-----------+
	| Databases |
	+-----------+
	| mysql     |
	| people    |
	| test      |
	+-----------+
 
 SQL Language under MySQLIn the introduction we already indicated how this 
	server is considered one of the fastest within its class
	for large and small sets of data, and we also mentioned that
	this performance came at the expense of not implementing a number
	of features of SQL that in my opinion are important. Two 
	important features left out are the Triggers and the Transactional
	Logic. Triggers are nothing but a small portion of code that
	gets "fired" --executed-- when a given operation is executed
	on the database (an update, delete, etc..). Obviously the test
	for the trigger condition as well as its management is something 
	that consumes resources of the system and this is the only
	reason why they are not implemented. The consistency among the tables in a relational database
	is very important. SQL provides a more or less simple tool
	to provide for this consistency: "Transactional Logic". It is the
	server that should provide the mechanisms for blocking files
	as well as consolidation and regresion of operations in the
	database. Well, MySQL does not support the transactions
	in order to improve the speed of the server (at least that is
	what the documentation says), the only aid we have is to use
	the commands LOCK tables / UNLOCK tables that permit to block 
	tables from other users use but not allowing us to remove the
	operations already performed with the data. Taking into account the limitations of the server we will next
	review a number of SQL commands, not with the goal of analysing
	SQL commands per se but to see how this server implements them.  Aftern launching the server we are ready to send instructions.
	For example, let us  create a database named "people" that is
	made of three tables "clients" "states" "counties". It is very simple
	and not very useful example but it gives us an idea how to 
	manipulate the data in a real case. First we must say that these
	operations can be performed in several ways: through an API in C, C++
	JAVA or though  a ODBC if we were working under Windows95 (Pardon
	me again), we can also use the shell provided by the distribution.
	I will opt for the last method because for the purpose of this
	article it is enough and we avoid describing the specifics of 
	other programing languages. The Mysql shell can be launched running:mysql 	databasename 
 
 after receiving the shell prompt we can start sending commands to
	the server. It is also possible to use the shell in batch mode by running:mysql -e
	(SQL command  
 )databasename 
 this sends an SQL command to the server. To create the database "people" of our example we execute
	the command:mysqladmin create people 
 
 Then run the shell asmysql  people 
 
 now from the shell we can start to send commands to the proper
	 server, for instance  to view the tables available within the
	 database:> show tables /g 
 
 the system responds with:  Database: people
 
 
	+-------------+
	|   Tables    |
	+-------------+
	| clients     |
	| counties    |
	|  states     |
	+-------------+
 All commands sent to the server from the shell finish with /g,
	which indicates the end of command and submits it to the server
	for processing. Naturally, the only way we could have gotten the response
	above is if we had previously created the corresponding tables with the
	command CREATE. A typical CREATE command has the following look: 
	CREATE TABLE clients
	      (NIF         CHAR(9)   NOT NULL PRIMARY KEY,
	       Name        CHAR(15)  NOT NULL,
	       Family_name CHAR(35)  NOT NULL,
	       Address     CHAR(50)  NOT NULL,
	       City        INT(5)    NOT NULL,
	       State       INT(2)    NOT NULL,
	       Phone       INT(9),
	       Date        DATE      NOT NULL)   /g
	
 
    CREATE TABLE states    
	      (Cod_state           INT(2)   NOT NULL PRIMARY KEY,
	       Description_s       CHAR(30) NOT NULL)   /g
	
 
    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          
 If we next run> show colums from
	 clients from people   /g > show columns
	from states  from people   /g
 > show columns from
	 counties  from people   /g
 
 
 we would obtain: 
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) |      |     |         |       |
+------------------+----------+------+-----+---------+-------+
 Afterwards we would proceed to insert data in each of the tables. 
	Let us use the SQL command INSERT without any participation of
	other programming languages nor API routine: To insert a record in the clients, counties and states tables 
	do this: 
	INSERT INTO clients
	VALUES
	("5316828K","PEDRO","ROMERO
	DIAZ","C/ HOLA 9   ",29003,29,911111111,19980203)  
	/g
	
 INSERT INTO counties
	VALUES
	(28,001,"Fuenlabrada")
	 /g
	
 INSERT INTO states
	VALUES
	(08,"Barcelona")
	 /g
	
 To conclude our excursion with the SQL commands we will select 
	the rows inserted in the tables of the current database. Let us select
	records from the clients table varying the condition for selection and
	selecting first from the table of counties:>   SELECT ALL
	Cod_state, Cod_county, Description_c from counties
	       where Cod_state	= 28    /g 
 
Cod_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 	                           direccion
	2416728U	JOSE	FERNANDEZ 
	ROMERO	C/ FELIZ 1 3G
	
 
    > SELECT ALL
	NIF,Name,Family_name,Address from clients
	       where State  =
	29
	 
	
 
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  
 ConclusionsWe opened this article saying that our purpose with this article
	was to show the fundamental characteristics of a specific SQL server,
	we did not want to reduce the article to a list of recipes and commands
	to use MySQL but instead we wished to study the possibilities and
	limitations of this software; only knowing in depth an application
	like this one we can truly get the greatest advantages it has to offer.
	MySQL omits the implementation of triggers and transactional logic 
	and therefore makes the management of data (inserting,
	modifying, deleting records) very complex from multiuser applications and using 
	numerous interelated tables. Nevertheless, I recommend this server
	for applications requiring very fast access of large
	databases. Finally I would like to mention that most of the information in
	this article was obtained from the MySQL documentation included in the
	distribution, from several articles in technical magazine as well as
	from an already yellowish IBM manual about SQL. |