这篇文章是我们组内一位小伙伴垒的文字,亲测每个步骤,真实、可靠、接地气,照着做就能入门Linux下的MySQL安装,欢迎更多的小伙伴能将日常工作中的经验记录下来,分享给其他人,正所谓“独乐乐不如众乐乐”。
最近接到一个任务,由于开发环境变化,需要将旧机器上的mysql迁移到新机器上去,其中涉及到在新服务器安装mysql。其实之前已经在Linux环境安装过一次,但是更多忙于慌乱的解决问题并达到最终目标,对细节的关注度不够,而且虽然整个过程借鉴了很多前辈的经验,但每个人的思维方式和关注点不一样,所以这次详细的记录了安装全过程。由于是第二次尝试安装,很多问题和细节都未触及,但还是希望能给初次安装mysql的萌新提供一些参考。
1. 安装文件准备
可从mysql官方网站下载。本次安装使用的是mysql-5.7.27-linux-glibc2.12-x86_64.tar。
2. 解压缩文件
解压缩该文件,指令为,
tar xvf mysql-5.7.27-linux-glibc2.12-x86_64.tar
指令执行及解压之后的目录如下图所示,
继续解压文件mysql-5.7.27-linux-glibc2.12-x86_64.tar.gz,指令为,
tar -xzvf mysql-5.7.27-linux-glibc2.12-x86_64.tar.gz
解压之后该目录如下图所示,红色框中即mysql文件,
3. 软连接
(1) 将第2步截图红框中的目录(mysql-5.7.27-linux-glibc2.12-x86_64)软连接到/usr/local/mysql(如没有该目录则需自行创建)。指令为,
ln -s mysql-5.7.27-linux-glibc2.12-x86_64 /usr/local/mysql
(2) 执行(1)之后,查看/usr/local/mysql目录,效果如下图所示。
但是发现红框选中的目的连接持续闪烁,
(3) 可通过修改(1)中的指令的方式解决(2)所描述的连接闪烁问题,即在(1)指令中写明原文件的全路径。
先删除原连接,
rm -rf /usr/local/mysql/mysql-5.7.27-linux-glibc2.12-x86_64
新的指令如下,
ln -s /opt/app/software/mysql/mysql-5.7.27-linux-glibc2.12-x86_64 /usr/local/mysql/
执行之后查看/usr/local/mysql目录如下截图所示,
4. 创建用户
使用root权限,创建用户。指令如下所示,
groupadd mysql
useradd -g mysql -s /sbin/nologin -d /usr/local/mysql/ -M mysql
5. 设置环境变量
设置mysql相关的环境变量,指令如下,
echo PATH=$PATH:/usr/local/mysql/mysql-5.7.27-linux-glibc2.12-x86_64/bin >>/etc/profile
source /etc/profile
6. 创建必须的目录
直接执行以下指令(会将该目录创建在当前服务器的根目录),
mkdir -p /mysql/3306/{data,tmp,log}
创建目录之后更换属主,
chown -R mysql:mysql 3306
7. 编辑配置文件配置文件my.cnf
关于该配置文件,目前还有以下几点问题不清晰。
(1) 首先提供本次安装my.cnf文件的内容,
(2) 其他安装经验有提到该文件不是必须的,没有该文件mysql也能正常运行。关于此点的理解是mysql有很多默认设置,这些默认设置就能满足一般使用需求。但是由于本次安装basedir和datadir的路径都“不一般”,所以必须特别指定,则通过my.cnf来指定。还有经验指出,可以通过修改mysql.server来指定当前机器的basedir和datadir,但是由于第一次安装就是通过my.cnf来指定的,所以本次还是沿用了第一次的思路,下次再有安装mysql的需求会尝试通过修改mysql.server的basedir和datadir来实现(修改方式详见本文第8步的描述,如省略my.cnf的配置则直接到第8步)。
(3) 网上有较多该文件的模板,一般都有多段内容:[client]、[mysqld]、[mysqldump]、[mysqld_safe]等,但是本文配置了上图所示的两段内容也可正常运行。所以归根结底还应是mysql默认配置的作用,本次安装只涉及了basedir和datadir的修改,所以配置文件的内容已满足需求。另外了解到涉及mysql调优的时候,该文件会有更大的用处,所以后续涉及数据量很大或者数据库性能问题的时候可深究此文件。
8. 配置mysql.server
cd /usr/local/mysql/mysql-5.7.27-linux-glibc2.12-x86_64/support-files
cp mysql.server /etc/init.d/mysqld
实现7(2)中的描述,需在此修改该文件的basedir和datadir为当前机器的路径)。此处存留一个问题,也可在后续的安装中尝试解决。看了很多经验都有从support-files将mysql.server复制到/etc/init.d并修改了文件名的操作,难道直接在support-files中修改并使用该文件不可以?为什么一定要有copy到另一个路径的操作?
9. 初始化数据库
初始化数据库,执行指令及返回结果如下所示,
/usr/local/mysql/mysql-5.7.27-linux-glibc2.12-x86_64/bin/mysqld --defaults-file=/etc/my.cnf --initialize --user=mysql --basedir=/usr/local/mysql/mysql-5.7.27-linux-glibc2.12-x86_64/ --datadir=/mysql/3306/data/
mysqld: [Warning] World-writable config file '/etc/my.cnf' is ignored.
2020-02-29T11:36:35.006277Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2020-02-29T11:36:35.417910Z 0 [Warning] InnoDB: New log files created, LSN=45790
2020-02-29T11:36:35.499207Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2020-02-29T11:36:35.570611Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: bdc0f4c7-5ae7-11ea-95b4-fa163e6e78e4.
2020-02-29T11:36:35.574241Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2020-02-29T11:36:35.574667Z 1 [Note] A temporary password is generated for root@localhost: B-m%;xgH_54d
10. 获取密码
初始化数据库会提供初始密码,需注意保存改密码,后续会用,即上述打印内容的最后一行,
2020-02-29T11:36:35.574667Z 1 [Note] A temporary password is generated for root@localhost: B-m%;xgH_54d
11. 启动数据库
成功启动数据库效果如下图所示,
[root@localhost]# etc/init.d/mysqld start
Starting MySQL. SUCCESS!
但是启动数据库期间遇到一个问题,问题如下图所示,
[root@localhost]# /etc/init.d/mysqld start
my_print_defaults: [Warning] World-writable config file '/etc/my.cnf' is ignored.
Starting MySQL ERROR! Couldn't find MySQL server (/usr/local/mysql/bin/mysqld_safe)
起初排查问题直接忽略掉了Warning提示信息,只关注ERROR报错,反复确认自己的确在配置文件中正确配置了当前机器的mysql的目录。后来又看到Warning信息,当前机器的配置都是通过/etc/my.conf实现的,但是由于自己贪图方便,将该文件的权限是设置成777,所以导致mysql启动时认为该文件不安全,而将其ignored,随即将该文件的权限改为644,问题解决。
12. 修改root密码
修改密码出现报错:
[root@localhost]# cd /usr/local/mysql/mysql-5.7.27-linux-glibc2.12-x86_64/support-file
[root@localhost]# mysqladmin -uroot -p password 'my25sql2020'
bash: mysqladmin: command not found
该问题的原因是由于系统默认会查找/usr/bin下的命令,如果命令不在这个目录下,则会报错找不到命令,需要做的就是映射一个链接到/usr/bin目录下,即建立软连接。首先需知道mysql命令或mysqladmin命令的完整路径,比如mysqladmin的路径是:
/usr/local/mysql/mysql-5.7.27-linux-glibc2.12-x86_64/bin/mysqladmin
则可以这样执行命令:
ln -s /usr/local/mysql/mysql-5.7.27-linux-glibc2.12-x86_64/bin/mysqladmin /usr/bin
但是本次暂且通过使用mysqladmin绝对路径的方式也执行成功(后续觉得这样很麻烦并且不利于其它人使用,所以最终还是创建了软连接):
13. 解决第12步的报错
第12步的描述中,截图的最后有一个报错:
'Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)'
Check that mysqld is running and that the socket:'/tmp/mysql.sock' exists!
检查了my.cnf中配置的socket路径,socket=/var/lib/mysql/mysql.sock,并且该路径也已经存在mysql.sock文件。但是mysql仍去找/tmp/mysql.sock,没找到导致了上述报错信息。所以创建一个软连接来解决该问题,指令及结果如下图所示:
之后继续修改密码,修改成功:
14. 登录数据库
成功登录数据库
15. Navicat登录
尝试用Navicat通过root账号登录,出现如下图所示的报错,
经排查为是mysql未开启mysql远程访问权限导致, 执行以下语句,修改root用户的权限,同样的报错依然存在。
但是第16步创建的新用户,可以成功通过Navicat访问数据库,又从安全角度考虑root账号权限过大,所以便未再深究此问题,还将root的权限收回了:update user set host='localhost' where user='root'。
16. 创建新用户
17. 创建数据库并给用户授权
最后的授权也很关键,
至此,便可通过Navicat等第三方软件访问数据库执行增删改查等操作。
其实很多问题都是只知其然,不知所以然。会担心安装过程中改错了某个配置而导致最后安装失败或者消耗太多时间成本,但是对于技术的学习的确是需要时间和精力的付出才能更有收获。如果再有这方面的需求,应该能更大胆的研究这些配置文件,或者在以后的使用过程中尝试修改某项配置看其产生的影响。