Welcome 微信登录

首页 / 数据库 / MySQL / 源代码安装 MySQL 5.6.28

本文内容

  • 创建 MySQL 用户和组
  • 解压 MySQL 源代码包
  • 生成配置安装文件
  • 编译和安装
  • MySQL 配置文件
  • 创建 MySQL 授权表
  • MySQL 目录授权
  • 启动 MySQL
  • 验证 MySQL 安装
  • 设置 MySQL 访问权限
  • MySQL 开机自动启动
  • 设置环境变量
  • 参考资料
最近做项目,之前我是用 Oracle 的,如果在 Windows 环境,无论是安装,还是配置,都很容易;Linux 环境没试过,刚毕业时的那个公司,是 Linux 环境。一般等到开发的时候,数据库早按完了,这活轮不到开发干。现在,跳槽后,公司用 MySQL~遇到两个问题:
  • 1,对一个包含二进制字段的表,开发环境和测试环境的性能差异巨大,都是虚拟机。开发环境,Windows 平台,执行 INSERT 很快,几毫秒的事;而测试环境,Linux 平台,执行 INSERT 慢到有点说不过去了,几十毫秒,差距将近 30 倍。如果是 Oracle,前期的话,即便什么不做,也很快;
网上有些人告诉我,应该查看一下机器的负载,比如,磁盘、IO 等,我倒是想,也不是产品环境,不至于差异这么大吧,并且一直就没快过~
  • 2,产品环境,70W 数据,执行 SELECT * FROM T1 WHERE FLAG=0 ORDER BY ID ASC,如果不为 FLAG 字段建索引,执行时间都快 1 秒啦。这要是在 Oracle 上,绝对不可能发生~
这促使我自己在 Linux 上安装 MySQL 源代码。没事时,练习、研究一下~
用源代码方式安装的好处是,编译时,可以针对自己的硬件环境。只是安装相比 RPM 要麻烦点,不过“会者不难,难者不会”,多练练就好了~期间,最开始用的是 RPM 包,挺容易,尝试了 Percona 和社区版,最后,又用源代码安装了一遍~本文是以 MySQL 源代码方式进行安装。参考众多资料,折腾好几天,总算安上了~如果安装时,缺少必要的包,就用 yum 安装,比如 cmake、perl 等~

创建 MySQL 用户和组


这步的目的,是执行 mysql_install_db 创建 MySQL 授权表,以及启动 MySQL 时,都需要指定用户名。所以,它是第一步。
  • 第一步:为以后的 MySQL 服务 mysqld 增加一个登录的用户和组,用户名和组名均为“mysql”。如果用了其他名称,在后面的操作中也要替换。
[root@linuxidc usr]# groupadd mysql [root@linuxidc usr]# useradd -g mysql mysql

解压 MySQL 源代码包


假设你把 MySQL 源代码包放在 /usr/local/src 目录下。
  • 第二步:解压 mysql 软件包。
[root@linuxidc /]# cd /usr/local/src [root@linuxidc src]# ls mysql-5.6.28.tar.gz [root@linuxidc src]# tar zxf mysql-5.6.28.tar.gz [root@linuxidc src]# ls mysql-5.6.28mysql-5.6.28.tar.gz [root@linuxidc src]#此时,会看见一个新目录 mysql-5.6.28。
其中,解压时,-x 为解压;-z 为包有gzip属性;-f 为使用档案名字。当然,也可以用 -v 显示解压过程。

生成配置安装文件


以下两步任选其一,MySQL 早期版本,提供 Configure 文件以便在编译安装前进行配置;但在高版本已不提供该文件,而是采用 cmake。假设,MySQL 安装到 /usr/local/mysql 下。
  • 第三步:
    • 使用“Configure”命令配置安装需要的系统环境,并生成安装配置文件 
[root@linuxidc mysql-5.6.28]# ./configure > --prefix=/usr/local/mysql > --with-extra-charsets=all如果采用 cmake 就跳过这步。
    • 使用“cmake”配置安装需要的系统环境,并生成安装配置文件 
