本文系本人装机记录及总结。中间参考诸多网上的博文。如部分内容上有侵权,请联系本人修改,谢谢!
MySQL安装有两种:源码自编译安装和编译过的二进制文件进行安装。后一种方法相比源码安装,节省了差不多半个小时的编译时间,只需要合理配置即可。网上有很多教程,但是对于想要把MySQL安装到指定路径的博文却很少,而且还有很多漏洞。这里记录下安装MySQL 5.7.23的过程。
环境:CentOS 7.4、MySQL 5.7.23 64位
“请使用root用户操作”
Step1.准备安装mysql的依赖
yum -y install libaio
Step2.新建mysql用户和组,用于设置mysql安装目录文件所有者和所属组
groupadd mysql
useradd -r -g mysql mysql
注:
(1)useradd -r 参数表示mysql用户是系统用户,不可用于登录系统
(2)useradd -g 参数表示把mysql用户添加到mysql用户组中
Step3.下载mysql安装包
可以使用wget,但是由于文件过大(600M),可以使用迅雷等下载后再上传
Step4.解压并赋予权限,同时创建data等目录
第一步:解压到指定目录,并重命名文件夹
(1)tar -zxvf mysql-5.7.23-linux-glibc2.12-x86_64.tar.gz
(2)mv mysql-5.7.23-linux-glibc2.12-x86_64 /u01/mysql
第二步:进入mysql,并新建data、tmp、log三个目录
cd /u01/mysql
mkdir tmp
mkdir log
mkdir data
第三步:确保mysql下的文件属主都为mysql(下面的命令是在mysql目录下执行的)
chown -R mysql:mysql /u01/mysql/
--->这是因为下面的初始化需要指定一个用户mysql为了保证命令能够执行
Step5.初始化 MySQL 配置表
mysql5.7和之前版本不同,很多资料上都是这个命令:../scripts/mysql_install_db --user=mysql,而mysql5.7的mysql_install_db命令是在bin目录下的,并且建议用 mysqld --initialize命令
初始化数据库:进入mysql目录
cd /u01/mysql
./bin/mysqld --initialize --user=mysql --basedir=/u01/mysql --datadir=/u01/mysql/data
注释:
--user 启动mysql的用户
--basedir mysql安装目录
--datadir mysql数据仓库目录
初始化成功后,注意最后一行,这也是和之有版本不同的地方,它给了root一个初始密码,后面要登录的时候要用到这个密码(下面是我记录的,大概就是这样,后面只能自己手打)
2018-08-26T12:30:35.676202Z 1 [Note] A temporary password is generated for root@localhost: g9cF<q#tspKk
Step6. 还原权限
将mysql/目录下除了data、tmp、log目录的所有文件,改回root用户所有,mysql用户只需作为mysql/data/目录下所有文件的所有者(下面的命令是在mysql目录下执行的)
(1)其他的所有属主全部还给root
cd /u01/mysql
chown -R root:root ./
(2)我们自己建的3个目录还是给mysql用户
cd /u01/mysql
chown -R mysql:mysql data
chown -R mysql:mysql tmp
chown -R mysql:mysql log
Step7.添加开机启动mysql服务
(1)复制/u01/mysql/support-files/mysql.server为/etc/init.d/mysqld
cp /u01/mysql/support-files/mysql.server /etc/init.d/mysqld
(2)添加mariadb.log,防止启动服务时出错(需要修改属主)
touch /u01/mysql/log/mariadb.log
chown -R mysql:mysql /u01/mysql/log/
--每次使用root用户或者不消息系统用其他用户创建了文件,都要修改属主
--下面通过设置acl权限,可以自动为mysql用户设置相应目录下的文件的读写执行权限。
setfacl -R -m u:mysql:rwx tmp
setfacl -d --set u:mysql:rwx tmp
setfacl -R -m u:mysql:rwx log
setfacl -d --set u:mysql:rwx log
setfacl -R -m u:mysql:rwx data
setfacl -d --set u:mysql:rwx data
--取消acl权限
setfacl -x u:mysql data --去掉用户mysql的权限
setfacl -b data --删除data目录的所有的acl权限
--查看acl权限
getfacl mariadb.log
(3)增加软链,防止找不到mysql命令时出错
ln -s /u01/mysql/bin/mysql /usr/bin
如果想通过命令行进行其他的操作,可以直接将/mysql/bin添加到环境变量
(4)添加开机启动
chkconfig --add mysqld
chkconfig mysqld on
Step8.完整命令列示
yum install libaio
groupadd mysql
useradd -r -g mysql mysql
wget -c https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.23-linux-glibc2.12-x86_64.tar.gz
tar -zxvf mysql-5.7.23-linux-glibc2.12-x86_64.tar.gz
mv mysql-5.7.23-linux-glibc2.12-x86_64 /mysql
cd mysql
mkdir data
mkdir tmp
mkdri log
chown -R mysql:mysql ./
./bin/mysqld --initialize --user=mysql --basedir=/mysql --datadir=/mysql/data
chown -R root:root ./
chown -R mysql:mysql data
chown -R mysql:mysql tmp
chown -R mysql:mysql log
cp support-files/mysql.server /etc/init.d/mysqld
touch /mysql/log/mariadb.log
ln -s /data/server/mysql/bin/mysql /usr/bin
chkconfig --add mysqld
chkconfig mysqld on
Step9.修改配置文件
(1)修改** /etc/my.cnf**,把目录改为对应的路径
vim /etc/my.cnf
basedir=/u01/mysql
datadir=/u01/mysql/data
socket=/u01/tmp/mysql.sock 这个不要这样改,是个bug。使用默认
log-error=/u01/mysql/log/mariadb.log
pid-file=/u01/mysql/tmp/mariadb.pid
添加下面两个配置,指定字符集,保证中文OK
character_set_server = utf8
collation_server = utf8_general_ci
--在mysql中,查看字符集的命令
show variables like '%character%';
(2)修改/etc/init.d/mysqld文件,把目录改为对应的路径
vim /etc/init.d/mysqld
basedir=/u01/mysql
datadir=/u01/mysql/data
bindir=/u01/mysql/bin
sbindir=/u01/mysql/bin
libexecdir=/u01/mysql/bin
-->后面三个参数主要在下面的if逻辑里
-->改成
Step10. 启动服务
service mysqld start|stop|restart|status
会发现报错了:
Starting MySQL. ERROR! The server quit without updating PID file (/mysql/data/sunsn-centos74-64.pid).
但是检查配置文件,什么的都没有错,问题在哪?
问题在我们使用的root用户创建了mariadb.log这个文件。不手动创建也许不会有事,但既然问题出现了,就解决吧。再更改一下/mysql/log的属主
chown -R mysql:mysql /mysql/log
再启动一下,正常!!!!!
Step11.修改密码
情况1:有密码可以登录的情况。使用我们前面“初始化 MySQL 配置表“时记下的临时密码(g9cF<q#tspKk)登录后修改
(1)法1:
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpwd');
(2)法2:
mysql>UPDATE mysql.user SET Password=PASSWORD('newpwd') WHERE User='root';
mysql> FLUSH PRIVILEGES;
情况2:不知道密码。这种稍微麻烦点
第1步:停止mysql服务
service mysqld stop
第2步:修改配置文件
vim /etc/my.cnf
在[mysqld]的段中加上一句:skip-grant-tables 保存并且退出vi。
第3步:重新启动mysql
service mysqld start
第4步:登录并修改MySQL的root密码
直接敲mysql (直接就可以进去了)
第5步:变成情况一了,使用情况1的方法改密码
第6步:把配置文件的skip-grant-tables删除(改回去)重启就可以了
Step12.还差一点点,远程登录
网上很多教程都是直接介绍怎么使root用户可以远程连接的,这里不再拾人牙慧。而是贴近生产,新创建用户,并只给一个新的数据库赋予权限。
下面是创建项目数据库,并针对该项目数据库给用户赋权示例:(保证数据库安全)
1)使用root用户登录,先创建一个数据(比如test项目)
$ mysql -uroot -ppassword
mysql>CREATE DATABASE IF NOT EXISTS test DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
2)进入mysql数据库
mysql>use mysql
- 创建新用户
CREATE USER 'test_user'@'localhost' IDENTIFIED BY '123456';
‘test_user’为新创建用户的用户名,
’123456’为用户密码
这里的localhost最好换成%,因为要使用这个用户从外网连进来。也可以使用如下命令修改
update user set host='%' where user='root';
之后在赋权之前,先使用flush privileges;刷新一下权限,否则,赋权会报错(找不到用户)
ERROR 1133 (42000): Can't find any matching row in the user table
4)为新用户赋予test数据库权限,其他库的不要给
GRANT SELECT, INSERT, UPDATE, REFERENCES, DELETE, CREATE, DROP, ALTER, INDEX, CREATE VIEW, SHOW VIEW ON `test`.* TO 'test_user'@'localhost';
ON后面的‘test’为数据库名,TO后面的 ‘test_user’表示用户, ‘localhost’表示只能本地访问,如果 想让所有IP都可以访问,可以将localhost换成 ‘*’星号,可以使用下面的命令:
grant all privileges on test.* to 'test_user'@'%';
5) 刷新权限
flush privileges;
阿里云推广:
通用代金券领取链接:https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=qtyyc38p
优惠链接:(总有一款适合你)
1)【开年HI购季】爆款云产品5折:https://www.aliyun.com/acts/product-section-2019/new-users?userCode=qtyyc38p
2)【助力企业上云】性能级主机2-5折:https://promotion.aliyun.com/ntms/act/enterprise-discount.html?userCode=qtyyc38p
3)【全民云计算】云主机低至2折:https://promotion.aliyun.com/ntms/act/qwbk.html?userCode=qtyyc38p
4)【商标注册服务】低至300元:https://tm.aliyun.com/?userCode=qtyyc38p
5)【超高返现】购物车全产品返25%:https://promotion.aliyun.com/ntms/act/shoppingcart.html?userCode=qtyyc38p
6)【阿里云自营建站】买一年送一年:https://www.aliyun.com/jianzhan/?userCode=qtyyc38p