Installation and configuration of MySQL

A Swedish company called MySQL AB (www.mysql.com) is responsible for developing MySQL. MySQL has been released as an open-source product, gaining revenue by offering a variety of MySQL support packages, commercial licenses, and MySQL brand franchise products. Because MySQL is an open-source product, it has been ported to several different operating systems (primarily UNIX and Linux systems, although there are Windows versions and now even a Mac OS X version as well).

Getting MySQL

MySQL comes in both binary format and as an open-source. At the time of writing the current binary version available through Fedora repositories as an RPM package is version 5.0.45 while you can download version 5.0.51 directly from the MySQL web site.

When selecting between installation from the source code and using already built binary package consider the following

Under some circumstances, you may be better off installing MySQL from a source distribution:
From INSTALL-SOURCE file.
This lecture will concentrate on building MySQL server from the source code. To download the code and unpack it run the following commands:

# cd /usr/local/src
# wget http://mysql.mirrors.hoobly.com/Downloads/MySQL-5.0/mysql-5.0.51a.tar.gz
# tar xvfz mysql-5.0.51a.tar.gz 
# cd mysql-5.0.51a

Installing MySQL

Now, we are ready to build MySQL server with all the required libraries and start installation. Typically, when we build a program from its source code, we start from creating an appropriate Makefile by using the configure command. Here, we will start from the same thing, but first we will assign several low-level options for the gcc compiler:

# CFLAGS="-O3 -mpentiumpro"
# CXX=gcc
# CXXFLAGS="-O3 -mpentiumpro -felide-constructors -fno-exceptions -fno-rtti"
Then, we can find out all possible options for the configure script by running
# ./configure --help
Now, we are ready to start the configure script:
# ./configure \
  --enable-assembler \
  --disable-shared \
  --with-mysqld-ldflags="--all-static" \
  --with-client-ldflags="--all-static" \
  --prefix=/usr/local/mysql \
  --localstatedir=/data/mysql \
  --with-unix-socket-path=/tmp/mysql.sock 
Let's mentions some of the options we used: When the Makefile is successfully created, we can build and install the package:
# make
# make install

Configuring and testing

After the package is installed, we need to make sure it successfully starts with all these options we used and do some basic configuration.

We start from creating a special mysql user under which privileges the MySQL server will work:

# groupadd mysql
# useradd mysql -g mysql -M -s /sbin/nologin
Now, we need to make sure that this user has access to all the directories needed:
# chgrp -R mysql /usr/local/mysql/bin
# mkdir /data/mysql
# chown -cR mysql /data/mysql

Once this is done, we can go to the MySQL configuration file /etc/my.cnf and change some settings. Please make sure that in the [mysqld] section instead of

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
you have
datadir=/data/mysql
socket=/tmp/mysql.sock
because these are the directories we specified during the Makefile configuration. After this s done, we can create the initial version of the database files:
# /usr/local/mysql/bin/mysql_install_db
If this program finished with no errors, we will work on automatic start up of the server.

MySQL package contains a start-up script called mysql.server which has to be copied into the usual start-up script location:

# cp /usr/local/mysql/share/mysql/mysql.server /etc/init.d/
# cd /etc/init.d
# chkconfig --add mysql.server 
# chkconfig --list mysql.server 

Now, let's start the server and see if it actually works:

