Getting Started With MySQL
Installation

I've sucessfully installed MySQL on Linux, FreeBSD, NetBSD, OpenBSD, SCO OpenServer and Solaris.

FreeBSD, OpenBSD, NetBSD and most Linux distributions come with MySQL and give you the option of installing it when you install the rest of the system. If you want or need to install it afterward, follow the instructions below.

RPM-based Linux

To install MySQL on an RPM-based Linux distribution, install the mysql, mysql-server and mysql-devel RPMS using yum or install them from the CD/DVD's that came with your distribution using rpm -i.

Debian and Ubuntu Linux

To install on MySQL on Debian and Ubuntu Linux, run apt-get install mysql-server and apt-get install libmysqlclientclient6-dev. MySQL packages don't appear to be available for older Debian releases, so for those releases, I've always compiled it from source. Alternatively, you can download a binary distribution in tar.gz format from the MySQL site.

FreeBSD

If you have an internet connection, run pkg_add -r mysql. When the command completes, MySQL will be installed. You can also install MySQL from the Ports CD(s) that came with your distribution using /stand/sysinstall.

OpenBSD

The mysql-client and mysql-server packages are available from ftp.openbsd.org or on CD's that came with your distribution. You can install them using pkg_add.

NetBSD

The mysql-client and mysql-server packages are available from ftp.netbsd.org or on CD's that came with your distribution. You can install them using pkg_add.

SCO OpenServer

For SCO OpenServer, MySQL packages are available from the Skunkware ftp server. SCO OpenServer packages are often called VOL's because they come as a set of files named VOL.000.000, VOL.000.001, etc. These VOLS can be installed using the Software Manager (custom).

Solaris

The Solaris Companion CD provides MySQL and its downloadable in package form from many web sites including the MySQL site. You can use pkgtool to install the package. Note, that with some versions of Solaris and some versions of MySQL, you have to create a "wheel" group before installing the MySQL package. You can do this (as root) using the command: /usr/sbin/groupadd wheel

Compiling From Source

If you want to compile MySQL from source, it should compile cleanly on all of the platforms mentioned above. The source code is available from the MySQL site. With older versions of MySQL, I've run out of memory while compiling on machines with less than 64 meg. I don't believe that this is still a problem though. I usually give the configure script the --prefix=/usr/local/mysql parameter so that MySQL will be installed entirely under /usr/local/mysql. I then add /usr/local/mysql/bin to my PATH environment variable and /usr/local/mysql/lib/mysql to my LD_LIBRARY_PATH environment variable.

Starting the Database at Boot Time

The package distributions of MySQL either install a script which starts the database at boot time or use systemd.

If you compiled from source, you'll need to install a script like one of the following to start the database at boot time.

If you are using MySQL 4 or 5:

#!/bin/sh

case "$1" in
        start)
                if ( test ! -d "/usr/local/mysql/var" ); then
                        mkdir -p /usr/local/mysql/var/mysql
                fi
                if ( test ! -d "/usr/local/mysql/var/log" ); then
                        mkdir -p /usr/local/mysql/var/log
                fi
                if ( test ! -d "/usr/local/mysql/var/mysql" ); then
                        /usr/local/mysql/bin/mysql_install_db --datadir=/usr/local/mysql/var
                fi
                chown -R mysql.mysql /usr/local/mysql/var
                chmod 0755 /usr/local/mysql/var
                chmod 0755 /usr/local/mysql/var/log
		/usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/var --err-log=/usr/local/mysql/var/log/mysqld.log --log=/usr/local/mysql/var/log/mysqld.log --socket=/tmp/mysql.sock
                ;;
        stop)
                kill `ps -efa | grep mysql | grep -v grep | awk '{print $2}'`
                ;;
        *)
                echo $"Usage: $0 {start|stop}"
                exit 1
esac

exit 0

If you are using MySQL 3:

#!/bin/sh

case "$1" in
        start)
                if ( test ! -d "/usr/local/mysql/var/mysql" ); then
                        /usr/local/mysql/bin/mysql_install_db
                fi
                chown -R mysql.mysql /usr/local/mysql/var
                chmod 0755 /usr/local/mysql/var
                /usr/local/mysql/bin/safe_mysqld
                ;;
        stop)
                kill `ps -efa | grep mysql | grep -v grep | awk '{print $2}'`
                ;;
        *)
                echo $"Usage: $0 {start|stop}"
                exit 1
esac

exit 0

Install this script and run it with the "start" option to start up the database. Running it with the "stop" option shuts the database down. To access a database, it must be running.

Creating a Database

After installation, MySQL is ready to use but to do any useful work, you'll have to create a database.

The installation process creates a database named mysql containing privileges and other housekeeping information and a root user which has no password.

The following commands give the root user the password newpassword.

mysql -uroot -e "update user set password=password('newpassword') where user='root'" mysql
mysqladmin -uroot reload

Though you can create tables in the mysql database, it's not a good idea. You should create a new database. The following command creates a database called testdb.

mysqladmin -uroot -pnewpassword create testdb

To create a user, log into the mysql database using the following command.

mysql -uroot -pnewpassword mysql

The following queries create a user called testuser with password testpassword and allows it to log in from the local machine or any remote host.

insert into user (host,user,password) values ('localhost','testuser',password('testpassword'));
insert into user (host,user,password) values ('%','testuser',password('testpassword'));

Once the user is created, it must be given database-specific priveleges. You'll need to run a query like the following to give testuser all privileges on the testdb database.

insert into db values ('%','testdb','testuser','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');

Various versions of MySQL have differnet numbers of columns in the db table, if the query above fails, run:.

