前期的Linux环境检测
1、SELinux和系统防火墙
# 需要把 SELinux 设置为disable,并且重启系统
vi /etc/sysconfig/selinux
SELINUX=disable
# 关闭防火墙
chkconfig --list|grep iptables
chkconfig iptables off
2、将系统的IO调度模式设置为deadline模式
vi /sys/block/sda/queue/scheduler
noop anticipatory deadline[cfg]
# 修改IO的调度器需要在/etc/grub.conf中配置才能永久生效
vi /etc/grub.conf
# 最后一行添加
elevator=deadline
3、swap分区设置
swappiness值的大小对如何使用swap分区有着很大的影响。它有0和100两个极限值,0表示最大限度的使用物理内存,这种行为有可能导致系统内存溢出,100则是积极的使用swap分区,并且把内存上面的数据及时的搬到swap分区里。
一般不建议分配swap,或者分配4GB的空间
# 查看系统的swappiness文件
cat /proc/sys/vm/swappiness
sysctl -a|grep swap
4、文件系统的选择
建议选择xfc文件系统,相比与ext4,更加方便管理,支持动态扩容,删除文件也很方便
5、操作系统的限制
ulimit -a
重要的两个参数是 open files
和 max user processes
open files是当前服务器支持的最大句柄数,也就是单个进程最多可以访问多少个文件句柄(连接过多会导致打不开表或者访问不到表的现象)。
max user processes 在单个服务器上运行多个MySQL实例时,可能会出现创建不了新连接的情况
为了防止以上两种情况的出现,可以修改系统的软硬限制 /etc/security/limits.conf
vi /etc/security/limits.conf
* soft nproc 65535
* hard nproc 65535
* soft nofile 65535
* hard nofile 65535
6、关闭numa
关闭numa有利于更好的分配内存,不需要采取swap的方式来获取内存。关闭方式可以在BIOS、操作系统和数据库启动过程中关闭
numa --interleave=all /usr/local/mysql/bin/mysqld_safe -defaults-file=/etc/my.cnf &
正式的MySQL安装
Linux上安装软件的常见方式
1、源码安装
2、压缩包安装(.tar.gz)
3、编译好的安装包安装(rpm、dpkg等)
4、在线安装(yum)
删除已安装的MySQL
检查mariadb
rpm -qa|grep mariadb
mariadb-server-5.5.60-1.el7_5.x86_64
mariadb-5.5.60-1.el7_5.x86_64
mariadb-libs-5.5.60-1.el7_5.x86_64
如果存在mariadb则删除(yum安装是会覆盖已经存在mariadb)
rpm -e --nodeps mariadb-server
rpm -e --nodeps mariadb
rpm -e --nodeps mariadb-libs
检查mysql
rpm -qa|grep mysql # 存在就删除
1、Yum安装Mysql
step1:添加MySQL Yum Repository
从CentOS 7开始,MariaDB成为Yum源中默认的数据库安装包。也就是说在CentOS 7及以上的系统中使用yum安装MySQL默认安装的会是MariaDB(MySQL的一个分支)。如果想安装官方MySQL版本,需要使用MySQL提供的Yum源。
查看系统版本
cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
选择对应的版本进行下载, https://dev.mysql.com/downloads/repo/yum/
wget https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm
安装下载下来的源
rpm -Uvh mysql80-community-release-el7-3.noarch.rpm
检查是否安装成功
执行成功后会在/etc/yum.repos.d/
目录下生成两个repo文件mysql-community.repo
及 mysql-community-source.repo
step2:选择Mysql版本
yum repolist all | grep mysql
切换版本
1、直接切换版本
yum-config-manager --disable mysql80-community
yum-config-manager --enable mysql57-community
2、直接修改 /etc/yum.repos.d/mysql-community.repo enable=0
表示禁用
# Enable to use MySQL 5.7
[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
[mysql80-community]
name=MySQL 8.0 Community Server
baseurl=http://repo.mysql.com/yum/mysql-8.0-community/el/7/$basearch/
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
修改后再次查看激活的mysql版本,发现5.7版本已经被激活
yum repolist all | grep mysql
mysql55-community/x86_64 MySQL 5.5 Community Server disabled
mysql55-community-source MySQL 5.5 Community Server - disabled
mysql56-community/x86_64 MySQL 5.6 Community Server disabled
mysql56-community-source MySQL 5.6 Community Server - disabled
mysql57-community/x86_64 MySQL 5.7 Community Server enabled: 404
mysql57-community-source MySQL 5.7 Community Server - disabled
!mysql80-community/x86_64 MySQL 8.0 Community Server disabled
mysql80-community-source MySQL 8.0 Community Server - disabled
step3:安装MySQL
yum -y install mysql-community-server
该命令会安装MySQL服务器 (mysql-community-server) 及其所需的依赖、相关组件,包括mysql-community-client、mysql-community-common、mysql-community-libs等
step4:启动MySQL
# 启动 状态 停止 重启mysql服务
systemctl start/status/stop/restart mysqld.service
# 查看初始密码,初始用户是root@localhost,密码存放在日志文件中
grep 'temporary password' /var/logs/mysqld.log
# 修改默认密码
mysql -uroot -p
# 输入密码登录之后,进入修改密码,如果密码过于简单,可以修改密码策略
# 修改密码默认策略 validate_password_policy
validate_password_policy=0 #只校验密码长度,只要长度跟 validate_password_length一样即可,默认长度是8位
validate_password_policy=1 #这个时候首先要满足的是validate_password_policy=0时的验证要求。然后现去验证密码中的数字、大小写、特殊字符个数。这些又分别由validate_password_number_count,validate_password_mixed_case_count,validate_password_special_char_count 这几个参数来控制。
validate_password_policy=2 # 这个时候必须先满足0,1的要求,然后它还追加了一个,对于密码中任意连续4个(或4个让上)字符不得是字典中的单词(validate_password_dictionary_file)
# 关闭密码校验
vi /etc/my.cnf
# 添加以下配置,并重启mysql服务
validate_password=OFF
# 重置密码
alter user root@localhost identified by 'password';
允许root用户远程访问
# 进入MySQL进行授权
grant all privileges on *.* to 'root'@'%' identified by 'password' with grant option;
设置编码
show variables like 'character%';
vi /etc/my.cnf
[mysqld]
character_set_server=utf8
init-connect='SET NAMES utf8'
设置开机自启动
systemctl enable mysqld
systemctl daemon-reload
2、使用RPM包安装MySQL
RPM包下载地址: https://downloads.mysql.com/archives/community/ 选择合适的版本
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar
解压
tar -zxvf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar
解压后,需要安装的RMP包主要以下4个。也可以单独的下载以下的RPM包进行安装
mysql-community-libs-5.7.28-1.el7.x86_64.rpm
mysql-community-common-5.7.28-1.el7.x86_64.rpm
mysql-community-client-5.7.28-1.el7.x86_64.rpm
mysql-community-server-5.7.28-1.el7.x86_64.rpm
各rpm包是有依赖关系的,所以需要按照一定顺序进行安装,安装期间如果提示缺少哪些依赖也要先安装相应的包
rpm -ivh mysql-community-common-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm
还有一种简单的方式,可以自动处理各个包之间的依赖关系并自动下载缺少的依赖:
yum install mysql-community-{server,client,common,libs}-*
注意:上面的yum install
命令需要在tar解压之后的各个rpm包所在目录内执行,否则就变成yum方式安装了,需要配置MySQL的yum源并且速度很慢,还要当前机器支持外网访问
3、使用压缩包进行安装
下载对应的 tar 包: https://dev.mysql.com/downloads/mysql/
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz
step1:安装mysql依赖库
MySQL依赖libaio库,如果没有先安装一下
yum -y install libaio
step2:创建mysql用户
不需要登录的一个系统账号,启动MySQL服务时会使用该账号
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
step3:解压配置
cd /usr/local/mysql
tar -zxvf mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz
# 初始化
bin/mysqld --initialize --user=mysql
如果初始化出现以下错误
error while loading shared libraries: libnuma.so.1: cannot open shared object file: No such file or directory
是因为libnuma没有安装(或者默认安装的是32位),我们这里需要64位的
yum -y install numactl.x86_64
初始化完成后会有一行日志显示出临时密码。
CentOS安装MySQL8
与上面使用yum安装MySQL一样,我们只需激活MySQL8的版本即可
cat /etc/yum.repos.d/mysql-community.repo
[mysql80-community]
name=MySQL 8.0 Community Server
baseurl=http://repo.mysql.com/yum/mysql-8.0-community/el/7/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
安装MySQL
# 直接执行
dnf install @mysql
# 启动mysql并设置开启自启动
systemctl enable --now mysqld
# 查看mysql状态
systemctl status mysqld
# 运行mysql_secure_installation脚本,设置密码
mysql_secure_installation
设置密码的步骤
[root@docker packet]# mysql_secure_installation
Securing the MySQL server deployment.
# 是否进入密码配置
Press y|Y for Yes, any other key for No: y
There are three levels of password validation policy:
LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
# 设置密码强度 0 1 2,我设置0
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 0
Please set the password for root here.
# 输入两次新密码
New password:
Re-enter new password:
Estimated strength of the password: 50
# 确认是否继续使用提供的密码
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
# 是否移除匿名用户
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.
# 是否不允许root远程登陆
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : n
# 是否移除test数据库
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
- Dropping test database...
Success.
- Removing privileges on test database...
Success.
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
# 是否重新载入权限表
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.
All done!
配置远程登陆
本机登录MySQL,将root用户的host字段设为'%',意为接受root所有IP地址的登录请求。
mysql -uroot -p
# input password
use mysql;
update user set host='%' where user='root';
flush privileges;
安装后可能出现的问题
使用root用户启动mysql失败
# 问题
mysqld
2020-07-27T14:26:54.337726Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2020-07-27T14:26:54.353607Z 0 [Note] mysqld (mysqld 5.7.29-log) starting as process 7339 ...
2020-07-27T14:26:54.356757Z 0 [ERROR] Fatal error: Please read "Security" section of the manual to find out how to run mysqld as root!
2020-07-27T14:26:54.356784Z 0 [ERROR] Aborting
2020-07-27T14:26:54.356805Z 0 [Note] Binlog end
2020-07-27T14:26:54.356905Z 0 [Note] mysqld: Shutdown complete
systemctl start mysqld.service
Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details.
问题的根源都是使用root用户安装的mysql,在使用root用户启动时就会报错
解决方法1:
mysqld --user=root start
解决方法2:
# 增加跳过权限表参数
mysqld --skip-grant-tables --skip-networking --user=root &
单个mysql配置文件启动多个mysql实例:
https://dev.mysql.com/doc/refman/8.0/en/using-systemd.html
MySQL使用select into outfile导出报错
select * from t2 into outfile 'root/mysql/blk/temp/t2.sql';
# 错误信息如下
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
错误的原因是: mysql默认配置了导入和导出的文件路线,即 secure-file-priv参数,导入或者导出的文件路径与默认的路径冲突时就会报错
修改的方案也有两种:
1、修改文件的路径
2、修改配置文件
mysql> show variables like '%secure%'\G;
*************************** 1. row ***************************
Variable_name: require_secure_transport
Value: OFF
*************************** 2. row ***************************
Variable_name: secure_auth
Value: ON
*************************** 3. row ***************************
Variable_name: secure_file_priv
Value: /var/lib/mysql-files/
3 rows in set (0.00 sec)
secure_file_priv 参数有三种取值
- null,不允许导入和导出
- /path,指定固定的路径导入和导出
- '', 不对mysql的导入和导出做限制