Centos7&8安装Mysql8.0
准备工作
1 安装Centos操作系统
- 一般是最小化安装就可以了,安装教程网上一大堆,请自行百度
- 替换国内源,本网站有发布过替换国内源的方法,点击查看。
-
关闭selinux,要不然修改mysql默认端口后mysql服务起不来。
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config -
安装mysql后,我准备将mysql默认端口3306更改为3336,添加mysql新端口到防火墙,使其可以远程登录
firewall-cmd --set-default-zone=public firewall-cmd --zone=public --add-port=3336/tcp --permanent firewall-cmd --reload
2 下载MySQL包
下载地址:
https://downloads.mysql.com/archives/community/
版本选择
-
Product Version(产品版本,即MySQL版本)
根据需要选择,有新的就选新的 -
Operating System(操作系统)
即需要安装在什么操作性系统上,因为Centos基于Red Hat,所以这里选Red Hat Enterprise Linux/Oracle Linux -
OS Version(操作系统版本)
Centos7: Red Hat Enterprise Linux 7/Oracle Linux7(X86,64-bit)
Centos8: Red Hat Enterprise Linux 8/Oracle Linux8(X86,64-bit) -
安装包类型选择
RPM Bundle(x.xx代表小版本号,下载的是一个tar包,下载下来后,传输到Centos服务器解压,解压后得到rpm安装包)
Centos7 tar包名字为:mysql-8.x.xx-1.el7.x86_64.rpm-bundle.tar
Centos8 tar包名字为:mysql-8.x.xx-1.el8.x86_64.rpm-bundle.tar
本文以Centos7 MySQL版本为8.0.23为例
1. 用xshell等工具连接到已安装的服务器
2. 用sftp把包传输到服务器,根据需要选择保存位置,我是放在/home目录下
3. Centos 7默认是mariadb数据库,安装之前需要卸载mariadb,在Centos8已经废除了.
rpm -qa|grep mariadb|xargs rpm -e --nodeps
4. 在/home目录下创建一个mysql目录,用来存放解包后的rpm文件,当然也可以创建其他目录,这个是无所谓的。
mkdir /home/mysql
5. 解压tar包到/home/mysql目录下
tar -xvf /home/mysql-8.0.23-1.el7.x86_64.rpm-bundle.tar -C /home/mysql
6. 安装,我们并不是所有的rpm包都需要安装.按照下面顺序,逐个安装。这里是用yum命令(Centos8兼容yum,也可以用dnf命令)安装而不是rpm命令,因为yum会自动安装依赖包,减少很多麻烦.当然也需要你的服务器网络连接无问题,不会配置网络的,可点击查看Centos7&8网络配置方法
yum -y install /home/mysql/mysql-community-common-8.0.23-1.el7.x86_64.rpm
yum -y install /home/mysql/mysql-community-client-plugins-8.0.23-1.el7.x86_64.rpm
yum -y install /home/mysql/mysql-community-libs-8.0.23-1.el7.x86_64.rpm
yum -y install /home/mysql/mysql-community-libs-compat-8.0.23-1.el7.x86_64.rpm
yum -y install /home/mysql/mysql-community-client-8.0.23-1.el7.x86_64.rpm
yum -y install /home/mysql/mysql-community-server-8.0.23-1.el7.x86_64.rpm
安装完成后事项
默认的配置文件位置:
/etc/my.cnf
修改配置文件前,先备份默认配置文件,学会备份是个好习惯
cp /etc/my.cnf /etc/my.cnf.bak
启动mysql服务,并加入开机启动.第一次启动时间可能会多几秒,这是因为mysql第一次启动有一个初始化的过程
systemctl start mysqld
systemctl enable mysqld
修改root密码,例如修改为Abcd@1234
Mysql安装完成后,会生成一个root账号的初始的密码,不更改密码的话,登录后啥也干不了。
方法一,无需登录,用mysql管理工具mysqladmin来修改,我一般在shell脚本里常这么干。
-
先将默认密码读出来,作为一个变量
pwd=`grep "temporary password" /var/log/mysqld.log|awk -F' ' "{print $NF}"|awk '{print $NF}'` -
然后直接修改密码为Abcd@1234
/usr/bin/mysqladmin -uroot -p${pwd} password "Abcd@1234"
方法二,常规修改方法,用初始密码登录后修改
-
查看初始密码:
grep "temporary password" /var/log/mysqld.log|awk -F' ' "{print $NF}"|awk '{print $NF}' -
用初始密码登录mysql
mysql -uroot -P3336 -p"初始密码" -
修改密码,退出即可
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Abcd@1234'; exit
可选操作
-
Mysql默认连接端口是3306,修改配置文件,将连接端口修改为3336,注意,这里是两个大于号,追加内容(vi编辑配置文件添加配置也行)。然后重启mysql服务
echo "port=3336" >> /etc/my.cnf systemctl restart mysqld -
其他优化
修改binlog日志保留时间,以防binlog日志文件过多导致占用空间较大。 echo "binlog_expire_logs_seconds = 604800" >> /etc/my.cnf 如果是在生产环境中,Mysql服务不会轻易重启,这就需要在不重启服务的情况下清理binlog文件,当然,配置文件中也需要如上面参数修改,防止服务重启后恢复默认值,登录mysql,命令如下(设置为7天) set global binlog_expire_logs_seconds=604800; 查看当前数据库日志binlog保存时效 以秒为单位,登录mysql,输入一下命令 show variables like '%binlog_expire_logs_seconds%'; 为每一个innodb表建立单独的表空间,而不是都塞在系统表空间下 echo "innodb_file_per_table = 1" >> /etc/my.cnf 内存临时表大小,如果超出这个大小,则会生成磁盘临时表 echo "tmp_table_size=256m" >> /etc/my.cnf echo "max_heap_table_size=256m" >> /etc/my.cnf 设置缓存池大小,通过缓冲池,加快业务处理。根据系统内存大小设置,最多能有80%的物理内存被用作缓冲池 echo "innodb_buffer_pool_size = 4G" >> /etc/my.cnf JOIN BUFFER 是 MySQL 用来缓存以上第二、第三这两类 JOIN 检索的一个 BUFFER 内存区域块,适当增加join buffer的值来优化join查询 echo "join_buffer_size = 128M" >> /etc/my.cnf 查询排序时所能使用的缓冲区大小,增大sort_buffer_size值,以解决默认值太小,ORDER BY查询引发内存溢出的问题 echo "sort_buffer_size = 4M" >> /etc/my.cnf read_buffer_size 读查询操作所能使用的缓冲区大小 echo "read_buffer_size = 4M" >> /etc/my.cnf myisam_sort_buffer_size 这个缓冲区主要用于修复表过程中排序索引使用的内存或者是建立索引时排序索引用到的内存大小,一般4G内存给64M echo "myisam_sort_buffer_size = 64M" >> /etc/my.cnf 它针对某些排序之后优化读取行,用在sort查询之后 ,以保证获取以顺序的方式获取到查询的数据 echo "read_rnd_buffer_size = 4M" >> /etc/my.cnf -
MySQL管理员用户root,默认只能本地登录,修改使其能够远程登录(%代表所有主机.生成环境不建议这么做,最好新建个有远程权限的账号),修改完退出即可.
mysql -uroot -pAbcd@1234use mysql; update user set host = '%' where user ='root'; FLUSH PRIVILEGES; exit -
创建数据库my_test.Mysql8数据库的默认字符集是utf8mb4,排序规则是utf8mb4_0900_ai_ci,为了向前兼容,可以将排序规则改为utf8mb4_general_ci,若是新项目,不建议更改。
mysql -uroot -pAbcd@1234create database my_test default character set utf8mb4 collate utf8mb4_general_ci; exit -
创建远程用户test,并设置密码为Abcd@5678,允许远程登录,并为新账号赋予权限 .(数据库名.表名)代表所有数据库的所有表,ALL代表所有权限,也可根据具体需要更改,如SELECT,INSERT,UPDATE等.创建完退出即可用新账号登录了.
mysql -uroot -pAbcd@1234use mysql; CREATE USER 'test'@'%' IDENTIFIED BY "Abcd@5678"; grant all privileges on *.* TO 'test'@'%'; FLUSH PRIVILEGES; exit -
Mysql8.0采用了新的caching_sha2_password的身份验证方式,旧的身份验证为mysql_native_password.更改身份验证,以兼容以前版本的加密连接,比如老版本的phpmyadmin连接报错,新版本的Navicat已支持新的身份验证。
6.1. 修改配置文件.修改配置文件后创建的所有用户,默认使用配置文件的身份验证方式。修改配置文件以前创建的用户不生效。如果是全新安装的mysql8,安装完成后,在从未启动服务(未初始化过)的情况下修改配置文件,那么,默认用户root及后续创建的用户,身份验证方式会自动初始化为配置文件的身份验证方式,若mysql安装完成后,已启动服务(已完成初始化),用方式二来更改用户的身份验证。
echo "default-authentication-plugin=mysql_native_password" >> /etc/my.cnf systemctl restart mysqld6.2. 登录mysql,命令行更改。注意是root主机是%还是localhost,千万比用update,别问为什么
mysql -uroot -pAbcd@1234 use mysql; ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'Abcd@1234'; FLUSH PRIVILEGES; exit
常用命令
查看数据库内所有用户信息
mysql -uroot -pAbcd@1234
use mysql;
select host,user,authentication_string,plugin from user;
exit
查看单个用户的权限和角色
mysql -uroot -pAbcd@1234
use mysql;
SHOW GRANTS FOR '用户名'@'主机名';
exit
查看并解锁已锁定账号(例如,由于密码尝试次数过多导致账号被锁定)
mysql -uroot -pAbcd@1234
use mysql;
查看已锁定用户
select user,host,account_locked from mysql.user;
解锁已锁定用户
ALTER USER 'username'@'hostname' ACCOUNT UNLOCK;
查看某数据库有哪些表
use 数据库名;
show tables;
查看某数据库的编码及排序规则
show create database 数据库名;
查看表的字符集:
SHOW CREATE TABLE tablename;
更改全局数据库字符集和排序规则,只针对更改字符集或排序规则后创建的数据库生效,具体使用哪种编码或者排序规则,根据实际需要更改。
mysql -uroot -pAbcd@1234
use mysql;
set character_set_client = utf8mb4;
set character_set_server = utf8mb4;
set character_set_connection = utf8mb4;
set character_set_database = utf8mb4;
set character_set_results = utf8mb4;
set collation_connection = utf8mb4_general_ci;
set collation_database = utf8mb4_general_ci;
set collation_server = utf8mb4_general_ci;
FLUSH PRIVILEGES;
exit
更改现有数据库的字符集和排序.根据需要自行更改.(如果修改的是表的话,只需把database更改为table,数据库名更改为表名)
mysql -uroot -pAbcd@1234
alter database 数据库名 default character set utf8mb4 COLLATE utf8mb4_general_ci;
exit
更改列的字符集和排序规则,根据需要自行更改(注意外键)
mysql -uroot -pAbcd@1234
use 数据库名;
alter table 表名 change 列名 列名 varchar(255) character set utf8mb4 collate utf8mb4_0900_ai_ci;
exit
查看当前的密码验证策略及修改方法
show variables like 'validate_password.%';
策略说明(生产环境不建议更改)
validate_password.length 是密码的最小长度,默认是8,改成6
set global validate_password.length=6;
validate_password.policy 验证密码的复杂程度,改成0
set global validate_password.policy=0;
validate_password.check_user_name 用户名检查,用户名和密码不能相同,关掉
set global validate_password.check_user_name=off;
删除数据库
mysql -uroot -pAbcd@1234
drop database 数据库名
exit
删除用户.删除前需确认用户的主机名(host).drop删除用户及其所有库或者表权限,delete只删除用户,保留权限.后续创建同名用户,则权限会继承。
mysql -uroot -pAbcd@1234
drop user '用户名'@'主机名';
delete from user where user='用户名' and host='主机名';
重置root密码
在配置文件/etc/my.cnf中[mysqld]后面任意一行添加skip-grant-tables用来跳过密码验证的过程,并重启mysql服务
echo "skip-grant-tables" >> /etc/my.cnf
systemctl restart mysqld
免密登录
mysql -uroot
清空root密码并退出
use mysql;
update user set authentication_string='' where user='root';
exit
注释掉或删除配置文件中skip-grant-tables并重启mysql服务(重申一遍,备份是个好习惯)
sed -i 's/skip-grant-tables/# &/' /etc/my.cnf
systemctl restart mysqld
无密码登录
mysql -uroot
重置root密码为Abcd@1357
flush privileges
ALTER USER 'root'@'%' IDENTIFIED BY 'Abcd@1357';
exit
用数据库自带工具备份数据库
mysqldump -h localhost -P 数据库端口 -u Msyql用户名 -p 密码 要备份的数据库名 > 保存路径及备份的名称(/home/Mysql_bak/my_bak.sql)
#### 忽略一张表 可以使用多个--ignore-table=数据库名.表名来忽略多张表
mysqldump -h localhost -P 数据库端口 -u Msyql用户名 -p 密码 要备份的数据库名 --ignore-table=数据库名.表名 > 保存路径及备份的名称(/home/Mysql_bak/my_bak.sql)