[root@linuxidc mysql-5.6.28]# cmake > -DDEFAULT_CHARSET=utf8 > -DDEFAULT_COLLATION=utf8_general_ci > -DCMAKE_INSTALL_PREFIX=/usr/local/mysql > -DEXTRA_CHARSETS=all 指定 MySQL 的安装位置为“/usr/local/mysql”,以及采用的默认字符集等。
我在试验时,如果不配置字符集的相关选项,在执行后面 mysql_install_db  那步时会报各种字符集错误。
cmake 具体参数,参看 MySQL Source-Configuration Options

编译和安装 

编译和安装很简单。
  • 第四步:使用“make”命令编译源代码文件,并生成安装文件,再用“make install”命令安装。
[root@linuxidc mysql-5.6.28]# make && make install或是编译与安装分开执行:[root@linuxidc mysql-5.6.28]# make [root@linuxidc mysql-5.6.28]# make install
自此,MySQL 就会安装到 /usr/local/mysql 下。

MySQL 配置文件 

  • 第五步:创建 MySQL 数据库服务器的配置文件,可以使用源代码包 support-files 目录中的 my-default.cnf 文件作为模板,将其复制到 /etc/ 目录下,重命名为“my.cnf”文件。
[root@linuxidc /]# cd /usr/local/src/mysql-5.6.28[root@linuxidc mysql-5.6.28]# cp support-files/my-default.cnf/etc/my.cnf并用 vi /etc/my.cnf 修改该配置文件,内容如下。[mysqld]basedir = /usr/local/mysqldatadir = /usr/local/mysql/datasock = /tmp/mysql.sock模板文件不只是源代码中有,安装目录中也有。

创建 MySQL 授权表

  • 第六步:如果还没安装过 MySQL,必须创建 MySQL 授权表。进入安装目录(/usr/local/mysql)下,执行 bin 目录下的 mysql_install_db 脚本,初始化 MySQL 数据库的授权表,其中,存储了服务器访问允许。
当 MySQL 发生故障或需要新加一个 mysql 实例时,需要初始化 mysql 数据库。使用 --help 可以查看支持的选项。[root@linuxidc mysql]# cd /usr/local/mysql root@linuxidc mysql]# scripts/mysql_install_db --user=mysql Installing MySQL system tables...2016-02-02 02:42:33 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).2016-02-02 02:42:33 0 [Note] ./bin/mysqld (mysqld 5.6.28) starting as process 28034 ...2016-02-02 02:42:33 28034 [Note] InnoDB: Using atomics to ref count buffer pool pages2016-02-02 02:42:33 28034 [Note] InnoDB: The InnoDB memory heap is disabled2016-02-02 02:42:33 28034 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins2016-02-02 02:42:33 28034 [Note] InnoDB: Memory barrier is not used2016-02-02 02:42:33 28034 [Note] InnoDB: Compressed tables use zlib 1.2.32016-02-02 02:42:33 28034 [Note] InnoDB: Using Linux native AIO2016-02-02 02:42:33 28034 [Note] InnoDB: Using CPU crc32 instructions2016-02-02 02:42:34 28034 [Note] InnoDB: Initializing buffer pool, size = 128.0M2016-02-02 02:42:34 28034 [Note] InnoDB: Completed initialization of buffer pool2016-02-02 02:42:34 28034 [Note] InnoDB: The first specified data file ./ibdata1 did not exist: a new database to be created! …… 如果用 root 用户运行上面的命令,应该使用 --user 选项,选项的值应与你在第一步为运行服务器所创建的登录账户(本例是 mysql 用户)相同。如果用 mysql 用户登录,运行上面命令,可以忽略 --user 选项。用 mysql_install_db 创建 MySQL 授权表后,需要手动重新启动服务器。
如果执行这步时报错,说明你的第三步有问题。

MySQL 目录授权

  • 第七步:将 MySQL 安装目录 bin 目录下执行文件的所有权改为 root 用户,数据目录的所有权改为运行 mysqld 程序的 mysql 用户。如果现在位于安装目录(/usr/local/mysql)下,命令行如下。
