在线安装

引用:他人博客MySQL官网

yum仓库:下载MySQL Yum存储库

CentOS 7的默认yum仓库中并没有MySQL5.7,我们需要手动添加,好在MySQL官方提供了仓库的地址,所以我们能够比较简单地安装MySQL。

本文我们将介绍CentOS 7下MySQL5.7的安装。

添加MySQL5.7仓库

1
2
3
# 地址来源于下载yum存储库时“No thanks, just start my download.”的地址

rpm -ivh https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

确认MySQL仓库成功添加

1
2
3
4
5
6
7
yum repolist all | grep mysql | grep enabled


# 如果展示像下面,则表示成功添加仓库:
mysql-connectors-community/x86_64 MySQL Connectors Community enabled: 51
mysql-tools-community/x86_64 MySQL Tools Community enabled: 63
mysql57-community/x86_64 MySQL 5.7 Community Server enabled: 267

开始安装MySQL5.7

这个过程用时较久(取决于你的网速)

1
yum -y install mysql-community-server

启动MySQL

  1. 启动

    1
    systemctl start mysqld
  2. 设置系统启动时自动启动

    1
    systemctl enable mysqld
  3. 查看启动状态

    1
    systemctl status mysqld

MySQL的安全设置

CentOS上的root默认密码可以在文件/var/log/mysqld.log找到,通过下面命令可以打印出来

1
2
# 该命令只能查询默认的初始密码(如果修改了密码,并不能查询到更改后的密码)
cat /var/log/mysqld.log | grep -i 'temporary password'

执行下面命令进行安全设置,这个命令会进行设置root密码设置,移除匿名用户,禁止root用户远程连接等

1
mysql_secure_installation

MySQL5.7初始化密码报错

报错信息:ERROR 1820 (HY000): You must reset your password using ALTER USER statement before

  1. mysql5.6是密码为空直接进入数据库的,但是mysql5.7就需要初始密码

    1
    cat /var/log/mysqld.log | grep -i 'temporary password'

  2. 然后执行 mysql -uroot -p ,输入上面的到的密码进入,用该密码登录后,必须马上修改新的密码,不然会报如下错误:

    1
    use mysql;

  3. 如果你想要设置一个简单的测试密码的话,比如设置为777888,会提示这个错误,报错的意思就是你的密码不符合要求

    1
    alter user 'root'@'localhost' identified by '777888';

  4. 这个其实与validate_password_policy的值有关

    validate_password_policy有以下取值:

    默认是1,即MEDIUM,所以刚开始设置的密码必须符合长度,且必须含有数字,小写或大写字母,特殊字符
    有时候,只是为了自己测试,不想密码设置得那么复杂,譬如说,我只想设置root的密码为777888
    必须修改两个全局参数:

    首先,修改validate_password_policy参数的值

    1
    2
    mysql> set global validate_password_policy=0;
    Query OK, 0 rows affected (0.00 sec)

    validate_password_length(密码长度)参数默认为8,我们修改为1

    1
    2
    mysql> set global validate_password_length=1;
    Query OK, 0 rows affected (0.00 sec)
  5. 完成之后再次执行修改密码语句即可成功

    1
    2
    mysql> alter user 'root'@'localhost' identified by '777888';
    Query OK, 0 rows affected (0.00 sec)

CentOS 如何修改MySQL用户root的密码

  1. 用帐号登录mysql

    1
    2
    3
    mysql -uroot -p

    Enter password:# 输入原密码
  2. 改变用户数据库

    1
    2
    3
    4
    5
    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
  3. 修改密码,记得密码要用password()函数进行加密,一定不要忘记!!!

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 5.6版本修改密码
    mysql> update user set password=password('Your new password') where user='root';
    Query OK, 1 row affected (0.04 sec)
    Rows matched: 1 Changed: 1 Warnings: 0

    # 5.7版本下的mysql数据库下已经没有password这个字段了,password字段改成了authentication_string
    mysql> update mysql.user set authentication_string=password('Your new password') where user='root';
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1 Changed: 1 Warnings: 0
  4. 刷新权限表

    1
    2
    mysql> flush privileges;
    Query OK, 0 rows affected (0.00 sec)
  5. 退出MySQL

    1
    2
    mysql> quit
    Bye
  6. 重启MySQL

    1
    systemctl restart mysqld

设置数据库编码为utf8

  1. 打开配置文件

    1
    vim /etc/my.cnf
  2. 在[mysqld],[client],[mysql]节点下添加编码设置(原本就有的替换、没有的追加成下面的内容)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [client]
    default-character-set=utf8

    [mysql]
    default-character-set=utf8

    [mysqld]
    sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES #解释见附录 ***
    collation-server = utf8_unicode_ci
    init-connect='SET NAMES utf8'
    character-set-server = utf8
  3. 重启MySQL即可

    1
    systemctl restart mysqld

离线安装

附录

sql_mode 常用值说明

