一、MySQL RELEASE FORMAT
MySQL官方发行版本一般就有以下几种(官方下载地址),其实大部分软件的发行版大多数情况下也是以下几种,所以只要明白一个软件的发行方式就OK。另外下载MySQL任何包都应该去官方网站下载,记住一定在官方下载且最好直接下载(不使用第三方工具),并且最好下载完成后经过MD5校验。因为MySQL是开源的,所以使用第三方工具或第三方下载无法保证是安全的。
- mysql-server-5.6.39-1.el7.x86_64.rpm
# 编译好的RPM包版,跟Linux平台下的RPM包相同,此版本把MySQL的功能一般都独立成个体RPM包,所以在安装时需要什么功能安装什么包即可。另外由于RPM包都是编译好的,所以在安装时要选择好对应的系统平台以及架构平台(基本都是X86架构)。
- mysql-5.6.39.tar.gz
# 源码包版本,也就是没有经过编译的,需要手动编译和安装,灵活性更大可自己定制化。当然越灵活的东西操作起来也就也麻烦。
- mysql-5.6.39-linux2.6-x86.tar.gz
# 二进制版本,这是经过官方编译好的,所以在官方下载时需要选择“Linux-Generic”,指在Linux系统下编译好的二进制包。不同于RPM包的是,安装需要自己动手,比如权限更改、文件和目录的迁移、初始化等等。这也是安装MySQL推荐的一个使用方式。
- mysql-5.6.39-1.el6.src.rpm
# 这个版本版本有点特殊,不能够直接使用,是官方提供给用户自己制作成RPM包,这样既可以有RPM包版本的使用便捷,又有源码包的定制化功能。
二、MySQL 5.6 YUM INSTALL
首先从MySQL官方网站下载YUM源,地址:http://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/
这里我选择MySQL 5.6的源进行安装MySQL 5.6,手动添加一个YUM源,文件位置 /etc/yum.repos.d/mysql.repo 。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# Enable to use MySQL 5.6 for Centos 6 [mysql56-community] name=MySQL 5.6 Community Server baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/6/$basearch/ enabled=1 gpgcheck=0 # Enable to use MySQL 5.6 for Centos 7 [mysql56-community] name=MySQL 5.6 Community Server baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/7/$basearch/ enabled=1 gpgcheck=0 |
检查一下mysql repo
1 2 |
$ yum repolist enabled | grep mysql mysql56-community MySQL 5.6 Community Server 282 |
安装启动配置MySQL
1 2 3 |
$ yum install mysql-community-server mysql-community-devel mysql-community-client mysql-community-common $ service mysqld start $ mysql_secure_installation |
三、MySQL 5.6 SOURCE INSTALL
1. 安装cmake
cmake的重要特性之一是其独立于源码(out-of-source)的编译功能,即编译工作可以在另一个指定的目录中而非源码目录中进行,这可以保证源码目录不受任何一次编译的影响,因此在同一个源码上可以进行多次不同的编译,如针对于不同平台编译。
1 |
$ yum -y install gcc gcc-c++ ncurses ncurses-devel cmake |
2. 创建运行MySQL的用户
1 2 |
$ groupadd -r mysql $ useradd -g mysql -r -s /sbin/nologin mysql |
3. 创建存放数据和日志的目录(生产环境中使用LVM)
1 2 |
$ mkdir /data/mysql/3306/{data,logs/{binlog,relaylog,slowlog},tmp,conf} -p $ chown -R mysql.mysql /data |
4. 编译安装mysql-5.6.27
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
$ tar xf mysql-5.6.27.tar.gz $ cd mysql-5.6.27 $ /usr/local/bin/cmake \ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DMYSQL_DATADIR=/data/mysql/3306/data \ -DSYSCONFDIR=/data/mysql/3306/conf \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_FEDERATED_STORAGE_ENGINE=1 \ -DWITHOUT_MEMORY_STORAGE_ENGINE=1 \ -DWITH_READLINE=1 \ -DWITH_SSL=system \ -DWITH_ZLIB=system \ -DWITH_LIBWRAP=0 \ -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \ -DENABLED_LOCAL_INFILE=1 \ -DEXTRA_CHARSETS=all \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ -DWITH_DEBUG=0 \ -DMYSQL_USER=mysql \ -DENABLE_PROFILING=1 |
cmake时如果出现什么错误,自行Google,都会有解决办法的,一般就是缺少依赖包或者cmake路径有问题。另外,这里我关闭了 DEBUG 模式,就是 -DWITH_DEBUG=0,如果你需要调试MySQL,这里开启即可。
编译常见错误如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
CMake Error at cmake/ssl.cmake:164 (FILE): file STRINGS file "/root/src/mysql-5.6.12/OPENSSL_INCLUDE_DIR-NOTFOUND/openssl/opensslv.h" cannot be read. Call Stack (most recent call first): CMakeLists.txt:323 (MYSQL_CHECK_SSL) -- OPENSSL_INCLUDE_DIR = OPENSSL_INCLUDE_DIR-NOTFOUND -- OPENSSL_LIBRARY = OPENSSL_LIBRARY-NOTFOUND -- CRYPTO_LIBRARY = CRYPTO_LIBRARY-NOTFOUND -- OPENSSL_MAJOR_VERSION = CMake Error at cmake/ssl.cmake:231 (MESSAGE): Cannot find appropriate system libraries for SSL. Use WITH_SSL=bundled to enable SSL support Call Stack (most recent call first): CMakeLists.txt:323 (MYSQL_CHECK_SSL) -- HAVE_VISIBILITY_HIDDEN -- HAVE_VISIBILITY_HIDDEN -- Could NOT find Curses (missing: CURSES_LIBRARY CURSES_INCLUDE_PATH) CMake Error at cmake/readline.cmake:85 (MESSAGE): Curses library not found. Please install appropriate package, remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu, package name is libncurses5-dev, on Redhat and derivates it is ncurses-devel. Call Stack (most recent call first): cmake/readline.cmake:128 (FIND_CURSES) cmake/readline.cmake:202 (MYSQL_USE_BUNDLED_EDITLINE) CMakeLists.txt:325 (MYSQL_CHECK_EDITLINE) -- Configuring incomplete, errors occurred! |
从上面的错误中我们可以很清楚的看到缺少两个依赖包,我们用yum安装一下即可。
1 |
$ yum install –y openssl openssl-devel ncurses ncurses-devel libaio |
此时注意了,当我们解决完依赖后再次运行cmake还会报错的。因为在多次运行cmake时有个文件我们需要删除,删除当前目录下CMakeCache.txt文件并重新编译,再次运行cmake命令就会正常!
下面开始编译和安装,如果运行ccmake .
可以查看刚刚的编译选项。
1 2 |
$ make $ make install |
ccmake .
同./configure --help
一样,都是查看帮助信息。
编译参数解释:
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql
指定MySQL的安装路径
-DMYSQL_DATADIR=/data/mysql/3306/data
指定MySQL的数据存放路径。
-DSYSCONFDIR=/data/mysql/3306/conf
指定MySQL的配置文件路径。
-DWITH_INNOBASE_STORAGE_ENGINE=1
-DWITH_FEDERATED_STORAGE_ENGINE=1
MySQL 5.6.27默认编译的存储引擎包括:CVS、INNODB、MYISAM、MRG_MYISAM、MEMORY、ARCHIVE、PERFORMANCE_SCHEMA以及BLACKHOLE;MySQL是插件式存储引擎可以安装其他的存储引擎FEDERATED等。
-DWITHOUT_MEMORY_STORAGE_ENGINE=1
若要明确指定不安装某个存储引擎,可以用-DWITHOUT指定。
-DWITH_READLINE=1
-DWITH_SSL=system
开启SSL
-DWITH_ZLIB=system
开启压缩库。
-DWITH_LIBWRAP=0
关闭TCPWRAPER控制,是Linux下的一种安全访问策略。
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock
指定默认套接字文件路径。
-DENABLED_LOCAL_INFILE=1
可以执行外部SQL脚本,生产环境建议关闭以免带来SQL注入。
-DEXTRA_CHARSETS=all
开启支持所有字符集。
-DDEFAULT_CHARSET=utf8
指定默认字符集。
-DDEFAULT_COLLATION=utf8_general_ci
指定默认数据排序规则一定要跟默认语言结合起来。
-DWITH_DEBUG=0
关闭或开启Debug功能,0表示关闭,1表示开启。生产使用肯定是关闭Debug,如果是调试使用就需要开启Debug。
-DMYSQL_USER=mysql
使用mysql用户运行mysql数据库。
-DENABLE_PROFILING=1
启用profiling性能分析功能。
5. 设置MySQL安装路径权限
1 |
$ chown -R mysql:mysql /usr/local/mysql |
这里因为是使用root用户安装,所以需要设置安装目录的权限,如果是使用mysql用户安装的就不需要了,因为目录默认会是mysql用户和组。
6. 初始化MySQL
1 |
$ /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/data/mysql/3306/data --basedir=/usr/local/mysql |
7. 复制MySQL样例服务脚本到/etc/rc.d/init.d/
1 2 3 |
$ cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld $ chkconfig --add mysqld $ chkconfig mysqld on |
8. 添加环境变量
1 2 3 |
$ export PATH=$PATH:/usr/local/mysql/bin $ echo "export PATH=/usr/local/mysql/bin:$PATH" > /etc/profile.d/mysql.sh $ chmod a+x /etc/profile.d/mysql.sh |
9. 提供一份MySQL配置文件
MySQL 5.6提供的配置文件没法用,大部分参数都默认配置了。这里提供了一份适合生产环境优化过的配置文件。在 /data/mysql/3306/conf/my.cnf 文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
[client] user = root assword= port=3306 socket=/tmp/mysql.sock [mysqld] ############################basic settings####################### port=3306 datadir=/data/mysql/3306/data socket=/tmp/mysql.sock pid-file=/data/mysql/3306/mysql.pid user=mysql server-id = 1 character_set_server = utf8 skip_name_resolve = 1 max_allowed_packet = 16777216 max_connections = 800 max_connect_errors = 1000 tmpdir = /tmp tmp_table_size = 67108864 explicit_defaults_for_timestamp = 1 join_buffer_size = 134217728 interactive_timeout = 1800 wait_timeout = 1800 read_buffer_size = 16777216 read_rnd_buffer_size = 33554432 sort_buffer_size = 33554432 key_buffer_size = 256M thread_cache_size = 8 thread_concurrency = 8 transaction_isolation = READ-COMMITTED ###########################log settings##################### log-bin = /data/mysql/3306/logs/binlog/mysql-bin log_bin_index = /data/mysql/3306/logs/binlog/mysql-bin.index expire_logs_days = 30 binlog_format = ROW binlog-rows-query-log-events = 1 log_error = /data/mysql/3306/logs/error.log slow_query_log = 1 long_query_time = 2 log_slow_admin_statements = 1 log_slow_slave_statements = 1 slow_query_log_file = /data/mysql/3306/logs/slowlog/slow.log min_examined_row_limit = 100 ##########################innodb settings################################# innodb_buffer_pool_size = 1G innodb_sort_buffer_size = 27108864 innodb_buffer_pool_load_at_startup = 1 innodb_buffer_pool_dump_at_shutdown = 1 innodb_lru_scan_depth = 2000 innodb_lock_wait_timeout = 5 innodb_flush_method = O_DIRECT innodb_file_format = Barracuda innodb_file_format_max = Barracuda innodb_thread_concurrency = 24 innodb_flush_neighbors = 1 innodb_purge_threads = 4 innodb_large_prefix = 1 innodb_print_all_deadlocks = 1 innodb_strict_mode = 1 innodb_file_per_table = ON innodb_flush_log_at_trx_commit=2 |
PS:要想灵活设置这些参数需要对MySQL有一个很好的认识后,才能设置出适合自己使用的值。
11. 设置密码连接数据库
1 2 3 4 |
$ mysqladmin -u root -h localhost password "redhat" $ service mysqld start $ mysql -u root -predhat mysql> |
12. 运行mysql_secure_installation程序
在安装完MYSQL之后,可以选择运行mysql_secure_installation程序,用来设置相关的安全访问属性,需要安装mysql-client。
1 |
$ mysql_secure_installation |
运行mysql_secure_installation会执行下面几个设置:
1. Enter current password for root (enter for none): – 输入当前root密码
2. Set root password? [Y/n] – 设置root密码
3. Remove anonymous users? [Y/n] – 移除匿名用户
4. Disallow root login remotely? [Y/n] – 禁止root远程访问
5. Remove test database and access to it? [Y/n] – 移除test数据库
6. Reload privilege tables now? [Y/n] – 刷新授权表
四、MySQL 5.6 BINARY INSTALL
1. 前提
在使用二进制安装之前,请确认如果你以前使用操作系统本机软件包管理系统(例如Yum或APT)安装了MySQL,则使用本机二进制文件安装时可能会遇到问题。确保你以前的MySQL安装已完全删除(使用你的软件包管理工具移除),另外也应该检查配置文件,如/etc/my.cnf
或/etc/mysql
目录如果存在,并删除它们。
MySQL依赖于libaio
库,如果此库未在本地安装,则数据目录初始化和后续服务器启动步骤将会失败。例如,在基于Yum的系统上:
1 |
$ yum install libaio |
2. 解压安装MySQL
在MySQL官方下载对应的二进制包,然后解压并做软连接。
1 2 3 4 |
$ wget https://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.39-linux-glibc2.12-x86_64.tar.gz $ tar xvf mysql-5.6.39-linux-glibc2.12-x86_64.tar.gz -C /usr/local/ $ cd /usr/local/ $ ln -sv mysql-5.6.39-linux-glibc2.12-x86_64 mysql |
在安装目录下,应该会存在如下相关目录:
目录 | 目录的内容 |
---|---|
bin,scripts | mysqld服务器,客户端和其他实用程序 |
data | 日志文件,数据库文件(默认初始化在此目录下) |
docs | MySQL手册的Info格式 |
include | 包含头文件 |
lib | 包含库文件 |
mysql-test | 测试套件 |
man | unix man手册 |
share | 错误消息,字典和初始化SQL |
sql-bench | 基准测试 |
support-files | 其他支持文件,包括示例配置文件等 |
3. 创建用户及调整权限
运行MySQL需要使用mysql用户,所以我们需要创建一个mysql用户,且我这里同时创建了MySQL数据存放目录并赋予mysql用户权限。
1 2 3 4 5 |
$ groupadd -g 3306 mysql $ useradd -u 3306 -g mysql -s /sbin/nologin -M mysql $ chown -R mysql.mysql /usr/local/mysql $ mkdir /data/mysql/3306/{data,logs/{binlog,relaylog,slowlog},tmp,conf} -p $ chown -R mysql.mysql /data |
4. 初始化MySQL
MySQL 5.6使用mysql_install_db脚本初始化MySQL,另外初始化MySQL需要使用MySQL用户,且对应目录的权限需要正确。
1 |
$ /usr/local/mysql/scripts/mysql_install_db --datadir=/data/mysql/3306/data --basedir=/usr/local/mysql --user=mysql |
这种方式初始化,只能按照官方默认配置初始化MySQL,需要注意一点,如果你的服务器上已经存在MySQL配置文件(如:/etc/my.cnf、/etc/my.cnf.d/*.cnf),初始化时会默认去匹配这几个路径的配置文件进行初始化操作。
生产环境正确的做法应该是有一个标准配置文件,在初始化时使用--defaults-file
用指定配置文件来初始化。这个时候就需要先提供一个配置文件,比如上面提供那份配置文件。然后再进行初始化操作,需要注意的一点是这些参数的先后顺序不能错:
1 |
$ /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/data/mysql/3306/data --defaults-file=/data/mysql/3306/conf/my.cnf |
这样就会按照你的标准配置文件来进行MySQL初始化操作。
5. 输出执行文件
在MySQL安装的bin目录下是MySQL所有的可执行文件,包括客户端、服务端及相关工具。为了方便操作,一般都加入到系统的PATH环境变量,这样我们就可以直接输入对应命令及命令的自动补全。
1 2 3 |
$ echo "export PATH=/usr/local/mysql/bin:$PATH" > /etc/profile.d/mysql.sh $ chmod a+x /etc/profile.d/mysql.sh $ source /etc/profile.d/mysql.sh |
6. 输出帮助文件
1 2 |
$ vim /etc/man.config MANPATH /usr/local/mysql/man |
7. 输出库文件
1 2 3 |
$ vim /etc/ld.so.conf/mysql.conf /usr/local/mysql/lib $ ldconfig -v |
8. 输出头文件
1 |
$ ln -sv /usr/local/mysql/include/* /usr/include |
9. 启动MySQL
更常见的方式还是使用mysqld_safe工具来启动MySQL(真正提供服务的还是mysqld程序),启动时需要指定配置文件。
1 |
$ /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysql/3306/conf/my.cnf & |
使用mysqld_safe工具来启动MySQL是一个常见做法,由mysqld_safe来启动mysqld程序。mysqld_safe增加了一些安全特性,例如当出现错误时重启服务器并向错误日志文件写入运行时间信息,另外还会在启动mysqld服务后继续监控其运行情况,并在其死机时重新启动它等等。
如果启动时不指定配置文件呢?我们可以看一下mysqld的帮助信息。
1 2 3 |
$ /usr/local/mysql/bin/mysqld --help -vv | grep my.cnf /etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf my.cnf, $MYSQL_TCP_PORT, /etc/services, built-in default |
意思就是,如果启动时没有指定配置文件,那么MySQL会以上面这种顺序来查找配置文件并应用,不是只读一个文件哦,是应用所有文件。就是说最后MySQL应用的参数是所有文件的合集,后面的文件参数会覆盖前面的文件参数。这样就会带来一个问题,如果你的服务器上有多个配置文件时,可能会出现你设置的参数总是无法生效,这个时候可能就是出现了参数覆盖。
对于安装基本完结,自己多多尝试。