[root@linuxidc mysql-5.6.28]# cd /usr/local/mysql[root@linuxidc mysql]# pwd/usr/local/mysql[root@linuxidc mysql]# chown -R root .[root@linuxidc mysql]# chown -R mysql data[root@linuxidc mysql]# chgrp -R mysql .[root@linuxidc mysql]# ls -ltotal 180drwxr-xr-x2 rootmysql 4096 Feb2 02:23 bin-rw-r--r--1 rootmysql17987 Nov 16 17:38 COPYINGdrwxr-xr-x5 mysql mysql 4096 Feb2 09:20 datadrwxr-xr-x2 rootmysql 4096 Feb2 02:23 docsdrwxr-xr-x3 rootmysql 4096 Feb2 02:23 include-rw-r--r--1 rootmysql 105684 Nov 16 18:45 INSTALL-BINARYdrwxr-xr-x3 rootmysql 4096 Feb2 02:23 libdrwxr-xr-x4 rootmysql 4096 Feb1 08:45 man-rw-r--r--1 rootmysql943 Feb1 08:46 my.cnf-rw-r--r--1 rootmysql943 Feb2 02:42 my-new.cnfdrwxr-xr-x 10 rootmysql 4096 Feb1 08:45 mysql-test-rw-r--r--1 rootmysql 2496 Nov 16 17:38 READMEdrwxr-xr-x2 rootmysql 4096 Feb1 08:45 scriptsdrwxr-xr-x 28 rootmysql 4096 Feb1 08:45 sharedrwxr-xr-x4 rootmysql 4096 Feb1 08:45 sql-benchdrwxr-xr-x2 rootmysql 4096 Feb1 08:45 support-files[root@linuxidc mysql]#
注意第三列的变化。另外,
  • “chown –R root .”,将文件的所有属性改为 root 用户。注意那个点,表示所有文件;
  • “chown –R mysql data”,将数据目录的所有属性改为 mysql 用户;
  • “chgrp –R mysql .”,将组属性改为 mysql 组。注意那个点,表示所有文件。

启动 MySQL

到目前为止,所有需要的东西都安装完成,可以启动 MySQL 服务了。
  • 第八步:启动 MySQL。当然,你可以让 MySQL 开机时自动运行,后面介绍。
[root@linuxidc ~]# cd /usr/local/mysql[root@linuxidc mysql]# bin/mysqld_safe --user=mysql[root@linuxidc mysql]#

验证 MySQL 安装


下面,验证一下,MySQL 服务是否正常。
  • 第九步:MySQL 数据库服务启动后,查看一下它的端口 3306 是否打开,如果看到以下结果表明 MySQL 服务启动成功了。
[root@linuxidc mysql]# netstat -tnl | grep 3306tcp00 :::3306 :::*LIST EN[root@linuxidc mysql]#
  • 第十步:使用 mysqladmin 验证服务器是否运行中。以下命令提供了简单的测试,检查服务器是否已经启动并能响应连接。
[root@linuxidc mysql]# pwd/usr/local/mysql[root@linuxidc mysql]# bin/mysqladmin versionbin/mysqladminVer 8.42 Distrib 5.6.28, for Linux on x86_64Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners. Server version5.6.28Protocol version10ConnectionLocalhost via UNIX socketUNIX socket /tmp/mysql.sockUptime: 9 min 7 sec Threads: 1Questions: 9Slow queries: 0Opens: 67Flush tables: 1Open tables: 60Queries per second avg: 0.016[root@linuxidc mysql]#[root@linuxidc mysql]# bin/mysqladmin variables+--------------------------------------------------------+----------------------------------------------------------------------------------+| Variable_name| Value|+--------------------------------------------------------+----------------------------------------------------------------------------------+| auto_increment_increment | 1|| auto_increment_offset| 1|| autocommit | ON || automatic_sp_privileges| ON || avoid_temporal_upgrade | OFF|| back_log | 80 || basedir| /usr/local/mysql |…… |+--------------------------------------------------------+----------------------------------------------------------------------------------+[root@linuxidc mysql]#

设置 MySQL 访问权限


  • 第十一步:设置访问权限。
