CentOS 7部署MySQL线上环境的完整方案

后端在做上线项目的过程中,是必须要部署生产环境服务器的数据库的,而远程服务器安装又会比本地安装多一些坑(开发远程连接、调整最大连接数等)以及一些简单功能的使用(导入导出数据库),这里就从安装到线上部署的实际用法做一个总结,欢迎补充~

准备

  • 一台装好CentOS 7.X的云服务器
  • 使用SSH连接

安装、初始化过程

1. 添加MySQL Yum Repository

SSH登录服务器后,执行

1
wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm

然后安装该yum repository

1
yum -y install mysql57-community-release-el7-8.noarch.rpm

2. 安装MySQL Server

在yum仓库中搜索可用的社区版

1
yum search mysql-com

选择安装mysql server

1
yum -y install mysql-community-server.x86_64

等待安装完毕后,启动MySQL

1
systemctl start mysqld

在每次yum update时都会检查MySQL的版本更新,但大多数时间我们是不需要的,而且这也会影响yum update的速度,可以在安装后移除该yum源yum -y remove mysql57-community-release-el7-8.noarch

3. 初始配置

首先要登录MySQL服务,我遇到过三种情况

  • root密码为空,直接mysql -u root就可以登录
  • root密码是系统自动生成的,被记录在mysql日志中,可以通过cat /var/log/mysqld.log | grep "password"来获取,会看到日志中有一条temporary password,是一个随机串,然后使用mysql -u root -p,copy这个密码登录

  • 没在日志中找到密码,或者忘记密码:首先在配置文件/etc/my.cnf中的[mysqld]下面加上skip-grant-tables,重启服务,这样可以跳过登录验证,然后登录进MySQL后,重置密码,然后回到配置文件去掉那条危险的配置并重启服务

    1
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
  • 如果是5.7以上的版本,上面这一条就不适用了,要换成这条

    1
    UPDATE mysql.user SET authentication_string=password('your_password') WHERE user='root' AND Host = 'localhost';
  • 在设置密码时,如果提示出现Your password does not satisfy the current policy requirements.,说明MySQL5.7后的版本设置了数据库密码安全强度限制,主要是两个全局设置字段:validate_password_policyvalidate_password_length,分别是密码复杂度和长度设置,在MySQL中运行两条命令

    • set global validate_password_policy=0; 设置密码安全级别为LOW
    • set global validate_password_length=4; 设置密码最短长度为4

4. 远程连接配置

这应该是坑最多的地方了,所以尽量多列几种情况,首先要定位问题

  1. 在乱改MySQL配置前,先检查一下防火墙是否允许开放3306端口,或者可以选择关闭防火墙,iptables和firewalld都检查一下

  2. 确定防火墙开放后,开始

    1
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;

    在password中填写你的连接密码,然后一定要刷新权限命令:

    1
    FLUSH PRIVILEGES
  3. 如果还是不行,那就本地登录mysql,然后user mysql执行select user,host from user,可以查看现有用户可可以连接的主机,如果只有localhost或者127.0.0.1,就需要走第二步授权新用户访问了,可以指定IP也可以用’%’表示所有主机都可以连接

    1
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'your_password' WITH GRANT OPTION;
  4. 如果还是不行的话,就可能你用的是Ubuntu版本的,它会在默认的配置里写上只允许本地连接,要修改/etc/mysql/mysql.conf.d/mysqld.cnf里面有一条bind-address: 127.0.0.1把这条配置注释掉重启服务即可。

其他配置

  • 查询时如果提示查询包过大,需要在my.cnf(windows上是my.ini)上的[mysqld]下面设置max_allowed_packet = 20M
  • 导出sql和csv:导出SQL比较简单:mysqldump -u root -p dbname [tablename] > dbdump.sql;导出excel表格,使用select ... into outfile例如:

    1
    2
    3
    SELECT * FROM article INTO OUTFILE '/tmp/test.csv'
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    LINES TERMINATED BY '\n';
  • 导入SQL:mysql -u root -p dbname < xxxx.sql