文章目录
注:shell脚本及所需安装包下载地址: mysql源码安装脚本
一、执行脚本前准备工作
1.将cmake-2.8.12.2.tar.gz和mysql-5.6.17.tar.gz上传到/tmp目录下:
[root@localhost ~]# ls /tmp/
cmake-2.8.12.2.tar.gz mysql-5.6.17.tar.gz
2.在虚拟机设置中勾选“已连接”和选择相应的镜像:
然后将mysql.sh上传到你的虚拟机执行sh mysql.sh命令
你可能会遇到这个报错:
[root@localhost ~]# sh mysql.sh
: command not found
: not foundv/cdrom
does not existint /mnt
: command not found
问题原因:
DOS下的文本文件是以\r\n
作为断行标志的,表示成十六进制就是0D 0A
。而Unix下的文本文件是以\n
作为断行标志的,表示成十六进制就是0A
。DOS格式的文本文件在Linux底下,用较低版本的vi打开时行尾会显示^M
,而且很多命令都无法很好的处理这种格式的文件。而Unix格式的文本文件在Windows下用Notepad打开时会拼在一起显示。因此产生了两种格式文件相互转换的需求,对应的将UNIX格式文本文件转成成DOS格式的是unix2dos
命令。由于Windows和linux文件换行的不同,可能会导致Windows文件在linux中不可用,反过来也一样。
解决方法一:
首先用vi命令打开文件:[root@localhost test]# vi mysql.sh
在vi命令模式中使用:set ff
命令,可以看到改文件的格式为fileformat=dos
修改文件format为unix,使用vi/vim修改文件format。
命令::set ff=unix
或者::set fileformat=unix
然后:wq保存退出就可以了
解决方法二:
[root@localhost ~]# dos2unix mysql.sh
dos2unix: converting file mysql.sh to UNIX format ...
注:如果没有(如Redhat5.5默认有而Redhat6.5则默认没有该命令)该命令的话用yum -y install dos2unix装一下
在上述准备工作完成后,我在RedHat5.5和RedHat6.5中直接运行mysql.sh即可。但如果你是在Centos7.2中测试的话还需要再做两个步骤:
(1)将mysql.sh中的第九行改为baseurl=file:///mnt
。
注:经测试Redhat5.5为file:///mnt/Server
,Redhat6.5为file:///mnt/Server
或file:///mnt
均可,Centos7.2的话为file:///mnt
(2)执行这条命令时报这个错,所以你在执行mysql.sh之前就把这个问题解决了吧:
[root@h81 scripts]# ./mysql_install_db --user=mysql --basedir=/app/mysql --datadir=/app/mysql/data
FATAL ERROR: please install the following Perl modules before executing ./mysql_install_db:
Data::Dumper
解决:yum -y install autoconf
//此包安装时会安装Data:Dumper模块。
问题解决后执行sh mysql.sh命令后你就可以静静的等待了,可以去睡一觉,醒来之后mysql用源码安装的方式就给你安装好了,是不是很省心啊(我等了差不多三十多分钟吧)。
脚本执行完后执行mysql -u root -p
后输入你的密码mysql即可正常使用mysql了:
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.6.17 |
+-----------+
1 row in set (0.00 sec)
二、补充:将DOS格式文本文件转换成Unix格式
最简单的用法就是dos2unix直接跟上文件名。格式:dos2unix file
如果一次转换多个文件,把这些文件名直接跟在dos2unix之后。(注:也可以加上-o参数,也可以不加,效果一样):
格式:dos2unix file1 file2 file3
格式:dos2unix -o file1 file2 file3
上面在转换时,都会直接在原来的文件上修改,如果想把转换的结果保存在别的文件,而源文件不变,则可以使用-n参数:
格式:dos2unix -n oldfile newfile
如果要保持文件时间戳不变,加上-k参数。所以上面几条命令都是可以加上-k参数来保持文件时间戳的:
格式:dos2unix -k file
格式:dos2unix -k file1 file2 file3
格式:dos2unix -k -o file1 file2 file3
格式:dos2unix -k -n oldfile newfile
注:unix2dos命令的使用方式与dos2unix命令的类似。
如下,不加-k时候,因为文件内容被修改,所有modify time更新。使用-k则是保持时间属性不变:
[root@localhost hui]# ls -l --full-time mysql.sh
-rw-r--r-- 1 root root 2241 2016-09-06 15:33:42.000000000 +0800 mysql.sh
[root@localhost hui]# dos2unix -k mysql.sh
dos2unix: converting file mysql.sh to UNIX format ...
[root@localhost hui]# ls -l --full-time mysql.sh
-rw-r--r-- 1 root root 2131 2016-09-06 15:33:42.000000000 +0800 mysql.sh
[root@localhost hui]# unix2dos mysql.sh
unix2dos: converting file mysql.sh to DOS format ...
[root@localhost hui]# ls -l --full-time mysql.sh
-rw-r--r-- 1 root root 2131 2017-01-19 21:25:26.000000000 +0800 mysql.sh
特别说明:unix2dos和dos2unix的互相转换
(1)Windows中,文件行尾是以/r/t
结束的,其ASCII值为 /r? = 0d /n = 0a
,如下用hexdump –C
查看文件的十六进制格式。/r/t
的ASCII值为 /r? = 0d /n = 0a
:
[root@localhost hui]# hexdump -C mysql.sh
00000000 72 6d 20 2d 72 66 20 2f 65 74 63 2f 79 75 6d 2e |rm -rf /etc/yum.|
00000010 72 65 70 6f 73 2e 64 2f 2a 0d 0a 0d 0a 75 6d 6f |repos.d/*....umo|
(2)用cat –A显示文件的钟的特殊字符:
注:/r
显示为^M
,/n
显示为$
[root@localhost hui]# cat -A mysql.sh
rm -rf /etc/yum.repos.d/*^M$
^M$
(3)用dos2unix将此文件转换成linux的格式,我们可以看到,已转换成功,将/r/n
转换成/n
:
[root@localhost hui]# dos2unix mysql.sh
dos2unix: converting file mysql.sh to UNIX format ...
[root@localhost hui]# cat -A mysql.sh
rm -rf /etc/yum.repos.d/*$
$
[root@localhost hui]# hexdump -C mysql.sh
00000000 72 6d 20 2d 72 66 20 2f 65 74 63 2f 79 75 6d 2e |rm -rf /etc/yum.|
00000010 72 65 70 6f 73 2e 64 2f 2a 0a 0a 75 6d 6f 75 6e |repos.d/*..umoun|
三、疑问:用yum和源码安装mysql有啥区别的疑问
MySQL也可以执行yum -y install mysql*
(Redhat/Centos5.5和6.5用yum -y install mysql-server
就可以,而Centos7.2还得参考这篇文章在CentOS7中利用yum命令安装mysql,安装完还得用/bin/systemctl stop mysql.service
命令启动)来安装的,且更快更方便啊,那用yum和源码安装mysql有啥区别的疑问?
下面是我从网上找的感觉回答这个问题回答比较好的:
跟做运维的朋友聊天,谈到了yum安装和源码安装哪个好的问题。真没想到,关于这个问题,分歧还挺大的。有的人认为,不用源码安装就不是好的运维,不是好的系统管理员。这帽子扣的有点大了。在此我想说一说我的看法,经常看我博客的,也许知道,前期我写关于服务器的文章,基本上都是源码安装的,后来基本上是用yum安装的,除非yum源里面没有,我才会源码安装。在我看来,yum安装和源码安装,基本上没区别,最终还是生成系统所需求的文件,有什么区别呢?
一、yum安装和源码安装,方式的不同
1.yum安装是将yum源中的rpm包下载到本地,安装这个rpm包。这个rpm包是别人编译安装好的二进制包。这种方式与其说是安装不如说是,更新来的更确切一点。
2.源码安装,下载是源码包,要进行编译和安装,编译过程,可以进行参数设定。
二、yum安装和源码安装,优缺点分析
1.yum安装的优点都很清楚,安装东西,方便快捷,特别是不用考虑包依赖。yum安装的缺点,人为无法干预,不能按需安装。源里面有什么就安装什么,安装的版本也比较低。
2.源码安装的优缺点:
源码安装的优点,编译安装过程,可以设定参数,按照需求,进行安装,并且安装的版本,可以自己选择,灵活性比较大。
源码安装的缺点,由于安装包过新或者是其他问题,导致依赖的包没有,或者版本过低。这个时候就要解决包的依赖问题,linux系统中有的包,一个依赖一个,可能装一个小东西,就要解决一堆包的依赖问题,花很多时间解决包的依赖问题,得不尝失。源码安装的多了,不敢升级系统,因为一升级系统就可能会导致以前手动装的东西,不能用。
很多做运维的,都认为,源码安装比yum安装的性能要好,根据参数选择安装,肯定比yum装了一大堆要好。这样认为的运维,我只能说,他不懂配置。根本不了解自已装的东西。在我看来,同一版yum安装和源码安装完全是一样的。
以apache为例吧,这个东西,非常常见的,用做web最广泛的工具之一,源码安装,./configure
时候,可以添加很多参数,来实现订制。yum安装也可以,yum安装装了很多apache的模块,有的模块根本用不到,无故浪费系统资源和影响性能。但是我们可以配置httpd.conf啊,不需求的模块,我们可以不LoadModule啊,通过修改配置文件,完全可以实现根源码安装一样的效果。不排除少数软件,安装后,不能修改配置的情况,也就是说安装的时候是多少东西,就是多少东西,没有配置文件不可以配置的。
我觉得,对于刚接触linux的人来说,源码安装很有必要,这样你可以知道自己在做什么,安装过程中,肯定会遇到很多很多的问题,遇到问题,解决问题。这样才会成长。不要一直都用yum装,如果yum安装出了一点问题,就傻眼了,不知道怎么解决,这样很杯具。
四、补充:mysql忘记root密码该怎么办
1.通过安全模式
操作系统:CentOS7
软件版本:mysql-5.7
直接通过安全模式启动并跳过用户名认证:mysqld_safe --skip-grant-table &
输入mysql -u root -p
后让输密码也直接回车就行,再更新密码输入:update mysql.user set password=password('huiq123') where user='root' and host='localhost';
后exit;
退出。
再输入如下命令后就可以正常使用了:mysqladmin -u root -p huiq123 shutdown
2.重新安装
操作系统:CentOS7.2
软件版本:mysql-5.7.34
注:你可能重新安装之后,发现安装过程中没有需要设置密码的,那是因为没有完全卸载干净mysql,留下了配置文件。
正确步骤应该是:
(1)停止mysql程序;systemctl stop mysqld
(2)删除mysql的数据文件:rm -rf /var/lib/mysql
(3)重新安装mysql。
还可参考:https://www.cnblogs.com/ivictor/p/9243259.html
补充:Windows上的mysql 5.5版本可以参考:https://www.cnblogs.com/rmxd/p/11236736.html
五、补充:MySql Host is blocked because of many connection errors; unblock with ‘mysqladmin flush-hosts’ 解决方法
参考:
MySql Host is blocked because of many connection errors; unblock with ‘mysqladmin flush-hosts’ 解决方法
MySQL参数max_connect_errors分析释疑
原因:同一个ip在短时间内产生太多(超过mysql数据库max_connection_errors
的最大值)中断的数据库连接而导致的阻塞;
解决方法:
- 提高允许的
max_connection_errors
数量(治标不治本):
① 进入Mysql数据库查看max_connection_errors
:show variables like '%max_connect_errors%';
② 修改max_connection_errors
的数量为1000:set global max_connect_errors = 1000;
③ 查看是否修改成功:show variables like '%max_connect_errors%';
# 关于某个IP输入了错误密码,MySQL会在performance_schema数据库下的host_cache表中记录。它会累计记录在COUNT_AUTHENTICATION_ERRORS字段,如下所示:
mysql> use performance_schema;
Database changed
mysql> select * from host_cache\G;
*************************** 1. row ***************************
IP: 196.1.1.11
HOST: node03
HOST_VALIDATED: YES
SUM_CONNECT_ERRORS: 8
COUNT_HOST_BLOCKED_ERRORS: 1196
COUNT_NAMEINFO_TRANSIENT_ERRORS: 0
COUNT_NAMEINFO_PERMANENT_ERRORS: 0
COUNT_FORMAT_ERRORS: 0
COUNT_ADDRINFO_TRANSIENT_ERRORS: 0
COUNT_ADDRINFO_PERMANENT_ERRORS: 0
COUNT_FCRDNS_ERRORS: 0
COUNT_HOST_ACL_ERRORS: 0
COUNT_NO_AUTH_PLUGIN_ERRORS: 0
COUNT_AUTH_PLUGIN_ERRORS: 0
COUNT_HANDSHAKE_ERRORS: 413
COUNT_PROXY_USER_ERRORS: 0
COUNT_PROXY_USER_ACL_ERRORS: 0
COUNT_AUTHENTICATION_ERRORS: 0
COUNT_SSL_ERRORS: 0
COUNT_MAX_USER_CONNECTIONS_ERRORS: 0
COUNT_MAX_USER_CONNECTIONS_PER_HOUR_ERRORS: 0
COUNT_DEFAULT_DATABASE_ERRORS: 0
COUNT_INIT_CONNECT_ERRORS: 0
COUNT_LOCAL_ERRORS: 0
COUNT_UNKNOWN_ERRORS: 0
FIRST_SEEN: 2021-07-29 09:15:30
LAST_SEEN: 2021-07-30 09:14:27
FIRST_ERROR_SEEN: 2021-07-29 09:16:08
LAST_ERROR_SEEN: 2021-07-30 09:14:37
mysql> show variables like '%max_connect_errors%';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| max_connect_errors | 100 |
+--------------------+-------+
1 row in set (0.18 sec)
mysql> set global max_connect_errors = 1000;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like '%max_connect_errors%';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| max_connect_errors | 1000 |
+--------------------+-------+
1 row in set (0.01 sec)
- 使用
mysqladmin flush-hosts
命令清理一下hosts文件(不知道mysqladmin在哪个目录下可以使用命令查找:whereis mysqladmin
);
① 在查找到的目录下使用命令修改:/usr/bin/mysqladmin flush-hosts -h192.168.1.1 -P3308 -uroot -prootpwd;
备注:其中端口号,用户名,密码都可以根据需要来添加和修改;配置有master/slave主从数据库的要把主库和从库都修改一遍的(我就吃了这个亏明明很容易的几条命令结果折腾了大半天);
第二步也可以在数据库中进行,命令如下:flush hosts;