(转)MySQL自带的性能压力测试工具mysqlslap详解
本文来自老男孩老师第三本书籍著作《老男孩的MySQL私房菜》第三章内容分享!
原文:http://blog.51cto.com/oldboy/1917295
3.1 MySQL数据库的安装方法及选择
在当今的互联网企业里,MySQL数据库大多运行在Linux系列操作系统上,当然,你也可以运行在Windows/Unix等商业操作系统上,本书主要以国内互联网公司应用最多的数据库服务操作系统——CentOS6最新版(6.8)x86_64 Linux系统为例进行讲解,使用其他系统的读者同样可以从本书受益!
即使是在CentOS 6 x86_64 Linux系统环境下,若应用场景不同或版本不同,MySQL数据库的安装方法也会有所区别,下面我们就把最常见的几种方法一一介绍给大家!
3.1.1 yum/rpm方式安装MySQL
MySQL官方网站及相关镜像网站提供了不同版本的RPM安装包,并且针对不同的硬件或操作系统平台,安装包的类型也会有区别。在使用时,可以到官方网站下载页面进行选择,国内也有一些互联网公司提供了镜像,比如搜狐、阿里云公司提供的镜像资源就非常不错。
下面是搜狐网提供的数据库软件镜像地址:http://mirrors.sohu.com/mysql
注意:yum/rpm安装方式适合所有MySQL软件产品。
1. rpm包方式安装MySQL
rpm包的安装方式非常简单,这里以el6平台下的mysql-5.6.34版本为例,首先,要通过上述搜狐镜像地址下载到如下四个MySQL相关软件安装包。
MySQL-client-5.6.34-1.el6.x86_64.rpm
MySQL-devel-5.6.34-1.el6.x86_64.rpm
MySQL-server-5.6.34-1.el6.x86_64.rpm
MySQL-shared-5.6.34-1.el6.x86_64.rpm
提示:我们可以从Linux的对应系统盘或系统镜像里找到类似的rpm包,但是版本一般会较低一些。
一般来说,其中的MySQL-server-5.6.34-1.el6.x86_64.rpm和MySQL-client-5.6.34-1.el6.x86_64.rpm这两个软件包是必须要安装的,至于另外两个软件包,则可视实际需要进行安装,不过一般建议一起安装。
可以把这四个RPM包上传到服务器的目录中,然后执行如下rpm命令进行安装:
[root@oldboytools]# rpm -qa|grep mysql #<==查找已经安装的mysql的包。
mysql-libs-5.1.73-7.el6.x86_64
rpm -e mysql-libs-5.1.73-7.el6.x86_64 --nodeps #<==卸载系统已经安装的mysql依赖包。
rpm -ivh MySQL-client-5.6.34-1.el6.x86_64.rpm
rpm -ivh MySQL-devel-5.6.34-1.el6.x86_64.rpm
rpm -ivh MySQL-shared-5.6.34-1.el6.x86_64.rpm
rpm -ivh MySQL-server-5.6.34-1.el6.x86_64.rpm
这里的el6表示适合操作系统的版本,还有el5、el7等。i686表示适合32位的系统,x86_64表示适合64位的系统。
执行上述命令即可完成MySQL软件的安装。
在采用rpm包安装方式时,必须要官方或第三方提供了现成的rpm软件包,否则是无法使用该方式安装的。另外,和直接采用yum的安装方式相比,rpm包的安装方式往往可以选择更新的版本,但是rpm包安装也有自身的问题,例如,无法满足定制化安装,比如,不能进行编译参数、路径等的更改。
2. yum方式安装MySQL
yum方式安装MySQL数据库时,只需执行一个命令yuminstall mysql-server -y即可,yum方式的安装原理是在执行yum安装命令后,会自动从yum源地址下载相应名称的MySQL数据库rpm包,然后到系统上安装,并自动解决各种软件包之间的依赖问题。这是一个非常不错的安装软件的方式,不仅仅是针对MySQL,安装其他软件也是如此。
Yum安装方式的最大优点就是超级简单,但是它也有自身的问题,例如它继承了rpm包的无法定制化安装的问题,另外一个缺点是采用默认的yum安装时,一般yum源带的软件版本都比较低,例如:截止作者写作本文时,使用CentOS6.8Linux 默认yum安装的MySQL版本仅为5.1.73。
3.1.2 常规方式编译安装MySQL
常规方式编译安装MySQL时,适合用第一条最正宗的MySQL产品线5.2及以前版本:
所谓常规方式编译安装MySQL就是延续早期MySQL的3部曲安装方式,即./configure;make;make install,下面是老男孩在早期的企业生产场景下操作过的具体命令及参数:
tarzxf mysql-5.1.73.tar.gz
cdmysql-5.1.73
./configure\
--prefix=/application/mysql5.1.73\
--with-unix-socket-path=/application/mysql5.1.73/tmp/mysql.sock\
--localstatedir=/application/mysql5.1.73/data\
--enable-assembler\
--enable-thread-safe-client\
--with-mysqld-user=mysql\
--with-big-tables\
--without-debug\
--with-pthread\
--enable-assembler\
--with-extra-charsets=complex\
--with-readline\
--with-ssl\
--with-embedded-server\
--enable-local-infile\
--with-plugins=partition,innobase\
--with-mysqld-ldflags=-all-static\
--with-client-ldflags=-all-static
make
make install
ln -s/application/mysql-5.1.73/ /application/mysql
安装到这里,MySQL数据库还不能正常启动使用,还需要进行初始化数据库等工作,具体可以参考后文安装部分。
此种方式适合所有MySQL5.2.xx及以前的产品系列,是最常规的编译方式,在当下的互联网企业中,此种编译安装的方法已经很少使用了,原因是第一条产品线的产品(MySQL5.2.xx及以前的产品系列)用得越来越少了,被第二条产品线(MySQL5.4.xx及以后的产品系列)的产品逐渐替代了,因此,老男孩也不建议读者再使用第一条产品线的产品作为对外的业务库。
3.1.3采用cmake方式编译安装MySQL
考虑到MySQL5.4.xx及以后系列产品的特殊性,其编译方式和早期的第一条产品线的有所不同,这里采用cmake或gmake方式的编译安装。即./cmake;make;make install,生产场景的具体命令及参数为:
tarzxf mysql-5.6.34.tar.gz
cdmysql-5.6.34
cmake. -DCMAKE_INSTALL_PREFIX=/application/mysql-5.6.34 \
-DMYSQL_DATADIR=/application/mysql-5.6.34/data\
-DMYSQL_UNIX_ADDR=/application/mysql-5.6.34/tmp/mysql.sock\
-DDEFAULT_CHARSET=utf8\
-DDEFAULT_COLLATION=utf8_general_ci\
-DWITH_EXTRA_CHARSETS=all\
-DWITH_INNOBASE_STORAGE_ENGINE=1\
-DWITH_FEDERATED_STORAGE_ENGINE=1\
-DWITH_BLACKHOLE_STORAGE_ENGINE=1\
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1\
-DWITH_ZLIB=bundled\
-DWITH_SSL=bundled\
-DENABLED_LOCAL_INFILE=1\
-DWITH_EMBEDDED_SERVER=1\
-DENABLE_DOWNLOADS=1\
-DWITH_DEBUG=0
#提示,编译时可配置的选项很多,具体可参考本章最后一部分内容或官方文档。
make
make install
ln -s/application/mysql-5.6.34/ /application/mysql
安装到这里,MySQL数据库仍无法正常启动使用,还需要进行初始化数据库等工作,具体可以参考后文安装部分,另外,cmake等用于编译的工具也需要提前进行安装。相关参数的说明,见后文。
如果上述操作未出现错误,则MySQL5.6.34软件cmake方式的安装就算成功了。
3.1.4采用二进制方式免编译安装MySQL
采用二进制免编译方式安装MySQL的方法和yum/rpm包安装方式类似,适合各类MySQL产品系列,不需要复杂的编译设置及编译时间等待,直接解压下载的软件包,就相当于编译方式的make install步骤完成了,然后只要进行初始化数据库的操作,即可完成并启动,此方式的MySQL软件包一般都比较大,最大可达180MB,采用二进制方式免编译安装MySQL的方法在后文会详细讲解。
3.1.5如何正确选择MySQL的安装方式
若是对数据库要求不太高的场景,可以采用yum/rpm方式安装MySQL,例如并发不大,只是在公司内部(wiki系统)、企业内部的应用(Zabbix监控系统,OpenStack后台管理)等需要数据库的一些应用场景,当然,生产场景下也是可以选择yum或rpm方式进行安装的。
但是,有很多大型网站或门户网站,往往在安装MySQL时,会有各种定制化、初始化的需求,这时,要根据企业的需求先把源码包制作成rpm包,然后搭建自己的yum仓库,最终采用yum install mysql-server -y的方式安装,这样做的优点是即兼顾了yum/rpm安装方式简单的优点,又用到了源码包安装方式的可定制性,但是,使用这个方法需要一定的技术能力,此部分的内容读者可以参考老男孩教育为读者提供的如下博文。
自动化运维必备技能—定制属于自己的RPM包http://blog.oldboyedu.com/autodeploy-rpm/。
自动化运维必备技能—搭建属于自己的YUM仓库http://blog.oldboyedu.com/autodeploy-yum/。
二进制免编译安装方式很简单方便,且适合5.0-5.1和5.5-5.7系列,是不少专业DBA的选择,普通Linux运维人员一般多采用编译的方式安装,对应到MySQL5.0-5.1系列就是常规编译方式,对应到MySQL5.5-5.7系列就是cmake编译方式。
所以综合来讲,这些安装方式都是可以使用的,只是不同层次的人习惯不同,实际应用的性能差距不是很大。
老男孩的建议:首先是选择MySQL5.5或以上的数据库版本,当数据库服务器机器数量少的话,可采用cmake编译方式安装,这是很多运维人员的习惯选择。当数据库服务器机器数量多的情况,可用二进制免编译方式安装,这是某些DBA的偏爱,若是数据库服务器机器数量特别大,且对定制化要求很高,可以选择通过源码定制rpm包,搭建yum仓库的安装方式。当然了,采用此种方法的读者也要具备这方面的能力才行,前文已经给出了做rpm定制以及yum仓库搭建的地址,不再赘述。
3.2 安装并配置MySQL数据库
3.2.1 安装MySQL数据库
1.MySQL数据库的安装环境准备
如果读者没有物理服务器环境,则可以搭建vmware等虚拟机环境学习,相应地则需准备如下内容:
1)请提前加大VM虚拟机硬件的内存,这样编译时候会更快,最好设置2GB以上的内存。
2)最好提前下载好要安装的MySQL相关软件包(http://mirrors.sohu.com/mysql/)。
3)重视每个操作过程的输出,有错误要解决掉再继续,不能忽略掉操作中的错误(error)。
4)建议进入虚拟机界面去执行make以及make install,通过SSH操作有时会导致网络中断。
有关vmware虚拟化学习软件和CentOS6操作系统的安装详细步骤见《跟老男孩学Linux运维:Web集群实战》,或看免费部署文章:http://book.51cto.com/art/201605/510756.htm。
2.安装MySQL需要的依赖包和编译软件
当前的Linux系统环境情况如下:
[root@oldboy~]# cat /etc/redhat-release #<==操作系统版本
CentOSrelease 6.8 (Final)
[root@oldboy~]# uname -r #<==内核版本
2.6.32-642.el6.x86_64
[root@oldboy~]# uname -m
x86_64 #<==64位系统
(1)安装MySQL需要的依赖包
安装MySQL之前,最好先安装MySQL需要的依赖包,不然后面会出现很多报错信息,到那时还得再回来安装MySQL的依赖包。安装命令如下:
[root@oldboy~]# yum install ncurses-devel libaio-devel -y
[root@oldboy~]# rpm -qa ncurses-devel libaio-devel
ncurses-devel-5.7-4.20090207.el6.x86_64
libaio-devel-0.3.107-10.el6.x86_64
提示:安装后使用rpm -qa ncurses-devel libaio-devel命令检查,如果出现两行如上信息表示安装成功。
(2)安装编译MySQL需要的软件
由于MySQL5.5及以上的系列产品要采用特殊的编译方式安装,因此,需要先安装常用的编译MySQL的工具cmake软件包,命令为:
[root@oldboy~]# yum install cmake -y
[root@oldboy~]# rpm -qa cmake
cmake-2.8.12.2-4.el6.x86_64
提示:安装后使用rpm-qa cmake检查,如果出现一行如上信息表示安装成功。
此外,也有网友采用源码包的方式安装cmake的,但比较复杂,因此一般建议读者选择这个简单的yum安装方法。
3.开始安装MySQL
为了让大家学习更多的MySQL技术,本文选择了相对复杂的源代码安装方式为例来讲解MySQL多实例安装,大型公司一般都会将MySQL软件定制成rpm包,然后放到yum仓库里,使用yum安装,中小企业里的二进制和编译安装的区别不大。
使用二进制方式安装MySQL方法见http://oldboy.blog.51cto.com/2561410/1893734。
(1)建立MySQL用户账号
首先以root身份登录到Linux系统中,然后执行如下命令创建mysql用户账号:
[root@oldboy~]# useradd -s /sbin/nologin -M mysql #<==默认会创建和mysql用户同名的组。
[root@oldboy~]# id mysql
uid=500(mysql)gid=500(mysql) groups=500(mysql)
根据上述结果输出,可以看到mysql用户和组已经成功创建。
(2)获取MySQL软件包
MySQL软件包的下载地址为:http://dev.mysql.com/downloads/mysql/(如果地址变更无法下载,可以去http://mirrors.sohu.com/mysql下载)。可以把软件下载到客户端电脑本地后,使用rz等工具传到Linux里,或者找到网络下载地址后,直接在Linux里使用wget下载。
提示:本例以MySQL编译的方式来讲解,使用二进制方式安装的完整过程在本文结尾会提供给大家。在生产场景中,二进制和源码包两种安装方法都是可以用的,其应用场景一般没什么太大差别。不同之处在于,二进制的安装包较大,名字和源码包也有些区别,二进制的安装过程比源码更快。
MySQL源码包和二进制安装包的名称见表3-1。
表3-1MySQL二进制和源码包
MySQL软件 |
软件名 |
MySQL源码安装包 |
mysql-5.6.34.tar.gz(本章选择的安装包) |
MySQL二进制安装包 |
mysql-5.6.34-linux-glibc2.5-x86_64.tar.gz |
(3)采用编译方式安装MySQL
配置及编译安装的步骤如下:
第一步,下载mysql软件包。
[root@oldboy~]# mkdir -p /home/oldboy/tools
[root@oldboy~]# cd /home/oldboy/tools/
[root@oldboytools]# wget -q http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.34.tar.gz
[root@oldboytools]# ls -lh
total31M
-rw-r--r--.1 root root 31M Nov 28 07:46 mysql-5.6.34.tar.gz
第二步,解压配置mysql,命令如下:
[root@oldboytools]# tar xf mysql-5.6.34.tar.gz
[root@oldboytools]# cd mysql-5.6.34
[root@oldboytools]# cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.6.34 \
-DMYSQL_DATADIR=/application/mysql-5.6.34/data\
-DMYSQL_UNIX_ADDR=/application/mysql-5.6.34/tmp/mysql.sock \
-DDEFAULT_CHARSET=utf8\
-DDEFAULT_COLLATION=utf8_general_ci\
-DWITH_EXTRA_CHARSETS=all\
-DWITH_INNOBASE_STORAGE_ENGINE=1\
-DWITH_FEDERATED_STORAGE_ENGINE=1\
-DWITH_BLACKHOLE_STORAGE_ENGINE=1\
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1\
-DWITH_ZLIB=bundled\
-DWITH_SSL=bundled\
-DENABLED_LOCAL_INFILE=1\
-DWITH_EMBEDDED_SERVER=1\
-DENABLE_DOWNLOADS=1\
-DWITH_DEBUG=0
提示:
1)编译时可配置的选项很多,常见的参数选项见本章最后一部分内容,更详细的可参考本章结尾附录讲解。
2)编译MySQL需要安装gcc等工具,此部分在安装操作系统时已经安装上了,具体参考CentOS6操作系统的安装详细步骤,见《跟老男孩学Linux运维:Web集群实战》书或免费部署文章http://book.51cto.com/art/201605/510756.htm。
第三步,编译安装MySQL,命令如下:
[root@oldboymysql-5.6.34]# make #<==如果是多核cpu,可指定make -jcpu核数,加快编译速度。
[root@oldboymysql-5.6.34]# make install
第四步,为MySQL安装路径设置不带版本号的软链接/application/mysql,操作命令如下:
[root@oldboymysql-5.6.34]# ln -s /application/mysql-5.6.34/ /application/mysql
#补充:如果系统里有曾经安装的数据库文件和启动程序最好停掉或删除,以免冲突。
[root@oldboymysql-5.6.34]# ls -l /application/
total 4
lrwxrwxrwx. 1 root root 26 Feb 26 17:49 mysql-> /application/mysql-5.6.34/
drwxr-xr-x.13 root root 4096 Feb 26 17:49 mysql-5.6.34
[root@oldboymysql-5.6.34]# ls /application/mysql/
bin COPYING data docs include lib man mysql-test README scripts share sql-bench support-files
如果上述操作未出现错误(每个步骤结束后,都可以使用echo $?看返回值是否为0,为0则表示正确),查看/application/mysql/目录,若其下有内容,则表示MySQL5.6.34源代码包采用cmake方式安装成功了。
3.2.2创建MySQL数据库配置文件并对数据库目录授权
MySQL5.5数据库默认为用户提供了多个配置文件模板,但是MySQL5.6的support-files目录下已经没有配置文件模板了。
[root@oldboymysql-5.6.34]# ll support-files/*.cnf
-rw-r--r--.1 root root 1126 Feb 26 17:54 support-files/my-default.cnf
[root@oldboymysql-5.6.34]# mv /etc/my.cnf /etc/my.cnf.bak
#提示:在CentOS6.8版操作系统最小化安装完成后,在/etc目录下会存在一个my.cnf,需要将此文件更名为其他的名字,如:/etc/my.cnf.bak,否则,该文件会干扰源码安装的MySQL的正确配置,造成无法启动。
#在启动MySQL服务时,会按照一定的顺序搜索my.cnf,先在/etc目录下找,找不到则会搜索"$basedir/my.cnf",在本例中就是/application/mysql-5.6.34/my.cnf,这是新版MySQL的配置文件的默认位置!
[root@oldboymysql-5.6.34]# cp support-files/my-default.cnf /application/mysql-5.6.34/my.cnf
提示:此行操作可以省略,在下文初始化mysql时会自动生成my.cnf模板文件,如果已经执行上述命令,则初始化后会生成my-new.cnf文件,my.cnf和my-new.cnf除了注释以外是一致的。
[root@oldboymysql-5.6.34]# chown -R mysql.mysql /application/mysql/
#<==授权mysql用户管理mysql的安装目录。
关于更多mysql my.cnf参数的说明及调优,请参看本书后面章节。
3.2.3初始化MySQL数据库文件
上述配置完毕后,就可以初始化数据库文件了,这个步骤其实也可以在编译安装MySQL之后就操作,只不过放到这里更合理一些。
(1)初始化MySQL数据库
初始化数据库的核心命令为:
/application/mysql/scripts/mysql_install_db --basedir=/application/mysql/--datadir=/application/mysql/data --user=mysql
提示:--basedir=/application/mysql/为MySQL的安装路径,--datadir为数据文件目录。另,注意mysql_install_db和MySQL5.1的路径不同,MySQL5.1不在MySQL bin路径下了。
整个初始化的操作过程为:
[root@oldboy mysql-5.6.34]#/application/mysql/scripts/mysql_install_db --basedir=/application/mysql/--datadir=/application/mysql/data --user=mysql
#<==初始化mysql数据库文件,会有很多信息提示,如果没有ERROR级别的错误,有两个OK的字样,表示初始化成功,否则就要解决初始化的问题。
InstallingMySQL system tables...2017-02-26 18:08:53 0 [Warning] TIMESTAMP with implicitDEFAULT value is deprecated. Please use --explicit_defaults_for_timestampserver option (see documentation for more details).
2017-02-2618:08:53 0 [Note] Ignoring --secure-file-priv value as server is running with--bootstrap.
2017-02-2618:08:53 0 [Note] /application/mysql//bin/mysqld (mysqld 5.6.34) starting asprocess 47993 ...
2017-02-2618:08:53 47993 [Note] InnoDB: Using atomics to ref count buffer pool pages
2017-02-2618:08:53 47993 [Note] InnoDB: The InnoDB memory heap is disabled
2017-02-2618:08:53 47993 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2017-02-2618:08:53 47993 [Note] InnoDB: Memory barrier is not used
2017-02-2618:08:53 47993 [Note] InnoDB: Compressed tables use zlib 1.2.3
2017-02-2618:08:53 47993 [Note] InnoDB: Using Linux native AIO
2017-02-2618:08:53 47993 [Note] InnoDB: Using CPU crc32 instructions
2017-02-2618:08:53 47993 [Note] InnoDB: Initializing buffer pool, size = 128.0M
2017-02-2618:08:53 47993 [Note] InnoDB: Completed initialization of buffer pool
2017-02-2618:08:53 47993 [Note] InnoDB: The first specified data file ./ibdata1 did notexist: a new database to be created!
2017-02-2618:08:53 47993 [Note] InnoDB: Setting file ./ibdata1 size to 12 MB
2017-02-2618:08:53 47993 [Note] InnoDB: Database physically writes the file full: wait...
...省略若干...
2017-02-2618:08:54 47993 [Note] InnoDB: Waiting for purge to start
2017-02-2618:08:54 47993 [Note] InnoDB: 5.6.34 started; log sequence number 0
2017-02-2618:08:54 47993 [Note] Binlog end
2017-02-2618:08:54 47993 [Note] InnoDB: FTS optimize thread exiting.
2017-02-2618:08:54 47993 [Note] InnoDB: Starting shutdown...
2017-02-2618:08:55 47993 [Note] InnoDB: Shutdown completed; log sequence number 1625977
OK #<==两个OK是初始化成功的标志。
Fillinghelp tables...2017-02-26 18:08:55 0 [Warning] TIMESTAMP with implicit DEFAULTvalue is deprecated. Please use --explicit_defaults_for_timestamp server option(see documentation for more details).
2017-02-2618:08:55 0 [Note] Ignoring --secure-file-priv value as server is running with--bootstrap.
2017-02-2618:08:55 0 [Note] /application/mysql//bin/mysqld (mysqld 5.6.34) starting asprocess 48015 ...
2017-02-2618:08:55 48015 [Note] InnoDB: Using atomics to ref count buffer pool pages
2017-02-2618:08:55 48015 [Note] InnoDB: The InnoDB memory heap is disabled
...省略若干...
2017-02-2618:08:56 48015 [Note] InnoDB: FTS optimize thread exiting.
2017-02-2618:08:56 48015 [Note] InnoDB: Starting shutdown...
2017-02-2618:08:57 48015 [Note] InnoDB: Shutdown completed; log sequence number 1625987
OK #<==两个OK是初始化成功的标志。
To startmysqld at boot time you have to copy
support-files/mysql.serverto the right place for your system
PLEASEREMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To doso, start the server, then issue the following commands:
/application/mysql//bin/mysqladmin-u root password 'new-password'
/application/mysql//bin/mysqladmin-u root -h oldboy password 'new-password'
Alternativelyyou can run:
/application/mysql//bin/mysql_secure_installation
whichwill also give you the option of removing the test
databasesand anonymous user created by default. This is
stronglyrecommended for production servers.
See themanual for more instructions.
You canstart the MySQL daemon with:
cd . ;/application/mysql//bin/mysqld_safe &
You cantest the MySQL daemon with mysql-test-run.pl
cdmysql-test ; perl mysql-test-run.pl
Pleasereport any problems at http://bugs.mysql.com/
Thelatest information about MySQL is available on the web at
http://www.mysql.com
SupportMySQL by buying support/licenses at http://shop.mysql.com
###请注意如下几行英文的说明
New default config file was createdas /application/mysql//my.cnf and
will be used by default by theserver when you start it.
You may edit this file to changeserver settings
#从上文说明中可以指导mysql的默认配置文件已经变到了/application/mysql//my.cnf
WARNING: Default config file/etc/my.cnf exists on the system
This file will be read by defaultby the MySQL server
If you do not want to use this,either remove it, or use the
--defaults-file argument tomysqld_safe when starting the server
#从上文说明中可以看到数据库启动时会读取/etc/my.cnf,因此有可能会导致无法启动,避免的方法就是使用mysqld_safe启动服务时采用--defaults-file参数指定配置文件,前文已将/etc/my.cnf改名了,所以,就不需要指定参数了,这里是一个坑,读者要注意。
此步骤必须要初始化成功,否则,后面会出现登录不了数据库等各种问题。
(2)初始化数据库的原理及结果说明
初始化数据库的实质就是创建基础的数据库系统的库文件,例如:生成MySQL库表等。
初始化数据库后,查看数据目录,可以看到多了如下文件:
[root@oldboymysql-5.6.34]# ls -l /application/mysql/data
total110604
-rw-rw----.1 mysql mysql 12582912 Feb 26 18:08 ibdata1
-rw-rw----.1 mysql mysql 50331648 Feb 26 18:08 ib_logfile0
-rw-rw----.1 mysql mysql 50331648 Feb 26 18:08 ib_logfile1
drwx------.2 mysql mysql 4096 Feb 26 18:08 mysql #<==用于存放管理mysql的数据。
drwx------.2 mysql mysql 4096 Feb 26 18:08performance_schema #<==5.5及以上增加的内部性能库。
drwxr-xr-x.2 mysql mysql 4096 Feb 26 17:48test #<==用于测试的test数据库。
[root@oldboymysql-5.6.34]# tree /application/mysql/data #<==如果没有tree,可以yuminstall tree –y安装
/application/mysql/data
├──ibdata1
├──ib_logfile0
├──ib_logfile1
├──mysql
│ ├── columns_priv.frm
│ ├── columns_priv.MYD
│ ├── columns_priv.MYI
…省略若干…
│ ├── general_log.CSV
│ ├── general_log.frm
│ ├── help_category.frm
│ ├── procs_priv.frm
│ ├── procs_priv.MYD
│ ├── procs_priv.MYI
│ ├── proxies_priv.frm
│ ├── proxies_priv.MYD
│ ├── proxies_priv.MYI
│ ├── servers.frm
…省略若干…
│ ├── time_zone_name.MYI
│ ├── time_zone_transition.frm
│ ├── time_zone_transition.MYD
│ ├── time_zone_transition.MYI
│ ├── time_zone_transition_type.frm
│ ├── time_zone_transition_type.MYD
│ ├── time_zone_transition_type.MYI
│ ├── user.frm
│ ├── user.MYD
│ └── user.MYI
├──performance_schema
│ ├── accounts.frm
│ ├── cond_instances.frm
│ ├── db.opt
│ ├── events_stages_current.frm
│ ├── events_stages_history.frm
│ ├── events_stages_history_long.frm
│ ├──events_stages_summary_by_account_by_event_name.frm
…省略若干…
│ ├── threads.frm
│ └── users.frm
└── test
└── db.opt
3directories, 136 files
(3)MySQL初始化故障排错集锦
本节的所有故障必须要解除,否则,后面会出现登录不了MySQL数据库等各种问题,故障集锦见本章结尾内容
3.2.4配置并启动MySQL数据库
1)设置MySQL启动脚本
[root@oldboymysql-5.6.34]# pwd
/home/oldboy/tools/mysql-5.6.34
[root@oldboymysql-5.6.34]# cp support-files/mysql.server /etc/init.d/mysqld #<==拷贝mysql启动脚本到mysql的命令路径。
[root@oldboymysql-5.6.34]# chmod 700 /etc/init.d/mysqld #<==使脚本可执行。
[root@oldboymysql-5.6.34]# ls -l /etc/init.d/mysqld
-rwx------.1 root root 10929 Feb 26 18:26 /etc/init.d/mysqld
2)启动MySQL数据库
#<==这是启动数据库规范方法之一,还可以使用/application/mysql/bin/mysqld_safe--user=mysql &启动。这个命令结尾 “&”符号作用是,在后台执行mysql服务,这条命令执行完 还需要按下回车才能进入到命令行状态。
#<==注意,如果已执行上面/etc/init.d/mysqld start启动命令,还想尝试下面mysqld_safe的命令,请先执行/etc/init.d/mysqld stop结束mysql进程。
[root@oldboymysql-5.6.34]# cd ~
[root@oldboymysql-5.6.34]# /etc/init.d/mysqld start
StartingMySQL. SUCCESS!
提示:禁止使用pkill、kill -9、killall -9等命令强制杀死数据库,这会引起数据库无法启动等故障发生。企业中曾发生过的血的教训案例请看http://oldboy.blog.51cto.com/2561410/1431161。
3)检查MySQL数据库是否启动。
[root@oldboy~]# netstat -lntup|grep mysql
tcp 0 0 :::3306 :::* LISTEN 48065/mysqld
如发现3306端口没起来。请使用tail-100 /application/mysql/data/机器名.err检查日志报错进行调试。经常查看服务运行日志是个很好的习惯,也是高手的习惯,你要不要成为高手?嘿!
4)查看MySQL数据库启动结果日志。
[root@oldboy~]# tail /application/mysql/data/oldboy.err
2017-02-2617:38:36 48065 [Note] InnoDB: Waiting for purge to start
2017-02-2617:38:36 48065 [Note] InnoDB: 5.6.34 started; log sequence number 1625987
2017-02-2617:38:36 48065 [Warning] No existing UUID has been found, so we assume thatthis is the first time that this server has been started. Generating a newUUID: 4f94404a-fc74-11e6-8112-000c292ece3f.
2017-02-2617:38:36 48065 [Note] Server hostname (bind-address): '*'; port: 3306
2017-02-2617:38:36 48065 [Note] IPv6 is available.
2017-02-2617:38:36 48065 [Note] - '::' resolvesto '::';
2017-02-2617:38:36 48065 [Note] Server socket created on IP: '::'.
2017-02-2617:38:36 48065 [Note] Event Scheduler: Loaded 0 events
2017-02-2617:38:36 48065 [Note] /application/mysql-5.6.34/bin/mysqld: ready forconnections.
Version:'5.6.34' socket:'/application/mysql-5.6.34/tmp/mysql.sock' port: 3306 Source distribution
本例查看了错误日志的命令及错误日志中的内容,这里省略了大部分日志内容,只给了默认10行,如果有错误,一般会显示error字样。
5)设置MySQL开机自启动。
[root@oldboy~]# chkconfig --add mysqld
[root@oldboy~]# chkconfig --list mysqld
mysqld 0:off 1:off 2:on 3:on 4:on 5:on 6:off
此外,将启动命令/etc/init.d/mysqld start放到/etc/rc.local里面实现开机自启动也可。
若MySQL安装及使用出现故障,可根据下面的分析思路进行检查。
q 细看所有执行命令返回的屏幕输出,不要忽略关键的输出内容。
q 辅助查看系统日志/var/log/messages。
q 如果是MySQL关联了其他服务,要同时查看相关服务的日志。
q 仔细阅读,重新查看操作的步骤是否正确,书写的命令及字符是不是都对。
经常查看各种服务运行日志是个很好的习惯,也是成长为高手的必经之路,你要不要成为高手?嘿!
3.2.5将MySQL相关命令加入全局路径
如果不为MySQL的命令配置全局路径,就无法直接在命令行输入mysql这样的命令,只能用全路径命令(/application/mysql/bin/mysql),这种带着路径输入命令的方式很麻烦。下面来看看配置的具体方法。
1)确认mysql命令所在的路径。
[root@oldboy/]# ls /application/mysql/bin/mysql
/application/mysql/bin/mysql
2)在PATH变量前面增加/application/mysql/bin路径,并追加到/etc/profile文件中。
[root@oldboy/]# echo 'export PATH=/application/mysql/bin:$PATH' >>/etc/profile
#<==注意,echo后是单引号呦,双引号是不行滴。
[root@oldboy/]# tail -1 /etc/profile
exportPATH=/application/mysql/bin:$PATH
[root@oldboy/]# source /etc/profile
#<==执行source使上一行添加到/etc/profile中,内容直接生效
#<==以上命令的用途为,定义mysql全局路径,实现在任意路径执行mysql命令。
[root@oldboy~]# echo $PATH
/application/mysql/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
#<==执行echo $PATH有/application/mysql/bin输出表示配置成功。
提示:更简单的设置方法为用下面命令做软链接:ln -s /application/mysql/bin/* /usr/local/sbin/,把mysql命令所在路径链接到全局路径/usr/local/sbin/的下面。
要特别强调的是,务必把MySQL命令路径放在PATH路径中其他路径的前面,否则,可能会导致使用的mysql等命令和编译安装的mysql命令不是同一个,进而产生错误。下面的网址中给出了因为MySQL路径配置问题导致的错误案例:http://oldboy.blog.51cto.com/2561410/1122867,该错误实际上就是因为使用yum安装的MySQL客户端命令访问了编译安装的服务端而导致的。
3.2.6登录MySQL测试
登录并测试的命令如下:
[root@oldboy ~]# mysql#<==直接敲mysql就进入数据库了,而且身份还是root。
Welcometo the MySQL monitor. Commands end with; or \g.
YourMySQL connection id is 2
Serverversion: 5.6.34 Source distribution
Copyright(c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracleis a registered trademark of Oracle Corporation and/or its
affiliates.Other names may be trademarks of their respective
owners.
Type'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
提示:你还可以使用如下三种命令写法登录mysql:
mysql -uroot -p,
mysql -uroot,
mysql -uroot -p '密码'
若出现登录故障,可通过以下方法排查。
如果这里提示无法登录,排除了数据库启动问题后,则很可能是数据库初始化文件有问题。例如:
[root@oldboy ~]# mysql
ERROR1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
解决办法:重新初始化数据库即可,此问题一般都是数据库初始化问题,或者数据库文件损坏,以及目录权限问题。
mysql>show databases; #<==查看当前的数据库
+--------------------+
|Database |
+--------------------+
|information_schema |
|mysql |
|performance_schema |
|test |
+--------------------+
4 rowsin set (0.00 sec)
mysql>select user(); #<==查看当前的登录用户
+----------------+
|user() |
+----------------+
|root@localhost |
+----------------+
1 row inset (0.00 sec)
mysql> #<==快捷键ctrl+d,也可以使用quit或exit等。
MySQL安装完成后,默认情况下,管理员账号root是无密码的,极不安全,必须要处理一下。
3.2.7基本的MySQL安全配置
1. 为root用户设置密码
MySQL管理员的账号root密码默认为空,极不安全,可以通过mysqladmin命令为mysql不同实例的数据库设置独立的密码。
[root@oldboy~]# mysqladmin -u root password 'oldboy123' #<==为root用户设置密码oldboy123。
Warning:Using a password on the command line interface can be insecure. #<==这里是一个警告,提醒用户命令行放置密码是不安全的,读者尽量不要在命令行输入密码,而是采取交互式的输入密码。
[root@oldboy~]# mysql #<==无法直接输入命令登录了。
ERROR1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
[root@oldboy~]# mysql -uroot -p #<==新的登录方式,也可以直接带密码mysql -uroot -poldboy123。
Enterpassword: #<==输入新密码oldboy123,交互式输入密码不会记录在命令记录里,因此更安全。
Welcometo the MySQL monitor. Commands end with; or \g.
YourMySQL connection id is 5
Serverversion: 5.6.34 Source distribution
Copyright(c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracleis a registered trademark of Oracle Corporation and/or its
affiliates.Other names may be trademarks of their respective
owners.
Type'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
读者也可以执行mysql_secure_installation命令交互式地设置系统的用户密码。
2. 清理mysql服务器内无用的用户
mysql>select user,host from mysql.user;
+------+-----------+
| user |host |
+------+-----------+
| root |127.0.0.1 |
| root |::1 |
| | localhost |
| root |localhost |
| | oldboy |
| root |oldboy |
+------+-----------+
6 rowsin set (0.00 sec)
mysql>drop user root@'::1';
QueryOK, 0 rows affected (0.00 sec)
mysql>drop user root@'oldboy';
QueryOK, 0 rows affected (0.00 sec)
mysql>drop user ''@'oldboy';
QueryOK, 0 rows affected (0.00 sec)
mysql>drop user ''@'localhost';
QueryOK, 0 rows affected (0.00 sec)
mysql>select user,host from mysql.user;
+------+-----------+
| user |host |
+------+-----------+
| root |127.0.0.1 |
| root |localhost |
+------+-----------+
2 rowsin set (0.00 sec)
提示:对于drop命令及数据库安全,后文会有详细讲解,此处不执行也可以。
有时用drop命令可能无法删除对应用户。比如,当数据库内的host等字段为大写及特殊Linux主机名时,删除用户就会遇到问题,例如:
mysql>drop user ' '@'MySQL';
ERROR1396 (HY000): Operation DROP USER failed for ' '@'mysql'
可使用DML语句,并采用delete命令删除来解决此问题,具体命令如下:
mysql>delete from mysql.user where user='' and host='MySQL';
QueryOK, 1 row affected (0.00 sec)
mysql>flush privileges;
QueryOK, 0 rows affected (0.00 sec)
3. 删除mysql数据库内无用的test库
mysql>drop database test;
QueryOK, 0 rows affected (0.00 sec)
mysql>show databases;
+--------------------+
|Database |
+--------------------+
|information_schema |
|mysql |
|performance_schema |
+--------------------+
3 rowsin set (0.00 sec)
有关更多的MySQL的安全措施,在后文会有更详细的讲解。
3.3 MySQL安装FAQ
问题1:在配置mysql时遇到错误。
出现的错误如下:
checking for tgetent in -ltinfo... no
checking for termcap functions library... configure: error: No curses/termcap library found
原因:缺少ncurses安装包。
解决方法:使用yum -y install ncurses-devel命令。
问题2:初始化MySQL数据库时出现故障。
故障1:给出了警告信息“WARNING: The host 'oldboy' could not be looked upwith resolveip.”
警告是可以忽略的,如果非要解决则需修改对主机名的解析,使其和uname -n命令的结果一样,如下:
[root@oldboy~]# grep "`uname -n`" /etc/hosts
127.0.0.1 oldboy
故障2:错误提示ERROR: 1004 Can't createfile '/tmp/#sql300e_1_0.frm' (errno: 13)
在执行初始化数据库命令时可能就会遇到这样的错误,错误提示如下:
ERROR: 1004 Can't create file '/tmp/#sql300e_1_0.frm'(errno: 13)
120406 15:47:02 [ERROR] Aborting
12040615:47:02 [Note] /application/mysql/libexec/mysqld: Shutdown complete
Installation of system tables failed! Examine the logs in
/application/mysql/datafor more information.
根据提示可知,/tmp目录不能创建文件,所以解决办法为给/tmp目录增加权限,如下:
解决办法:还原/tmp目录权限,操作命令如下:
[root@oldboy~]# chmod 1777 /tmp #<==1777是/tmp的默认权限,除非曾经改动过此目录权限才会报错。
[root@oldboy~]# ls -ld /tmp/
drwsrwxrwt.8 root root 4096 3月 10 18:07 /tmp/
本示例的故障必须要解除,否则,后面会出现登录不了MySQL数据库等各种问题。
问题3:登录数据库是提示“Access denied for user 'root'@'localhost'”
解答:正文里已给出答案,不再累述。
问题4:有时drop删除MySQL用户删不掉。
解答:正文里已给出答案,不再累述。
3.4 MySQL编译常见参数选项说明
编译参数 |
说明 |
-DCMAKE_INSTALL_PREFIX=/application/mysql-5.6.34 |
设定mysql安装目录 |
-DMYSQL_DATADIR=/application/mysql-5.6.34/data |
设定mysql数据文件目录 |
-DMYSQL_UNIX_ADDR=/application/mysql-5.6.34/tmp/mysql.sock |
设定mysql.sock路径 |
-DDEFAULT_CHARSET=utf8 |
设定默认的字符集为utf8 |
-DDEFAULT_COLLATION=utf8_general_ci |
设定默认排序规则 |
-DEXTRA_CHARSETS=gbk,gb2312,utf8,ascii |
启用额外的字符集类型 |
-DENABLED_LOCAL_INFILE=ON |
启用本地数据导入支持 |
-DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 -DWITHOUT_PARTITION_STORAGE_ENGINE=1 |
若想启用某个引擎的支持,-DWITH_<ENGINE>_STORAGE_ENGINE=1 若想禁用某个引擎的支持:-DWITHOUT_<ENGINE>_STORAGE_ENGINE=0 |
-DWITH_FAST_MUTEXES=1 |
|
-DWITH_ZLIB=bundled |
启用libz库支持 |
-DENABLED_LOCAL_INFILE=1 |
这个参数重复了,启用本地数据导入支持 |
-DWITH_READLINE=1 |
启用readline库支持(提供可编辑的命令行) |
-DWITH_EMBEDDED_SERVER=1 |
编译嵌入式服务器支持 |
-DWITH_DEBUG=0 |
禁用debug(默认为禁用) |
更多内容可以参考官方MySQL 5.6的cmake编译参数http://dev.mysql.com/doc/refman/5.6/en/source-configuration-options.html