- More info here: http://dev.mysql.com/
I have tested the following guide when installing mysql 5.6, 5.5, 5.1, 5.0 version. At the time I'm writing the latest stable version is 5.6.10.
Installing from source
- More info here: http://dev.mysql.com/doc/refman/5.6/en/installing-source-distribution.html
- Download: http://dev.mysql.com/downloads/mysql/#downloads
You may want to install from source when the distributed binaries were compiled against a glibc version which is different from the one installed in your system.
cd /usr/local/mysql wget latest mysql source tar zxvf mysql-VERSION.tar.gz cd mysql-VERSION cmake . make make install cd /usr/local mv mysql mysql-VERSION ln -s mysql-VERSION mysql
This will install mysql in /usr/local/mysql.
Installing from binaries
- More info here: http://dev.mysql.com/doc/refman/5.6/en/binary-installation.html
- Download: http://dev.mysql.com/downloads/mysql/#downloads
Download the binaries and extract the tarball where you want, /usr/local
is always good.
cd /usr/local wget mysql binaries tar xzf mysql-VERSION.tar.gz ln -s mysql-VERSION mysql
Configuring
Now you have mysql
binaries on /usr/local/mysql
. In case your distribution doesn't provide a mysql
user and group by default you have to create them:
groupadd mysql useradd -r -g mysql mysql
Setup the file/dir permissions and install the database (for more details read carefully this http://dev.mysql.com/doc/refman/5.1/en/installing-binary.html):
cd /usr/local/mysql chown -R mysql.mysql . scripts/mysql_install_db --user=mysql chown -R root . chown -R mysql data
Note that this procedure does not setup any password for root, so you must enter the server and secure the account.
But we still have to start the server; I use the startup script provided by Slackware (it should work in any case). Adjust it to your needs; If you don't need incoming network connections, then leave --skip-networking
commented out to improve system security.
File rc.mysqld
Save this file wherever you want (download). Slackware users may prefer to save it in /etc/rc.d
#!/bin/sh # Start/stop/restart mysqld. # # Copyright 2003 Patrick J. Volkerding, Concord, CA # Copyright 2003 Slackware Linux, Inc., Concord, CA # Copyright 2008 Patrick J. Volkerding, Sebeka, MN # # This program comes with NO WARRANTY, to the extent permitted by law. # You may redistribute copies of this program under the terms of the # GNU General Public License. # To start MySQL automatically at boot, be sure this script is executable: # chmod 755 /etc/rc.d/rc.mysqld # Before you can run MySQL, you must have a database. To install an initial # database, do this as root: # # mysql_install_db --user=mysql # # Note that the mysql user must exist in /etc/passwd, and the created files # will be owned by this dedicated user. This is important, or else mysql # (which runs as user "mysql") will not be able to write to the database # later (this can be fixed with 'chown -R mysql.mysql /var/lib/mysql'). # # To increase system security, consider using "mysql_secure_installation" # as well. For more information on this tool, please read: # man mysql_secure_installation # To allow outside connections to the database comment out the next line. # If you don't need incoming network connections, then leave the line # uncommented to improve system security. # SKIP="--skip-networking" DATA="/usr/local/mysql/data" MYSQLD="/usr/local/mysql/bin/mysqld_safe" PID="$DATA/mysql.pid" # Start mysqld: mysqld_start() { if [ -x $MYSQLD ]; then # If there is an old PID file (no mysqld running), clean it up: if [ -r $PID ]; then if ! ps axc | grep mysqld 1> /dev/null 2> /dev/null ; then echo "Cleaning up old $PID." rm -f $PID fi fi $MYSQLD --datadir=$DATA --pid-file=$PID $SKIP & fi } # Stop mysqld: mysqld_stop() { # If there is no PID file, ignore this request... if [ -r $PID ]; then killall mysqld # Wait at least one minute for it to exit, as we dont know how big the DB is... for second in 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 \ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 60 ; do if [ ! -r $PID ]; then break; fi sleep 1 done if [ "$second" = "60" ]; then echo "WARNING: Gave up waiting for mysqld to exit!" sleep 15 fi fi } # Restart mysqld: mysqld_restart() { mysqld_stop mysqld_start } case "$1" in 'start') mysqld_start ;; 'stop') mysqld_stop ;; 'restart') mysqld_restart ;; *) echo "usage $0 start|stop|restart" esac
Now let's start the server:
./rc.mysqld start
Now let's secure the server setting the password for root and deleting the test
db
> cd /usr/local/mysql/bin > ./mysql -u root -p mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpwd'); mysql> SET PASSWORD FOR 'root'@'127.0.0.1' = PASSWORD('newpwd'); mysql> SET PASSWORD FOR 'root'@'host_name' = PASSWORD('newpwd'); mysql> DROP DATABASE test;
Now delete all the anonymous accounts (adjust this to your needs):
mysql> DROP USER ''@'mysql-55'; mysql> DROP USER ''@'mysql-55'; mysql> SELECT User, Host, Password FROM mysql.user; +------+-----------+-------------------------------------------+ | User | Host | Password | +------+-----------+-------------------------------------------+ | root | localhost | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | | root | host-name | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | | root | 127.0.0.1 | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | +------+-----------+-------------------------------------------+ 3 rows in set (0.00 sec)
Now all the root users have a not empty password.
Finally, in case your server is 64b, since libraries are stored in /usr/local/mysql/lib
and not lib64
you can face problems when you configure php
, for instance, which search the libraries in the lib64
dir.
Solve this creating a symbolic link:
cd /usr/local/mysql ln -s lib lib64
Upgrading
- More info here http://dev.mysql.com/doc/refman/5.6/en/upgrading.html
NB: the following applyes to any upgrade from v. 5.0->5.1-5.5-5.6
As a general rule, to upgrade from one release series to another, you should go to the next series rather than skipping a series. The following notes have been tested during the upgrades from v. 5.0 to v. 5.1 and from v. 5.1 to v. 5.5.
When you upgrade you must always run mysql/bin/mysql_upgrade
. But if you have Innodb
tables the process can fail, because Innodb
does not support REPAIR TABLE
, so we'll use mysqldump
to create a dump file and mysql
to reload the file, as described here.
I'll suppose that at this point you still have the old server installed let's say in /usr/local/mysql-5.1
and the new server installed in /usr/local/mysql-5.5.
The server that is actually running will be the one with a symbolic link to /usr/local/mysql
:
root@mysqlserver:/usr/local> ls -l lrwxrwxrwx 1 root root 9 Nov 1 16:52 mysql -> mysql-5.1/ drwxr-xr-x 2 root root 4096 Nov 1 16:50 mysql-5.1/ drwxr-xr-x 2 root root 4096 Nov 1 16:50 mysql-5.5/
The dump file must be created with the old server, and obviously it will be restored in the new server. So log into the old server and dump all databases:
cd /usr/local/mysql/bin ./mysqldump --lock-tables --all-databases > ../../dump.sql -u root -p[password]
Now stop the old server
/path/to/rc.mysqld stop
Switch the symbolic link to the new server so that it will be started next time you run rc.mysqld
:
rm mysql ln -s mysql-5.5 mysql
Start the new server:
/path/to/rc.mysqld start
Restore the DBs
/usr/local/mysql/bin/mysql < ../../dump.sql -u root -p
If you get an error like
ERROR 6 (HY000) at line 30: Error on delete of './db_name/table_name.MYI' (Errcode: 13)
this is how to manage error codes:
> /usr/local/mysql/bin/perror 13 OS error code 13: Permission denied
This is because (http://dev.mysql.com/doc/refman/5.5/en/load-data.html)
For security reasons, when reading text files located on the server, the files must either reside in the database directory or be readable by all. Also, to use LOAD DATA INFILE on server files, you must have the FILE privilege. See Section 5.4.1, “Privileges Provided by MySQL”. For non-LOCAL load operations, if the secure_file_priv system variable is set to a nonempty directory name, the file to be loaded must be located in that directory.
At the end (try and error many times) both dump.sql
and data
dir must have 777 permissions.
cd /usr/local/mysl/data chown -R root:root . chmod -R o+wrx . chmod 777 /usr/local/dump.sql /usr/local/mysql/bin/mysql < /usr/local/to/dump.sql -u root -p
and we've got it!
Now restore the proviledges to mysqldata
dir
chmod -R o-wrx . chown -R mysql.mysql .
To be sure that everything is ok, run the mysql_upgrade
command
/usr/local/mysql/bin/mysql_upgrade -u root -p Enter password: Looking for 'mysql' as: ./mysql Looking for 'mysqlcheck' as: ./mysqlcheck Running 'mysqlcheck with default connection arguments Running 'mysqlcheck with default connection arguments db1.table1 OK db1.table2 OK db2.table1 OK
this performs a mysqlcheck/repair
. If all tables are OK you can put the new mysql
server in production.
Troubleshooting
If you get an error like this
ERROR 2006 (HY000) at line 982: MySQL server has gone away
then try adding max_allowed_packet=64M
to your config file (see also here). This can be done also via command line as root doing
set global max_allowed_packet=64*1024*1024;