# service mysql.server start
If you see
Starting MySQL                           [  OK  ]
everything works fine and we can try to connect to the database. The client program that allows us to do this is called mysql and it is located in the /usr/local/mysql/bin directory (it's not a bad idea to append this directory name to the PATH environment variable). The initial databases installed by mysql_install_db have only two users: root and anonymous. We need to login as the root user to have right to change something inside the MySQL:
# /usr/local/mysql/bin/mysql -u root
mysql> use mysql;
Database changed
mysql> select user, host, password from user;
+------+-----------------------+----------+
| user | host                  | password |
+------+-----------------------+----------+
| root | localhost             |          | 
| root | localhost.localdomain |          | 
| root | 127.0.0.1             |          | 
|      | localhost             |          | 
|      | localhost.localdomain |          | 
+------+-----------------------+----------+
5 rows in set (0.00 sec)
mysql> update user set password=password('ist280-admin');
Query OK, 5 rows affected (0.00 sec)
Rows matched: 5  Changed: 5  Warnings: 0
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> quit
Bye
We just set the new passwords for all the users. Now, let's try to login as root using the new password:
# /usr/local/mysql/bin/mysql -u root mysql -p
Enter password: 
mysql> quit
Bye

MySQL administrator login window If everything from the above worked with no errors, you are in great shape and we can add a GUI interface to your MySQL server. From the shell prompt run the following commands:

# yum install mysql-administrator
# mysql-administrator &
On the figure to your right, notice the port number to which MySQL server is listening for incoming connections.

If you are successfully logged on, you will see a window like this:

MySQL Administrator Window: Server Information
Using this interface we can create a new user to test a remote connection to the server:
MySQL Administrator Window: adding new user
We can also create user from the command line interface:
# mysql -u root mysql -p
Enter password:
mysql> grant select on test.* to daniel@'%' identified by 'daniel_password'; 
Query OK, 0 rows affected (0.0 sec)
mysql> quit
Bye
Note the name of the user we are granting the privilege to daniel@'%'. If the first part of the name (before the @ symbol) is just the name, the second part indicates the hosts this user is allowed to connect to the server. In our case, the percent sign show that this user can connect to MySQL server from any computer.

Using this newly created account we can try to connect from the Windows host machine, but first we need to make sure that the port used by MySQL for connections is open in our Firewall settings. Please open the Firewall GUI

Firewall configuration window
and click on the Other ports item menu on the left panel
Firewall: configuring other ports
Hit the Add button on your right and pick the right port (3306 tcp) from the list
Firewall: selecting the MySQL port
Once you double click on the port, you will see one more other port added to the list of the open ports in firewall.
Firewall: port added
Now, we can use a Windows version of MySQL Administrator to connect to our Linux DB server.
Windows MySQL Admin

Tune up MySQL server

If you run mysqladmin command with the option variables

$ mysqladmin variables -u root -p
you will see a table like this:
+---------------------------------+----------------------------------------+
| Variable_name                   | Value                                  |
+---------------------------------+----------------------------------------+
| auto_increment_increment        | 1                                      |
| auto_increment_offset           | 1                                      |
| automatic_sp_privileges         | ON                                     |
| back_log                        | 50                                     |
| basedir                         | /usr/local/mysql/                      |
| binlog_cache_size               | 32768                                  |
| bulk_insert_buffer_size         | 8388608                                |
| character_set_client            | latin1                                 |
| character_set_connection        | latin1                                 |
| character_set_database          | latin1                                 |
| character_set_filesystem        | binary                                 |
| character_set_results           | latin1                                 |
| character_set_server            | latin1                                 |
| character_set_system            | utf8                                   |
| character_sets_dir              | /usr/local/mysql/share/mysql/charsets/ |
| collation_connection            | latin1_swedish_ci                      |
| collation_database              | latin1_swedish_ci                      |
| collation_server                | latin1_swedish_ci                      |
| completion_type                 | 0                                      |
| concurrent_insert               | 1                                      |
| connect_timeout                 | 5                                      |
| datadir                         | /data/mysql/                           |
| date_format                     | %Y-%m-%d                               |
| datetime_format                 | %Y-%m-%d %H:%i:%s                      |
| default_week_format             | 0                                      |
| delay_key_write                 | ON                                     |
| delayed_insert_limit            | 100                                    |
| delayed_insert_timeout          | 300                                    |
| delayed_queue_size              | 1000                                   |
| div_precision_increment         | 4                                      |
| keep_files_on_create            | OFF                                    |
| engine_condition_pushdown       | OFF                                    |
| expire_logs_days                | 0                                      |
| flush                           | OFF                                    |
| flush_time                      | 0                                      |
| ft_boolean_syntax               | + -<>()~*:""&|                         |
| ft_max_word_len                 | 84                                     |
| ft_min_word_len                 | 4                                      |
| ft_query_expansion_limit        | 20                                     |
| ft_stopword_file                | (built-in)                             |
| group_concat_max_len            | 1024                                   |
| have_archive                    | NO                                     |
| have_bdb                        | NO                                     |
| have_blackhole_engine           | NO                                     |
| have_compress                   | YES                                    |
| have_crypt                      | YES                                    |
| have_csv                        | NO                                     |
| have_dynamic_loading            | NO                                     |
| have_example_engine             | NO                                     |
| have_federated_engine           | NO                                     |
| have_geometry                   | YES                                    |
| have_innodb                     | YES                                    |
| have_isam                       | NO                                     |
| have_merge_engine               | YES                                    |
| have_ndbcluster                 | NO                                     |
| have_openssl                    | NO                                     |
| have_ssl                        | NO                                     |
| have_query_cache                | YES                                    |
| have_raid                       | NO                                     |
| have_rtree_keys                 | YES                                    |
| have_symlink                    | YES                                    |
| hostname                        | localhost.localdomain                  |
| init_connect                    |                                        |
| init_file                       |                                        |
| init_slave                      |                                        |
| innodb_additional_mem_pool_size | 1048576                                |
| innodb_autoextend_increment     | 8                                      |
| innodb_buffer_pool_awe_mem_mb   | 0                                      |
| innodb_buffer_pool_size         | 8388608                                |
| innodb_checksums                | ON                                     |
| innodb_commit_concurrency       | 0                                      |
| innodb_concurrency_tickets      | 500                                    |
| innodb_data_file_path           | ibdata1:10M:autoextend                 |
| innodb_data_home_dir            |                                        |
| innodb_doublewrite              | ON                                     |
| innodb_fast_shutdown            | 1                                      |
| innodb_file_io_threads          | 4                                      |
| innodb_file_per_table           | OFF                                    |
| innodb_flush_log_at_trx_commit  | 1                                      |
| innodb_flush_method             |                                        |
| innodb_force_recovery           | 0                                      |
| innodb_lock_wait_timeout        | 50                                     |
| innodb_locks_unsafe_for_binlog  | OFF                                    |
| innodb_log_arch_dir             |                                        |
| innodb_log_archive              | OFF                                    |
| innodb_log_buffer_size          | 1048576                                |
| innodb_log_file_size            | 5242880                                |
| innodb_log_files_in_group       | 2                                      |
| innodb_log_group_home_dir       | ./                                     |
| innodb_max_dirty_pages_pct      | 90                                     |
| innodb_max_purge_lag            | 0                                      |
| innodb_mirrored_log_groups      | 1                                      |
| innodb_open_files               | 300                                    |
| innodb_rollback_on_timeout      | OFF                                    |
| innodb_support_xa               | ON                                     |
| innodb_sync_spin_loops          | 20                                     |
| innodb_table_locks              | ON                                     |
| innodb_thread_concurrency       | 8                                      |
| innodb_thread_sleep_delay       | 10000                                  |
| interactive_timeout             | 28800                                  |
| join_buffer_size                | 131072                                 |
| key_buffer_size                 | 8388600                                |
| key_cache_age_threshold         | 300                                    |
| key_cache_block_size            | 1024                                   |
| key_cache_division_limit        | 100                                    |
| language                        | /usr/local/mysql/share/mysql/english/  |
| large_files_support             | ON                                     |
| large_page_size                 | 0                                      |
| large_pages                     | OFF                                    |
| lc_time_names                   | en_US                                  |
| license                         | GPL                                    |
| local_infile                    | ON                                     |
| locked_in_memory                | OFF                                    |
| log                             | OFF                                    |
| log_bin                         | OFF                                    |
| log_bin_trust_function_creators | OFF                                    |
| log_error                       |                                        |
| log_queries_not_using_indexes   | OFF                                    |
| log_slave_updates               | OFF                                    |
| log_slow_queries                | OFF                                    |
| log_warnings                    | 1                                      |
| long_query_time                 | 10                                     |
| low_priority_updates            | OFF                                    |
| lower_case_file_system          | OFF                                    |
| lower_case_table_names          | 0                                      |
| max_allowed_packet              | 1048576                                |
| max_binlog_cache_size           | 4294967295                             |
| max_binlog_size                 | 1073741824                             |
| max_connect_errors              | 10                                     |
| max_connections                 | 100                                    |
| max_delayed_threads             | 20                                     |
| max_error_count                 | 64                                     |
| max_heap_table_size             | 16777216                               |
| max_insert_delayed_threads      | 20                                     |
| max_join_size                   | 4294967295                             |
| max_length_for_sort_data        | 1024                                   |
| max_prepared_stmt_count         | 16382                                  |
| max_relay_log_size              | 0                                      |
| max_seeks_for_key               | 4294967295                             |
| max_sort_length                 | 1024                                   |
| max_sp_recursion_depth          | 0                                      |
| max_tmp_tables                  | 32                                     |
| max_user_connections            | 0                                      |
| max_write_lock_count            | 4294967295                             |
| multi_range_count               | 256                                    |
| myisam_data_pointer_size        | 6                                      |
| myisam_max_sort_file_size       | 2147483647                             |
| myisam_recover_options          | OFF                                    |
| myisam_repair_threads           | 1                                      |
| myisam_sort_buffer_size         | 8388608                                |
| myisam_stats_method             | nulls_unequal                          |
| net_buffer_length               | 16384                                  |
| net_read_timeout                | 30                                     |
| net_retry_count                 | 10                                     |
| net_write_timeout               | 60                                     |
| new                             | OFF                                    |
| old_passwords                   | ON                                     |
| open_files_limit                | 1024                                   |
| optimizer_prune_level           | 1                                      |
| optimizer_search_depth          | 62                                     |
| pid_file                        | /data/mysql/localhost.localdomain.pid  |
| port                            | 3306                                   |
| preload_buffer_size             | 32768                                  |
| profiling                       | OFF                                    |
| profiling_history_size          | 15                                     |
| protocol_version                | 10                                     |
| query_alloc_block_size          | 8192                                   |
| query_cache_limit               | 1048576                                |
| query_cache_min_res_unit        | 4096                                   |
| query_cache_size                | 0                                      |
| query_cache_type                | ON                                     |
| query_cache_wlock_invalidate    | OFF                                    |
| query_prealloc_size             | 8192                                   |
| range_alloc_block_size          | 2048                                   |
| read_buffer_size                | 131072                                 |
| read_only                       | OFF                                    |
| read_rnd_buffer_size            | 262144                                 |
| relay_log_purge                 | ON                                     |
| relay_log_space_limit           | 0                                      |
| rpl_recovery_rank               | 0                                      |
| secure_auth                     | OFF                                    |
| secure_file_priv                |                                        |
| server_id                       | 0                                      |
| skip_external_locking           | ON                                     |
| skip_networking                 | OFF                                    |
| skip_show_database              | OFF                                    |
| slave_compressed_protocol       | OFF                                    |
| slave_load_tmpdir               | /tmp/                                  |
| slave_net_timeout               | 3600                                   |
| slave_skip_errors               | OFF                                    |
| slave_transaction_retries       | 10                                     |
| slow_launch_time                | 2                                      |
| socket                          | /tmp/mysql.sock                        |
| sort_buffer_size                | 2097144                                |
| sql_big_selects                 | ON                                     |
| sql_mode                        |                                        |
| sql_notes                       | ON                                     |
| sql_warnings                    | OFF                                    |
| ssl_ca                          |                                        |
| ssl_capath                      |                                        |
| ssl_cert                        |                                        |
| ssl_cipher                      |                                        |
| ssl_key                         |                                        |
| storage_engine                  | MyISAM                                 |
| sync_binlog                     | 0                                      |
| sync_frm                        | ON                                     |
| system_time_zone                | EDT                                    |
| table_cache                     | 64                                     |
| table_lock_wait_timeout         | 50                                     |
| table_type                      | MyISAM                                 |
| thread_cache_size               | 0                                      |
| thread_stack                    | 196608                                 |
| time_format                     | %H:%i:%s                               |
| time_zone                       | SYSTEM                                 |
| timed_mutexes                   | OFF                                    |
| tmp_table_size                  | 33554432                               |
| tmpdir                          | /tmp/                                  |
| transaction_alloc_block_size    | 8192                                   |
| transaction_prealloc_size       | 4096                                   |
| tx_isolation                    | REPEATABLE-READ                        |
| updatable_views_with_limit      | YES                                    |
| version                         | 5.0.51a                                |
| version_comment                 | Source distribution                    |
| version_compile_machine         | i686                                   |
| version_compile_os              | redhat-linux-gnu                       |
| wait_timeout                    | 28800                                  |
+---------------------------------+----------------------------------------+
Some of these variables are:

You can change these and many other variable values using the -O option of mysqladmin command. For more details on these variables and explanations on other variable please see the official MySQL documentation.