17.12 MySQL安装
- 作为LAMP架构的后端,是一款流行的开源关系数据库系统。在企业网站、业务系统等应用中,各种账户信息、产品信息,客户资料、业务数据等都可以存储到MySQL数据库,其他程序可以通过SQL语句来查询,更改这些信息。
- mysql5和 mysql8两版本安装方式不同,分别介绍下两种安装方式。推荐使用mysql8安装
17.12.1 mysql5安装
1.添加 mysql 用户和 mysql 用户组
#添加mysql用户组
[root@CncLucZK ~]# groupadd mysql
#创建普通用户管理mysql,指定mysql用户的初始组是mysql组
[root@CncLucZK ~]# useradd -s /sbin/nologin -g mysql mysql
这里添加的 mysql 用户和用户组是稍后用来给 MySQL 安装目录分配权限用的,所以并不需要设定密码,因为这个用户是不能直接登录 Linux 系统的。
2.进入 MySQL 解压缩目录,编译前配置,编译安装
#进入 MySQL 解压缩目录
[root@CncLucZK ~]# cd /usr/local/src/mysql-5.5.23
#编译前配置
[root@CncLucZK mysql-5.5.23]# cmake \ #命令
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ #指定安装位置
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \ #指定socket(套接字)文件位置
-DEXTRA_CHARSETS=all \ #支持所有的扩展字符集
-DDEFAULT_CHARSET=utf8 \ #指定默认字符集
-DDEFAULT_COLLATION=utf8_general_ci \ #指定默认字符校对
-DWITH_MYISAM_STORAGE_ENGINE=1 \ #安装myisam存储引擎
-DWITH_INNOBASE_STORAGE_ENGINE=1 \ #安装innodb存储引擎
-DWITH_MEMORY_STORAGE_ENGINE=1 \ #安装memory存储引擎
-DWITH_READLINE=1 \ #支持readline库
-DENABLED_LOCAL_INFILE=1 \ #启用加载本地数据
-DMYSQL_USER=mysql \ #指定MySQL运行用户
-DMYSQL_TCP_PORT=3306 #指定MySQL端口
[root@CncLucZK mysql-5.5.23]# make && make install
cmake编译配置期间如果发现:-bash: cmake: command not found问题说明cmake没有安装。
使用 yum -y install cmake进行安装。然后使用 cmake --version查看下安装版本;
然后若出现cmake: symbol lookup error: cmake: undefined symbol: archive_write_add_filter_zstd这个问题,那么需要安装libarchive开源压缩库来访问许多压缩文件格式;输入该命令yum install libarchive,然后再次查看cmake版本cmake --version文件解决。
对于cmake: symbol lookup error问题,还可以安装低版本或者高版本的 cmake
卸载cmake程序:yum remove cmake 或 rpm -e cmake
重新安装cmake:网址:https://cmake.org/download/
创建软连接:ln -s /xx-path/cmake /usr/bin/cmake
使用 cmake 进行编译。如果编译过程中出现了报错,则不再使用“make clean”命令清除缓存及临时文件,而是直接删除“rm-rf CMakeCache.txt”文件。
3.生成MySQL的配置文件,并修改配置文件
- 这个配置文件不用手工建立,在 MySQL 安装目录中给我们准备了模板文件,只需把模板文件复制到指定位置并改名即可。命令如下:
[root@CncLucZK mysql-5.5.23]#cp /usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf
#或者是support-files文件下的/my-default.cnf作为模板文件
[root@CncLucZK mysql-5.5.23]#cp support-files/my-default.cnf /etc/my.cnf
#配置系统识别mysql 服务,可以使用service mysql start
[root@CncLucZK mysql-5.5.23]#cp support-files/mysql.server /etc/init.d/mysqld
#配置mysql开机自启动服务
[root@CncLucZK mysql-5.5.23]#chkconfig --add /etc/init.d/mysqld
[root@CncLucZK mysql-5.5.23]#chkconfig mysqld --level 35 on
#设置环境变量,申明/宣告mysql命令便于系统识别
[root@localhost mysql-5.6.26]#echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
#配置完环境变量后,需要执行source /etc/profile命令,使配置文件生效
[root@localhost mysql-5.6.26]#source /etc/profile
[root@localhost mysql-5.6.26]#echo $PATH #测试变量值
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/mysql/bin
4.修改 MySQL 安装目录的权限
[root@CncLucZK mysql-5.5.23]# cd /usr/local/mysql/
#进入MySQL安装目录
[root@CncLucZK mysql]# chown -R mysql.
#把当前目录下所有文件的所有者改为root用户
[root@CncLucZK mysql]# chgrp -R mysql.
#把当前目录下所有文件的所属组改为mysql组
5.初始化数据库
- 源码包安装的 MySQL 中所有的数据库默认都保存在 /usr/local/mysql/data/ 目录中,MySQL 的初始数据库 mysql 库和 test 库也会保存在这个目录中。但是,如果我们仔细查看 /usr/local/mysql/data/ 目录,就会发现这个目录中只有两个空目录,并没有任何数据。也就是说,MySQL 中的所有数据库是不存在的,那么这个 MySQL 是不能使用的,因为 MySQL 的所有用户是要保存在 user 表中的,而 user 表保存在 mysql 库中,而 mysql 库是保存在 /usr/local/mysql/data/ 目录中的。 那么,我们现在需要在 data 目录中建立 MySQL 的初始数据库。命令如下:
#初始化数据库
[root@CncLucZK mysql]# /usr/local/mysql/bin/mysql_install_db \
> --user=mysql \
> --ldata=/var/lib/mysql \
> --basedir=/usr/local/mysql\
> --datadir=/usr/local/mysql/data
[root@CncLucZK mysql]#vim /etc/init.d/mysqld
#46-47行
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
- 这条命令的 --user 选项表示使用 mysql 用户来初始化数据库,这个用户要和我们在步骤一中建立的用户一致。命令执行完成之后,/usr/local/mysal/data/ 目录中应该会出现很多相应的数据,证明数据库初始化成功。
6.继续修改MySQL安装目录的权限
[root@CncLucZK mysql]# chown -R root.
#把当前目录下所有文件的所有者改为root用户
#注意:修改的目录依然是/usr/local/mysql/目录下的文件
[root@CncLucZK mysql]# chown -R mysql data
#把data目录的所有者改为mysql用户
7.启动 MySQL 服务器,并保证 mysql 服务开机自启动
- MySQL 服务器的安装已经完成,我们可以尝试启动 MySQL 服务器,命令如下:
#启动命令
[root@CncLucZK mysql]# /usr/local/mysql/bin/mysqld_safe ——user=mysql &
#或者是
[root@CncLucZK mysql]# service mysqld start
#使用mysql用户启动MySQL服务器,并在后台持续运行
[root@CncLucZK mysql]# netstat -tlun | grep 3306
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN
#3306端口已经开启了
- 当然,我们还要保证 mysql 服务开机自启动,命令如下:
[root@localhost mysql]# vi /etc/rc.local
#修改自启动配置文件,加入如下的mysql服务标准启动命令
/usr/local/mysql/bin/mysqld_safe ——user=mysql &
8.设定 MySQL 中 root 用户的密码,并登录
- MySQL 的管理员也是 root,不过这只是数据库的管理员,不要和 Linux 的 root 用户混淆了。我们需要给 MySQL 的本地用户设定一个密码。设定密码的方式有很多种,我们使用 Linux 的命令 mysqladmin 设定 MySQL 的 root 用户的密码。命令如下:
[root@localhost mysql]# /usr/local/mysql/bin/mysqladmin -u root password 123
#给MySQL的root用户设定密码为123
[root@localhost mysql]# /usr/local/mysql/bin/mysql -u root -p
#使用root用户登录mysql
Enter password: #输入正确的密码
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version:5.1.59-community-log Source distribution
Copyright (c) 2000, 2011, Oracle and/or its affiliates.All rights reserved.
Oracle is 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> \s #查询服务器状态信息
…省略部分输出…
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
#编码格式已经修改为UTF-8
…省略部分输出…
mysql> exit
#退出MySQL
17.12.2 mysql8安装
1.卸载mysql
#检查是否安装
[root@CncLucZK src]# rpm -qa | grep mysql
#如已安装mysql,则删除
#rpm -e --nodeps +包名 #--nodeps可以不检测依赖性直接卸载,但此方式不推荐大家使用
#按依赖顺序卸载
[root@CncLucZK src]# rpm -e --nodeps mysql-8.0.21-1.module_el8.2.0+493+63b41e36.x86_64
[root@CncLucZK src]# rpm -e mysql-server-8.0.21-1.module_el8.2.0+493+63b41e36.x86_64
[root@CncLucZK src]# rpm -e mysql-errmsg-8.0.21-1.module_el8.2.0+493+63b41e36.x86_64
[root@CncLucZK src]# rpm -e mysql-devel-8.0.21-1.module_el8.2.0+493+63b41e36.x86_64
[root@CncLucZK src]# rpm -e mysql-libs-8.0.21-1.module_el8.2.0+493+63b41e36.x86_64
[root@CncLucZK src]# rpm -e mysql-common-8.0.21-1.module_el8.2.0+493+63b41e36.x86_64
#再次检查安装包是否全部删除
[root@CncLucZK src]# rpm -qa | grep mysql
#搜索mysql文件夹
[root@CncLucZK src]# find / -name mysql
#若有mysql文件夹,则删除
[root@CncLucZK src]# rm -rf +包名
#再次检查文件夹是否全部删除
[root@CncLucZK src]# find / -name mysql
2.在 /usr/local/src下 创建mysql文件夹,并在里面下载mysql,然后在此文件中解压缩
#进入源码下载目录
[root@CncLucZK ~]# cd /usr/local/src
创建mysql文件夹
[root@CncLucZK ~]# mkdir mysql
#切换到mysql文件夹下
[root@CncLucZK ~]# cd mysql
#下载mysql,根据自己需要的mysql版本进行输入版本号。也可以直接在官方下载最新版本官方下载选择linux系统对应的mysql版本
[root@CncLucZK ~]# wget https://cdn.mysql.com/archives/mysql-8.0/mysql-8.0.18-el7-x86_64.tar.gz
#解压mysql源码包,解压后查看是否存在bin文件,有些源码包不包含bin文件,是需要编译安装的
[root@CncLucZK ~]#tar zxvf mysql-8.0.18-el7-x86_64.tar.gz
3.将mysql-8.0.18解压缩文件移动到/usr/local/mysql下
[root@CncLucZK src]# mv /usr/local/src/mysql/mysql-8.0.18-el7-x86_64 /usr/local/mysql
4.进入/usr/local/mysql文件后,创建data文件夹来存储数据
[root@CncLucZK src]# cd /usr/local/mysql
[root@CncLucZK mysql]# mkdir data
5.创建用户组以及用户和密码
[root@CncLucZK src]# groupadd mysql #有些linux版本,mysql用户及用户组已存在
[root@CncLucZK src]# useradd -g mysql mysql
6.将安装包授权用户
[root@CncLucZK mysql]# chown -R mysql.mysql /usr/local/mysql
[root@CncLucZK local]# ll -d mysql
drwxr-xr-x 12 mysql mysql 4096 Nov 2 23:33 mysql
#配置环境,编辑/etc/profile文件
[root@CncLucZK ~]# vi /etc/profile
export PATH=$PATH:/usr/local/mysql/bin:/usr/local/mysql/lib
[root@CncLucZK ~]# source /etc/profile
注意:配置完环境变量后,需要执行source /etc/profile命令,使配置文件生效
7.切换到/usr/local/mysql/bin目录下,初始化基础信息
[root@CncLucZK local]# cd /usr/local/mysql/bin
[root@CncLucZK local]#./mysqld --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/ --lower-case-table-names=1 --initialize #示表名不区分大小写
如果初始化中报错lc-messages-dir,则需要提前在/etc/my.cnf文件中添加以下配置
lc-messages=en_US lc-messages-dir=/usr/local/mysql8/share/english/
然后再执行上述初始化指令:执行之前进入data目录,清空里面的文件数据
注意:MYSQL8以后,修改配置是无效的,如果缺少配置项,只能删除data目录,然后重新初始化
- 得到临时密码
-datadir=/usr/local/mysql/data/ --lower-case-table-names=1 --initialize
2022-11-02T15:51:38.724390Z 0 [System] [MY-013169] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.18) initializing of server in progress as process 107484
2022-11-02T15:51:42.990431Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: :s%tnwCcp6,,
8.在/etc/目录下编辑my.cnf配置文件,若my.cnf不存在,直接新增
[root@CncLucZK bin]# vi /etc/my.cnf
[mysql]
default-character-set=utf8mb4
[client]
port=3306
default-character-set=utf8mb4
[mysqld]
port=3306
user=mysql
max_connections=200
max_connect_errors=10
basedir=/usr/local/mysql/
datadir=/usr/local/mysql/data/
socket=/tmp/mysql.sock
character-set-server=utf8mb4
default-storage-engine=INNODB
lower_case_table_names=1
general_log = 1
general_log_file= /var/log/mysql/mysql.log
innodb_data_home_dir=/usr/local/mysql/data
innodb_log_group_home_dir=/usr/local/mysql/data/
symbolic-links=0
#如果初始化中报错lc-messages-dir,则需要添加以下配置
lc-messages=en_US
lc-messages-dir=/usr/local/mysql/share/english/
[mysqld_safe]
log-error=/usr/local/mysql/data/mysql.log
pid-file=/usr/local/mysql/data/mysql.pid
9.退出bin目录,回到=/usr/local/mysql目录下,将mysqld服务复制到/etc/init.d目录下系统,使系统识别服务
[root@CncLucZK mysql]# cp -a ./support-files/mysql.server /etc/init.d/mysql
[root@CncLucZK mysql]# cp -a ./support-files/mysql.server /etc/init.d/mysqld
#若/etc/init.d/mysql文件没有x权限,需要授权
[root@CncLucZK mysql]# chmod +x /etc/init.d/mysql
[root@CncLucZK mysql]# chmod +x /etc/init.d/mysqld
[root@CncLucZK mysql]# ll -d /etc/init.d/mysql
-rwxr-xr-x 1 mysql mysql 10576 Sep 20 2019 /etc/init.d/mysql
[root@CncLucZK mysql]# ll /etc/init.d/mysqld
-rwxr-xr-x 1 mysql mysql 10576 Sep 20 2019 /etc/init.d/mysqld
#让源码包安装的mysql服务能被chkconfig命令管理,才能开机自启动
[root@CncLucZK mysql]# chkconfig --add mysql
[root@CncLucZK ~]# chkconfig --list | grep mysql #3,5on确实是开机自启动
mysql 0:off 1:off 2:on 3:on 4:on 5:on 6:off
10.启动mysql,查看启动状态,并将mysql命令添加到服务
#启动mysql
[root@CncLucZK mysql]# service mysql start
#查看运行启动状态
[root@CncLucZK mysql]# service mysql status
SUCCESS! MySQL running (112228)
#将mysql命令添加到服务,建立链接
[root@CncLucZK mysql]# ln -s /usr/local/mysql/bin/mysql /usr/bin
如果发现启动失败,可以先查看data里面的mysql.log,如果有提示3306这样的字样,第一个想到的应该是端口被占用,使用lsof -i:端口号,查看是哪个PID(进程号)占用了该端口,然后使用kill PID(进程号)杀掉进程,重新执行service mysql start
11.登录mysql -uroot -p 密码使用之前随机生成的密码
在 vim /etc/my.cnf文件中,在[mysqld]的段中加上一句:skip-grant-tables --跳过密码验证
然后保存退出,重启MySQL服务
[root@CncLucZK bin]# mysql -uroot -p :s%tnwCcp6,, #密码使用之前随机生成的密码
#若登录过程中缺少libncurses.so.5,libtinfo.so.5文件,则先find查询系统中是否有这两个包,然后建立链接
[root@CncLucZK bin]# ln -s /usr/lib64/libncurses.so.6 libncurses.so.5
[root@CncLucZK bin]# ln -s /usr/lib64/libtinfo.so.6 libtinfo.so.5
#进入数据库
mysql> USE mysql ;
#修改root密码
mysql> alter user 'root'@'localhost' identified with mysql_native_password by '你的密码';
#修改远程连接并生效.
#root用户的localhost表示只允许本机访问,要实现远程连接,可以将用户的host改为%,表示允许任意主机访问,如果需要设置只允许特定ip访问,则应改为对应的ip。
mysql> update mysql.user set host="%" where user="root";
#刷新配置
mysql> flush privileges;
存在问题1:连接mysql数据库报错:
mysql: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory
问题原因:没有libncurses.so.5文件
解决办法:
- 查找系统中存在的libncurses.so不同版本的文件,使用命令
[root@CncLucZK bin]# find / -name libncurses* ... /usr/lib64/libncurses.so.6.1 /usr/lib64/libncursesw.so /usr/lib64/libncurses++w.so.6 /usr/lib64/libncurses++.so.6 /usr/lib64/libncurses++w.so.6.1 /usr/lib64/libncurses++.so.6.1 /usr/lib64/libncurses.so.6 /usr/lib64/libncursesw.so.6 /usr/lib64/libncurses++w.so /usr/lib64/libncurses.so /usr/lib64/libncurses++.so /usr/lib64/libncursesw.so.6.1 ..
2.建立链接
ln -s /usr/lib64/libncurses.so.6 libncurses.so.5
3.如果没有找到的话,使用yum或apt安装即可
12.查看端口
mysql> show global variables like 'port';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port | 3306 |
+---------------+-------+
1 row in set (0.01 sec)
#退出
mysql> exit
13.MySQL8创建新用户及授权方式
create user ‘test’@‘%’ identified by ‘123456’;
grant all privileges on *.* to ‘test’@‘%’;
flush privileges;
14.远程连接mysql数据库
- 查询访问权限
mysql> select user,host from mysql.user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| root | % |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
+------------------+-----------+
4 rows in set (0.00 sec)
- 若root用户的host是localhost表示只允许本机访问,要实现远程连接,可以将用户的host改为%,表示允许任意主机访问,如果需要设置只允许特定ip访问,则应改为对应的ip。修改root用户的host字段为%
mysql> update mysql.user set host='%' where user='root';
- 刷新配置
mysql> flush privileges;
-
开放端口号:
-
- ****如果是物理服务器:****查询3306端口是否开放
firewall-cmd --query-port=3306/tcp
没有开放则添加3306端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
添加端口后刷新防火墙
firewall-cmd --reload
-
- **如果是云服务器:**配置安全组入站访问规则,增加3306端口号。
- **如果是云服务器:**配置安全组入站访问规则,增加3306端口号。
-
navicat测试能否连接
存在问题2:远程能否连接 -
使用mysql8.0搭建起数据库之后,在本地连接mysql的时候遇到报错:Client does not support authtication protocol requested by server;consider upgrading mysql client ,我这里是用的navicat for mysql客户端。这是由于mysql8.0更新了加密规则,mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password。而navicat当前版本还不支持最新的加密规则。
-
- 可以在mysql的启动文件中配置加密规则
[mysqld]
default_authentication_plugin=mysql_native_password
-
- 创建用户密码的时候指定加密规则,这个方便简单。
use mysql; #选择数据库
create user '用户名'@'%' identified WITH mysql_native_password by '密码';
grant all privileges on 数据库名.* to '用户名'@'%' with grant option;
flush privileges;
-
- 对于已经创建的用户修改一下加密规则即可。
ALTER USER '用户名'@'%' IDENTIFIED WITH mysql_native_password BY '密码';
FLUSH PRIVILEGES;
-
- 另外记得之前在操作mysql8.0遇到不能直接使用grant privileges授权的同时创建用户,在8.0中这两步必须分开,即先创建用户然后再授权。常用的mysql相关配置如下(添加到mysql8中的/etc/my.cnf):
[mysql] default-character-set=utf8mb4 [client] port=3306 #设置mysql客户端默认端口 default-character-set=utf8mb4 #mysql客户端默认字符集 [mysqld] port=3306 #端口 user=mysql max_connections=200 # 允许最大连接数 max_connect_errors=10 # 允许连接失败的次数 character-set-server=utf8mb4 # 服务端默认字符集 default-storage-engine=INNODB # 创建表时默认存储引擎 general_log = 1 general_log_file= /var/log/mysql/mysql.log socket=/var/lib/mysql/mysql.sock lower_case_table_names=1 basedir=/usr/local/mysql datadir=/usr/local/mysql/data #log-bin=/usr/local/mysql/data/mysql-bin innodb_data_home_dir=/usr/local/mysql/data innodb_log_group_home_dir=/usr/local/mysql/data/ default_authentication_plugin=mysql_native_password # 默认使用加密规则 sql_mode = ‘STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION‘ symbolic-links=0 #autocommit=1 [mysqld_safe] log-error=/usr/local/mysql/data/mysql.log pid-file=/usr/local/mysql/data/mysql.pid
-
最后使用systemctl status 和systemctl restart查看和重启mysql8。
systemctl status mysqld.service systemctl restart mysqld.service
-
存在问题3:在进入mysql命令行执行sql时,报错Ignoring query to other database,原因登录mysql时没有带u参数
[root@CncLucZK bin]# mysql -uroot -p