desc db

Then count the number of columns with Type enum('N','Y') and re-run the query above using that number ,'Y' arguments.

Exit the mysql client and run the following command to activate these changes.

mysqladmin -uroot -pnewpassword reload

To delete a user, log into the mysql database using the following command.

mysql -uroot -pnewpassword mysql

Delete the appropriate rows from the user and db tables. The following queries remove the testuser user and all database-specific permissions that testuser had.

DELETE FROM user WHERE user='testuser';
DELETE FROM db WHERE user='testuser';

Exit the mysql client and run the following command to activate these changes.

mysqladmin -uroot -pnewpassword reload

If you want to drop the database, you can do so with the following command.

mysqladmin -uroot -pnewpassword drop testdb

This should be enough to get you started. To set up more complex configurations, consult the MySQL online documentation.

Accessing a Database

Accessing a MySQL database using the mysql client tool is simple. For example, to access a database called testdb on the local machine as the testuser user with password testpassword, use the following command.

mysql -utestuser -ptestpassword testdb

If you want to access a database on a remote machine, say on testhost, use the -h option as follows.

mysql -htesthost -utestuser -ptestpassword testdb

Once you're connected to the database, the mysql client prompts you to enter a query. Queries may be split across multiple lines. To run a query, end it with a semicolon or type \g on the next line. To exit, type \q.

A sample mysql session follows.

[user@localhost user]$ mysql -utestuser -ptestpassword testdb
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5 to server version: 3.23.41

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> create table testtable (
    -> col1 char(40),
    -> col2 integer 
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| testtable        |
+------------------+
1 row in set (0.00 sec)

mysql> describe testtable;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| col1  | char(40) | YES  |     | NULL    |       |
| col2  | int(11)  | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> insert into testtable values ('hello',50);
Query OK, 1 row affected (0.00 sec)

mysql> insert into testtable values ('hi',60);
Query OK, 1 row affected (0.00 sec)

mysql> insert into testtable values ('bye',70);
Query OK, 1 row affected (0.00 sec)

mysql> select * from testtable;
+-------+------+
| col1  | col2 |
+-------+------+
| hello |   50 |
| hi    |   60 |
| bye   |   70 |
+-------+------+
3 rows in set (0.00 sec)

mysql> update testtable set col2=0 where col1='hi';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from testtable;
+-------+------+
| col1  | col2 |
+-------+------+
| hello |   50 |
| hi    |    0 |
| bye   |   70 |
+-------+------+
3 rows in set (0.00 sec)

mysql> delete from testtable where col2=50;
Query OK, 1 row affected (0.00 sec)

mysql> select * from testtable;
+------+------+
| col1 | col2 |
+------+------+
| hi   |    0 |
| bye  |   70 |
+------+------+
2 rows in set (0.00 sec)

mysql> drop table testtable;
Query OK, 0 rows affected (0.00 sec)

mysql> \q
Bye

Accessing a Database With SQL Relay

Accessing MySQL from SQL Relay requires an instance entry in your sqlrelay.conf file for the database that you want to access. Here is an example sqlrelay.conf which defines an SQL Relay instance called mysqltest. This instance connects to the testdb database on the local machine as the user testuser with password testpassword.

<?xml version="1.0"?>
<!DOCTYPE instances SYSTEM "sqlrelay.dtd">
<instances>

        <instance id="mysqltest" port="9000" socket="/tmp/mysqltest.socket" dbase="mysql" connections="3" maxconnections="5" maxqueuelength="0" growby="1" ttl="60" endofsession="commit" sessiontimeout="600" runasuser="nobody" runasgroup="nobody" cursors="5">
                <users>
                        <user user="mysqltest" password="mysqltest"/>
                </users>
                <connections>
                        <connection connectionid="mysqltest" string="user=testuser;password=testpassword;db=testdb" metric="1"/>
                </connections>
        </instance>

</instances>

If you want to connect to a database on a remote machine, say on testhost, you would need to add host=testhost; to the string attribute of the connection tag.

Now you can start up this instance with the following command.

sqlr-start -id mysqltest

To connect to the instance and run queries, use the following command.

sqlrsh -id mysqltest

The following command shuts down the SQL Relay instance.

sqlr-stop mysqltest
MySQL Quirks

MySQL supports multiple backend storage engines, the most popular being the InnoDB and MyISAM engines. Since MySQL 5.5, InnoDB has been the default storage engine and it fully supports both transactions and foreign key constraints.

However, prior to version 5.5, MyISAM was the default storage engine and prior to version 4.0 you needed to use MySQL-max to get support for InnoDB.

While unlikely, it is possible that you may end up using an older version of MySQL, or one where someone has specifically chosen to use MyISAM tables, and in that case it is important to note that the MyISAM storage engine doesn't support transactions at all and handles foreign key constraints oddly.

For example, take the following table declarations:

create table cars (
        car_id  int     not null,
        ...
);

create table carkeys (
        carkey_id  int     not null,
        ...
);

create table keys_of_cars (
        car_id  int     not null,
        carkey_id  int     not null,
        ...
        foreign key (car_id) references cars (car_id),
        foreign key (carkey_id) references carkeys (carkey_id)
);

When using InnoDB tables, an attempt to insert car_id's and carkey_id's into the keys_of_cars table will fail unless those car_id's and carkey_id's exist in the cars and carkeys tables respectively. When using MyISAM tables, this will not fail.

What's quirky about using MyISAM tables with MySQL is that it the foreign key syntax is allowed, but ignored. Other databases that don't support foreign keys don't allow the syntax either.