使用 mysql_install_db 安装 MySQL 数据库授权表,定义了初始 MySQL 用户账号和访问权限,所有账号均没有密码。这些账号为超级用户,可以执行任何操作。初始 root 账户的密码为空,任何人可以用 root 账户不用输入任何密码就可以连接 MySQL 服务器,并具有所有权限,这意味着 MySQL 安装未受保护。所以,应该为匿名账户指定密码或删除匿名账户,为 MySQL root 账户指定密码。使用“mysql –u root”启动 MySQL 客户端控制台,连接 MySQL 服务器。命令行如下。[root@linuxidc mysql]# cd /usr/local/mysql[root@linuxidc mysql]# bin/mysql -u rootWelcome to the MySQL monitor.Commands end with ; or g.Your MySQL connection id is 7Server version: 5.6.28 Source distribution Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners. Type "help;" or "h" for help. Type "c" to clear the current input statement. mysql> select now();+---------------------+| now() |+---------------------+| 2016-02-02 08:02:31 |+---------------------+1 row in set (0.00 sec) mysql>
  • 第十二步:如果匿名账户存在,并拥有全部权限,因此,删掉它可以提高安全,在 MySQL 客户端执行如下命令。
mysql> select * from mysql.user G*************************** 1. row ***************************Host: localhostUser: rootPassword: Select_priv: Y Insert_priv: Y Update_priv: Y Delete_priv: Y Create_priv: Y Drop_priv: Y Reload_priv: Y Shutdown_priv: YProcess_priv: Y File_priv: YGrant_priv: Y References_priv: YIndex_priv: YAlter_priv: YShow_db_priv: YSuper_priv: Y Create_tmp_table_priv: YLock_tables_priv: YExecute_priv: Y Repl_slave_priv: YRepl_client_priv: YCreate_view_priv: YShow_view_priv: Y Create_routine_priv: YAlter_routine_priv: YCreate_user_priv: YEvent_priv: YTrigger_priv: YCreate_tablespace_priv: Yssl_type:ssl_cipher: x509_issuer:x509_subject: max_questions: 0 max_updates: 0 max_connections: 0max_user_connections: 0plugin: mysql_native_password authentication_string:password_expired: N*************************** 2. row ***************************Host: linuxidcUser: rootPassword: Select_priv: Y            ……: ……*************************** 3. row ***************************Host: 127.0.0.1User: rootPassword: Select_priv: Y         ……: ……*************************** 4. row ***************************Host: ::1User: rootPassword: Select_priv: Y                ……: ……*************************** 5. row ***************************Host: localhostUser:Password: Select_priv: N Insert_priv: N Update_priv: N Delete_priv: N Create_priv: N Drop_priv: N Reload_priv: N Shutdown_priv: NProcess_priv: N File_priv: NGrant_priv: N References_priv: NIndex_priv: NAlter_priv: NShow_db_priv: NSuper_priv: N Create_tmp_table_priv: NLock_tables_priv: NExecute_priv: N Repl_slave_priv: NRepl_client_priv: NCreate_view_priv: NShow_view_priv: N Create_routine_priv: NAlter_routine_priv: NCreate_user_priv: NEvent_priv: NTrigger_priv: NCreate_tablespace_priv: Nssl_type:ssl_cipher: x509_issuer:x509_subject: max_questions: 0 max_updates: 0 max_connections: 0max_user_connections: 0plugin: mysql_native_password authentication_string: NULLpassword_expired: N*************************** 6. row ***************************Host: linuxidcUser:Password: Select_priv: N                ……: ……6 rows in set (0.00 sec) mysql>mysql> DELETE FROM mysql.user WHERE Host="localhost" and User="";Query OK, 1 rows affected(0.08 sec) mysql> FLUSH PRIVILEGES;Query OK, 1 rows affected(0.08 sec)
  • 第十三步:可以用几种方法为 root 账户指定密码。其中之一,在 MySQL 客户端命令行上使用 SET PASSWORD 指定密码,一定要使用 PASSWORD() 函数来加密密码。例如,下面设置 localhost 域的密码为“123456”。其他域可以使用同样的语句,SQL 语句如下。
 mysql>SET PASSWORD FOR "root"@"localhost"=PASSWORD("123456");Query OK, 0 rows affected (0.02 sec) mysql>
  • 第十四步:如果想退出 MySQL 客户端,可以输入 exit 或 quit,还可以用组合键 Ctrl+C。因为已经设置了 root 账户的密码,所以再次登录 MySQL 客户端就要提供密码才能进入。