引用:MySQL sql_mode 说明

官方手册专门有一节介绍 https://dev.mysql.com/doc/refman/5.6/en/sql-mode.html 。 SQL Mode 定义了两个方面:MySQL应支持的SQL语法,以及应该在数据上执行何种确认检查。

SQL语法支持类

  • ONLY_FULL_GROUP_BY 对于GROUP BY聚合操作,如果在SELECT中的列、HAVING或者ORDER BY子句的列,没有在GROUP BY中出现,那么这个SQL是不合法的。是可以理解的,因为不在 group by 的列查出来展示会有矛盾。
    在5.7中默认启用,所以在实施5.6升级到5.7的过程需要注意:

    1
    2
    3
    4
    5
     Expression #1 of SELECT list is not in GROUP BY
    clause and contains nonaggregated column
    '1066export.ebay_order_items.TransactionID' which
    is not functionally dependent on columns in GROUP BY
    clause; this is incompatible with sql_mode=only_full_group_by
  • ANSI_QUOTES 启用 ANSI_QUOTES 后,不能用双引号来引用字符串,因为它被解释为识别符,作用与 一样。设置它以后,update t set f1=”” …`,会报 Unknown column ‘’ in ‘field list 这样的语法错误。

  • PIPES_AS_CONCAT|| 视为字符串的连接操作符而非 或 运算符,这和Oracle数据库是一样的,也和字符串的拼接函数 CONCAT() 相类似。

  • NO_TABLE_OPTIONS 使用 SHOW CREATE TABLE 时不会输出MySQL特有的语法部分,如 ENGINE ,这个在使用 mysqldump 跨DB种类迁移的时候需要考虑。

  • NO_AUTO_CREATE_USER 字面意思不自动创建用户。在给MySQL用户授权时,我们习惯使用 GRANT ... ON ... TO dbuser 顺道一起创建用户。设置该选项后就与oracle操作类似,授权之前必须先建立用户。5.7.7开始也默认了。

数据检查类

  • NO_ZERO_DATE 认为日期 ‘0000-00-00’ 非法,与是否设置后面的严格模式有关。
    1. 如果设置了严格模式,则 NO_ZERO_DATE 自然满足。但如果是 INSERT IGNORE 或 UPDATE IGNORE,’0000-00-00’依然允许且只显示warning
    2. 如果在非严格模式下,设置了NO_ZERO_DATE,效果与上面一样,’0000-00-00’允许但显示warning;如果没有设置NO_ZERO_DATE,no warning,当做完全合法的值。
    3. NO_ZERO_IN_DATE情况与上面类似,不同的是控制日期和天,是否可为 0 ,即 2010-01-00 是否合法。
  • NO_ENGINE_SUBSTITUTION 使用 ALTER TABLECREATE TABLE 指定 ENGINE 时, 需要的存储引擎被禁用或未编译,该如何处理。启用NO_ENGINE_SUBSTITUTION时,那么直接抛出错误;不设置此值时,CREATE用默认的存储引擎替代,ATLER不进行更改,并抛出一个 warning .
  • STRICT_TRANS_TABLES 设置它,表示启用严格模式。
    注意 STRICT_TRANS_TABLES 不是几种策略的组合,单独指 INSERTUPDATE出现少值或无效值该如何处理:
    1. 前面提到的把 ‘’ 传给int,严格模式下非法,若启用非严格模式则变成0,产生一个warning
    2. Out Of Range,变成插入最大边界值
    3. A value is missing when a new row to be inserted does not contain a value for a non-NULL column that has no explicit DEFAULT clause in its definition

上面并没有囊括所有的 SQL Mode,选了几个代表性的,详细还是 看手册

sql_mode一般来说很少去关注它,没有遇到实际问题之前不会去启停上面的条目。我们常设置的 sql_mode 是 ANSISTRICT_TRANS_TABLESTRADITIONAL,ansi和traditional是上面的几种组合。

  • ANSI:更改语法和行为,使其更符合标准SQL
    相当于REAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE
  • TRADITIONAL:更像传统SQL数据库系统,该模式的简单描述是当在列中插入不正确的值时“给出错误而不是警告”。
    相当于 STRICT_TRANS_TABLES, STRICT_ALL_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION
  • ORACLE:相当于 PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER

无论何种mode,产生error之后就意味着单条sql执行失败,对于支持事务的表,则导致当前事务回滚;但如果没有放在事务中执行,或者不支持事务的存储引擎表,则可能导致数据不一致。MySQL认为,相比直接报错终止,数据不一致问题更严重。于是 STRICT_TRANS_TABLES 对非事务表依然尽可能的让写入继续,比如给个”最合理”的默认值或截断。而对于 STRICT_ALL_TABLES,如果是单条更新,则不影响,但如果更新的是多条,第一条成功,后面失败则会出现部分更新。

5.6.6 以后版本默认就是NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,5.5默认为 ‘’ 。