前几天接了个接口项目,按照网上教程安装mysql数据库时出现了一堆问题(捂脸),一顿操作后终于成功起起来了。记录下以免之后再遇到同样问题。
最主要的一个问题是MySql 5.7以上 与 MySql5.6以下的版本在安装时大相径庭,5.6以下版本一般都会提供默认配置文件,5.7以上就不会,比如data文件夹,tmp文件夹等等。并且两者在初始化时的 命令也不一样,如果在5.7以上使用5.6以下的初始化命令,系统会发出警告并提示你该用哪个新的命令,这时候如果没注意就。。。(捂脸),而且5.7以后版本在初始化配置后会提供一个随机生成的初始密码。
首先下载mysql
MySql
选择Linux - Generic (glibc 2.12) (x86, 64-bit), Compressed TAR Archive下载即可
我这里下载的是mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz
刚才上官网看了下,最新的变成8了,这个安装方式是否与5.7相同我就不清楚了(捂脸)
1.把下载完的文件上传到linux服务器,开始解压。
tar -xvzf mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz
2.解压改下名字,方便后续操作。我这里命名为mysql。
mv mysql-5.7.22-linux-glibc2.12-x86_64 mysql
3.新建用户组合用户。
有可能出现该用户组和用户已经存在,这里是删除原先用户组/用户还是修改新建用户组/用户名都看你喜欢怎么弄了。
groupadd mysql
useradd -r -g mysql mysql
4.修改mysql根目录用户权限
进入刚才重命名后的mysql文件夹执行修改权限命令
cd mysql
chown -R mysql .
chgrp -R mysql .
或者
cd mysql
chown -R mysql:mysql ./
5.初始化 MySQL 配置表
这里会有一个不同点
5.6及以下版本使用的是
./scripts/mysql_install_db --user=mysql --basedir=/home/mysql --datadir=/home/mysql/data
//user刚才新建的用户名,scripts在mysql目录下
5.7以上改了,如果还是使用上面那个就会提示让你用--initialize
命令
./bin/mysqld --initialize --user=mysql --basedir=/home/mysql --datadir=/home/mysql/data
从命令中我们可以知道配置时还需要在mysql目录下存在一个data文件夹,但是5.7没有提供这个文件夹,所以我们需要自己在mysql根目录新建一个data文件夹。
否则会报如下提示:
[WARNING] mysql_install_db is deprecated. Please consider switching to mysqld --initialize
[ERROR] The data directory needs to be specified.
data新建完毕后就可以开始初始化了
./bin/mysqld --initialize --user=mysql --basedir=/home/mysql --datadir=/home/mysql/data
初始化完毕后在命令行最后会提供生成好的随机密码,先拷贝下来。
新建完后修改权限
这时候直接初始化会报如下错误
error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
是因为没有安装libaio.so.1
运行安装yum install libaio
,中间会让你同意下,输入 y 回车即可
继续初始化
可以看到最后一行有提供随机密码,记录下来,我这里是scXcgee)k9jn
然后修改下权限,把除了data外的所有mysql文件的权限都设置为root
chown -R root .
chown -R mysql data
6.复制配置文件 my-default.cnf
将该文件复制到/etc下,并改名。
cp support-files/my-default.cnf /etc/my.cnf
这里有一点很重要,就是tmp文件。
首先,如果你的support-files
文件夹下存在my-default.cnf文件,那么打开看下socket项所指的tmp文件是否存在,如果不存在,则新建,否则会报错。
如果不存在,很有意思的是我安装时不存在该文件(捂脸)。
没办法,既然没有提供,那只能自己建了,然后我发现再etc下已经有一个my.cnf了_(:з」∠*)_
。
这是内容
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
很明显,这是默认配置,而我是把mysql装在了home目录中,所以需要修改配置。
附上我的配置文件my.cnf。
basedir就是mysql根目录
datadir就是上面在mysql根目录中新建的data文件夹
socket我在mysql根目录中新建了一个tmp文件夹,然后这里就指向了她,mysql.sock这个文件在我们启动mysql时会自动创建。所以我们只要新建tmp文件夹就行了。
修改下权限
然后最重要的一点来了:如果你的socket指向的地址不在tmp中(linux服务器根目录中的tmp文件夹)(我指向的地址是/home/mysql/tmp,不在tmp中,要加上client)请在my.cnf中加上[client] socket=/home/mysql/tmp/mysql.sock
项,否在在登入时会报错误,就是这个错误让我折腾了好久好久(捂脸)。
ERROR 2002 (HY000): Can’t connect to local MySQL server through socket
‘/tmp/mysql.sock’ (2)
[mysqld]
basedir=/home/mysql
datadir=/home/mysql/data
socket=/home/mysql/tmp/mysql.sock
port=3306
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[client]
socket=/home/mysql/tmp/mysql.sock
[mysqld_safe]
#log-error=/var/log/mariadb/mariadb.log
#pid-file=/var/run/mariadb/mariadb.pid
basedir=/home/mysql
datadir=/home/mysql/data
socket=/home/mysql/tmp/mysql.sock
port=3306
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
7.启动和关闭mysql
#/etc/init.d/mysql start 或者 serivce mysql start 或者 ./bin/mysqld_safe&
#/etc/init.d/mysql stop 或者 service mysql stop 或者 ./bin/mysqladmin -u root -p shutdown
我一般使用./bin/mysqld_safe&
命令启动mysql服务
启动后检查下ps -ef|grep mysql
检查下是否启动
现在没有启动
启动
输入bg 后台运行,然后再运行ps -ef|grep mysql
检查可以看到mysql已经启动了
7.连接mysql
./bin/mysql -uroot -p
提示输入密码,输入刚才记下随机密码 ,要手动输入,不能黏贴哦
连接成功。
8.修改密码
刚才的密码只是初始自动生成的随机密码,我们在之后如果想要使用mysql的话还需要中心设置下密码,不然连远程访问都干不了,这里修改的是root的密码
9.开启远程访问
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> update user set host = ‘%’ where user = ‘root’;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select host, user from user;
+———–+—————+
| host | user |
+———–+—————+
| % | root |
| localhost | mysql.session |
| localhost | mysql.sys |
+———–+—————+
3 rows in set (0.00 sec)
/etc/init.d/mysqld restart
或者
进入mysql安装根目录
./bin/mysqladmin -u root -p shutdown
输入密码关闭
然后再启动
./bin/mysqld_safe&
,实在关不掉就用kill命令吧,把mysql保护线程和mysql线程杀掉就OK了,然后再启动
∠( ᐛ 」∠)_
。