mysql> exit[root@linuxidc mysql]#[root@linuxidc mysql]# bin/mysql -u root –h localhost -pEnter password:Welcome to the MySQL monitor.Commands end with ; or g.Your MySQL connection id is 13Server version: 5.6.28 Source distribution Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners. Type "help;" or "h" for help. Type "c" to clear the current input statement. mysql>如果想关闭 MySQL 服务器,在命令行使用 MySQL 服务器的 mysqladmin 命令,通过 –u 选项给出数据库管理员用户 root,-p 选项给出密码,即可关闭 MySQL 服务器。[root@linuxidc mysql]# bin/mysqladmin -u root -p shutdownEnter password:[root@linuxidc mysql]#

MySQL 开机自动启动


  • 第十五步:有必要将 MySQL 服务设置成开机自动运行。方法是,进入 MySQL 源代码目录(/usr/local/src/mysql-5.6.28)中,将子目录 support-files 下的 mysql.server 文件复制到 /etc/rc.d/init.d/ 目录中,并重命令为 mysqld
[root@linuxidc mysql]# cd /usr/local/src/mysql-5.6.28[root@linuxidc mysql-5.6.28]# pwd/usr/local/src/mysql-5.6.28[root@linuxidc mysql-5.6.28]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld[root@linuxidc mysql-5.6.28]#此时,就已经可以手动启动/停止 MySQL 数据库。命令如下:[root@linuxidc mysql]# service mysqld status SUCCESS! MySQL running (24426)[root@linuxidc mysql]# service mysqld stopShutting down MySQL..141223 11:37:29 mysqld_safe mysqld from pid file /mysql/data/testdb1.pid ended SUCCESS! [1]+Donebin/mysqld_safe --user=mysql(wd: /mysql)(wd now: /etc)[root@linuxidc mysql]# service mysqld startStarting MySQL. SUCCESS! [root@linuxidc mysql]#但若想让 MySQL 在开机时自动启动,还需要如下设置。修改 /etc/rc.d/init.d/mysqld 权限,如下所示:[root@linuxidc mysql-5.6.28]# chown root.root /etc/rc.d/init.d/mysqld[root@linuxidc mysql-5.6.28]# chmod 755 /etc/rc.d/init.d/mysqld[root@linuxidc mysql-5.6.28]#使用 chkconfig 命令设置在不同系统运行级别下的自启动策略,首先使用“chkconfig --add mysqld”命令增加所指定的 mysqld 服务,让 chkconfig 指令得以管理它,并同时在系统启动的叙述文件内增加相关数据。使用命令如下所示:[root@linuxidc mysql-5.6.28]# chkconfig --add mysqld[root@linuxidc mysql-5.6.28]#然后,使用“chkconfig --level 3 mysqld on”命令和“chkconfig --level 5 mysqld on”命令,在第三等级和第五等级中开启 mysqld 服务,即在字符模式和图形模式启动时自动开启 mysqld 服务。命令如下所示:[root@linuxidc mysql-5.6.28]# chkconfig --level 3 mysqld on[root@linuxidc mysql-5.6.28]# chkconfig --level 5 mysqld on[root@linuxidc mysql-5.6.28]#再使用“chkconfig --list”命令检查设置。命令如下所示:[root@linuxidc mysql-5.6.28]# chkconfig --list mysqldmysqld0:off 1:off 2:on3:on4:on5:on6:off[root@linuxidc mysql-5.6.28]#                      自此,MySQL 安装配置结束。

设置环境变量


设置环境变量后,你就可以不用输入 MySQL 客户端命令的全路径啦。编辑 etc/my.cnf,追加如下内容:[mysqld]lower_case_table_names=1设置环境:[root@linuxidc mysql]# cd /etc[root@linuxidc etc]# vi profile在文件最后增加:PATH=/opt/mysql/bin:/opt/mysql/lib:$PATHexport PATH生效环境变量:[root@linuxidc etc]# source profile

参考资料


  • Installing MySQL from Source
本文永久更新链接地址