一、MySQL RELEASE FORMAT
MySQL官方发行版本一般就有以下几种(官方下载地址),其实大部分软件的发行版大多数情况下也是以下几种,所以只要明白一个软件的发行方式就OK。另外下载MySQL任何包都应该去官方网站下载,记住一定在官方下载且最好直接下载(不使用第三方工具),并且最好下载完成后经过MD5校验。因为MySQL是开源的,所以使用第三方工具或第三方下载无法保证是安全的。
- mysql-community-server-5.7.21-2.el7.x86_64
# 编译好的RPM包版,跟Linux平台下的RPM包相同,此版本把MySQL的功能一般都独立成个体RPM包,所以在安装时需要什么功能安装什么包即可。另外由于RPM包都是编译好的,所以在安装时要选择好对应的系统平台以及架构平台(基本都是X86架构)。
- mysql-5.7.21.tar.gz
# 源码包版本,也就是没有经过编译的,需要手动编译和安装,灵活性更大可自己定制化。当然越灵活的东西操作起来也就也麻烦。如果说你需要调试MySQL,那么必须自行编译了。
- mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz
# 二进制版本,这是经过官方编译好的,所以在官方下载时需要选择“Linux-Generic”,指在Linux系统下编译好的二进制包。不同于RPM包的是,安装需要自己动手,比如权限更改、文件和目录的迁移、初始化等等。这也是安装MySQL推荐的一个使用方式。
- mysql-5.7.21-1.el7.src.rpm
# 这个版本版本有点特殊,不能够直接使用,是官方提供给用户自己制作成RPM包,这样既可以有RPM包版本的使用便捷,又有源码包的定制化功能。
二、MySQL 5.7 YUM INSTALL
首先从MySQL官方网站下载YUM源。
这里我选择MySQL 5.7的源进行安装MySQL 5.7,手动添加一个YUM源。
1 |
$ cat /etc/yum.repos.d/mysql.repo |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# Enable to use MySQL 5.7 for CentOS 6 [mysql57-community] name=MySQL 5.7 Community Server baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/6/$basearch/ enabled=1 gpgcheck=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql # Enable to use MySQL 5.7 for CentOS 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=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql |
检查一下mysql repo
1 2 |
$ yum repolist enabled | grep mysql mysql57-community MySQL 5.7 Community Server 146 |
安装启动配置MySQL
1 2 |
$ yum install mysql-community-server mysql-community-devel mysql-community-client mysql-community-common $ systemctl start mysqld |
MySQL 5.7密码安全性加强
为了加强安全性,MySQL5.7为root用户随机生成了一个密码,在error log中,关于error log的位置,如果安装的是RPM包,则默认是/var/log/mysqld.log。
命令获取MySQL的临时密码。
1 2 |
$ grep "password" /var/log/mysqld.log 2016-01-19T05:16:36.218234Z 1 [Note] A temporary password is generated for root@localhost: waQ,qR%be2(5 |
用该密码登录到服务端后,必须马上修改密码,不然会报如下错误:
1 2 |
mysql> select user(); ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement. |
如果只是修改为一个简单的密码,会报以下错误:
1 2 |
mysql> ALTER USER USER() IDENTIFIED BY '12345678'; ERROR 1819 (HY000): Your password does not satisfy the current policy requirements |
这个其实与validate_password_policy的值有关,RPM安装默认装载了validate_password这个插件。validate_password_policy有以下取值:
1 2 3 4 |
Policy Tests Performed 0 or LOW Length 1 or MEDIUM Length; numeric, lowercase/uppercase, and special characters 2 or STRONG Length; numeric, lowercase/uppercase, and special characters; dictionary file |
默认是1,即MEDIUM,所以刚开始设置的密码必须符合长度,且必须含有数字,小写或大写字母,特殊字符。有时候,只是为了自己测试,不想密码设置得那么复杂,譬如说,我只想设置root的密码为123456。必须修改两个全局参数:
首先,修改validate_password_policy参数的值。
1 2 |
mysql> set global validate_password_policy=0; Query OK, 0 rows affected (0.00 sec) |
这样,判断密码的标准就基于密码的长度了。这个由validate_password_length参数来决定。
1 2 3 4 5 6 7 |
mysql> select @@validate_password_length; +----------------------------+ | @@validate_password_length | +----------------------------+ | 8 | +----------------------------+ 1 row in set (0.00 sec) |
下面来看看validate_password插件提供的参数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
mysql> show variables like '%validate%'; +--------------------------------------+-------+ | Variable_name | Value | +--------------------------------------+-------+ | query_cache_wlock_invalidate | OFF | | validate_password_check_user_name | OFF | | validate_password_dictionary_file | | | validate_password_length | 8 | | validate_password_mixed_case_count | 1 | | validate_password_number_count | 1 | | validate_password_policy | LOW | | validate_password_special_char_count | 1 | +--------------------------------------+-------+ 8 rows in set (0.00 sec) |
每个参数的意义:
validate_password=ON/OFF/FORCE/FORCE_PLUS_PERMANENT
:决定是否使用该插件(及强制/永久强制使用)。
validate_password_dictionary_file
:插件用于验证密码强度的字典文件路径。
validate_password_check_user_name
:检查用户名。
validate_password_length
:密码最小长度,默认为8,最小为4。
validate_password_mixed_case_count
:密码至少要包含的小写字母个数和大写字母个数。
validate_password_number_count
:密码至少要包含的数字个数。
validate_password_policy
:密码强度检查等级,0/LOW(只检查长度)、1/MEDIUM(检查长度、数字、大小写、特殊字符)、2/STRONG(检查长度、数字、大小写、特殊字符字典文件)。
validate_password_special_char_count
:密码至少要包含的特殊字符数。
如果修改了validate_password_number_count,validate_password_special_char_count,validate_password_mixed_case_count中任何一个值,则validate_password_length将进行动态修改。另外如果你显性指定validate_password_length的值小于4,尽管不会报错,但validate_password_length的值将设为4。
另外,需要注意的一点是从MySQL 5.7–>MySQL 5.7.11版本之间,默认的用户密码过期时间为360天,变量default_password_lifetime。
1 2 3 4 5 6 7 |
mysql> show global variables like 'default_password_lifetime'; +---------------------------+-------+ | Variable_name | Value | +---------------------------+-------+ | default_password_lifetime | 360 | +---------------------------+-------+ 1 row in set (0.00 sec) |
所以如果你使用的是此版本一定需要注意,你可以把此值改为0,表示永不失效。从MySQL 5.7.11开始官方也意识到这是个巨坑,所以就默认把此值改为了0,能使用高稳定版本就是用高文档版本。
三、MySQL 5.7 BINARY INSTALL
1. 前提
在使用二进制安装之前,请确认如果你以前使用操作系统本机软件包管理系统(例如Yum或APT)安装了MySQL,则使用本机二进制文件安装时可能会遇到问题。确保你以前的MySQL安装已完全删除(使用你的软件包管理工具移除),另外也应该检查配置文件,如/etc/my.cnf
或/etc/mysql
目录如果存在,并删除它们。
MySQL依赖于libaio
库,如果此库未在本地安装,则数据目录初始化和后续服务器启动步骤将会失败。例如,在基于Yum的系统上:
1 |
$ yum install libaio |
对于MySQL 5.7.19及更高版本:支持非统一内存访问(NUMA)已添加到二进制Linux版本,该版本现在对libnuma库具有依赖性 ,如果该库尚未安装在系统中,也需要使用系统的软件包管理器安装它。
2. 解压安装MySQL
下载二进制包并解压安装(自行下载当前最新稳定版)
1 2 3 4 |
$ wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz $ tar xf mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz -C /usr/local/ $ cd /usr/local $ ln -sv mysql-5.7.21-linux-glibc2.12-x86_64/ mysql |
在安装目录下,应该会存在如下相关目录:
目录 | 目录的内容 |
---|---|
bin | mysqld服务器,客户端和其他实用程序 |
docs | MySQL手册的Info格式 |
man | Unix Man手册 |
include | 包含头文件 |
lib | 包含库文件 |
share | 错误消息,字典和初始SQL |
support-files | 其他支持文件 |
3. 创建用户及调整权限
下面进行数据目录的创建以及授权
1 2 3 4 5 6 |
$ mkdir /data/mysql/3306/{data,logs/{binlog,relaylog,slowlog},tmp,conf} -p $ groupadd -g 3306 mysql $ useradd -u 3306 -r -g mysql -s /bin/nologin -M mysql $ chown -R mysql:mysql /usr/local/mysql $ chown -R mysql:mysql /data/mysql $ cd /usr/local/mysql/ |
4. 初始化MySQL
基本操作已经完成,下面进行初始化操作。需要注意一点,如果你的服务器上已经存在MySQL配置文件(如:/etc/my.cnf、/etc/my.cnf.d/*.cnf),初始化时如果没有指定会默认去匹配这几个路径的配置文件进行初始化操作,但可通过指定--defaults-file
参数来初始化指定的配置文件。
在MySQL 5.7的初始化操作与MySQL 5.6有点不同了,在MySQL 5.6时使用mysql_install_db工具,在5.7这个工具已经不再推荐使用了。直接使用mysqld来进行初始化操作。下面在MySQL 5.7的版本用MySQL 5.6的初始化方式进行操作一下,看一下会报什么:
1 2 |
$ ./bin/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql/3306/data 2018-03-29 02:45:12 [WARNING] mysql_install_db is deprecated. Please consider switching to mysqld --initialize |
可以看到mysql_install_db is deprecated,说不赞同使用mysql_install_db,推荐使用的方法是:Please consider switching to mysqld --initialize
正确的初始方式如下(先删除datadir目录,目录不为空则会报错):
1 2 3 4 5 6 7 |
$ ./bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql/3306/data 2018-03-29T10:15:45.619115Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2018-03-29T10:15:45.767910Z 0 [Warning] InnoDB: New log files created, LSN=45790 2018-03-29T10:15:45.793101Z 0 [Warning] InnoDB: Creating foreign key constraint system tables. 2018-03-29T10:15:45.846857Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 251b567e-333a-11e8-a4d2-000c2991f031. 2018-03-29T10:15:45.847978Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened. 2018-03-29T10:15:45.848599Z 1 [Note] A temporary password is generated for root@localhost: zJs*fdcSs5Pt |
可以看到我们没有指定初始化的配置文件,如果有默认的就会使用默认的配置文件进行初始化,默认查找配置文件的路径可通过mysqld的帮助信息中查看到。
1 2 3 |
$ /usr/local/mysql/bin/mysqld --help -vv | grep my.cnf /etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf my.cnf, $MYSQL_TCP_PORT, /etc/services, built-in default |
意思就是,如果启动时没有指定配置文件,那么MySQL会以上面这种顺序来查找配置文件并应用,不是只读一个文件哦,是应用所有文件。就是说最后MySQL应用的参数是所有文件的合集,后面的文件参数会覆盖前面的文件参数。这样就会带来一个问题,如果你的服务器上有多个配置文件时,可能会出现你设置的参数总是无法生效,这个时候可能就是出现了参数覆盖。
推荐做法是在初始化之前先创建一个标准配置文件,然后指定配置文件初始化。这里提供一个基本配置文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
[client] socket = /data/mysql/3306/mysql.sock [mysqld] ############################basic settings####################### port = 3306 bind-address = 0.0.0.0 datadir = /data/mysql/3306/data socket = /data/mysql/3306/mysql.sock pid-file = /data/mysql/3306/mysql.pid server-id = 100 user = mysql character_set_server = utf8mb4 skip_name_resolve = 1 max_allowed_packet = 16777216 max_connections = 2000 max_connect_errors = 1000 tmpdir = /data/mysql/3306/tmp tmp_table_size = 67108864 explicit_defaults_for_timestamp = 1 join_buffer_size = 134217728 interactive_timeout = 1800 wait_timeout = 1800 read_buffer_size = 16777216 read_rnd_buffer_size = 33554432 sort_buffer_size = 33554432 key_buffer_size = 256M transaction_isolation = READ-COMMITTED ###########################log settings##################### log-bin = /data/mysql/3306/logs/binlog/mysql-bin log_bin_index = /data/mysql/3306/logs/binlog/mysql-bin.index expire_logs_days = 30 binlog_format = ROW binlog-rows-query-log-events = 1 log_error = /data/mysql/3306/logs/error.log slow_query_log = 1 long_query_time = 2 log_slow_admin_statements = 1 log_slow_slave_statements = 1 slow_query_log_file = /data/mysql/3306/logs/slowlog/slow.log min_examined_row_limit = 100 ##########################innodb settings################################# innodb_buffer_pool_size = 1G innodb_sort_buffer_size = 27108864 innodb_buffer_pool_load_at_startup = 1 innodb_buffer_pool_dump_at_shutdown = 1 innodb_lock_wait_timeout = 5 innodb_flush_method = O_DIRECT innodb_file_format = Barracuda innodb_file_format_max = Barracuda innodb_thread_concurrency = 8 innodb_flush_neighbors = 1 innodb_purge_threads = 4 innodb_large_prefix = 1 innodb_print_all_deadlocks = 1 innodb_strict_mode = 1 innodb_file_per_table = ON innodb_log_file_size = 500M innodb_log_buffer_size = 20M innodb_log_files_in_group = 3 innodb_flush_log_at_trx_commit=2 |
然后可以通过指定配置文件的方式来初始化MySQL(注意参数的顺序不能错,不然会报错)
1 |
$ ./bin/mysqld --defaults-file=/data/mysql/3306/conf/my.cnf --initialize --datadir=/data/mysql/3306/data --user=mysql |
MySQL 5.7初始化完后会生成一个临时的密码,可通过在error日志中通过grep password过滤出来。
另外如果不想初始化就添加密码,可以使用--initialize-insecure
参用参数。
1 |
$ ./bin/mysqld --defaults-file=/data/mysql/3306/conf/my.cnf --initialize-insecure --datadir=/data/mysql/3306/data --user=mysql |
然后MySQL 5.7跟MySQL 5.6不同的地方,5.7需要开启客户端加密连接,会创建一些证书相关的文件。
1 |
$ ./bin/mysql_ssl_rsa_setup |
Tips:从MySQL 5.7.6以上版本开始,客户端默认就是进行加密连接。执行这个程序会在数据目录下生成一些证书文件和开启了MySQL进行SSL认证。具体可以看MySQL 5.7客户端使用加密连接。
5. 设置环境变量
在MySQL安装的bin目录下是MySQL所有的可执行文件,包括客户端、服务端及相关工具。为了方便操作,一般都加入到系统的PATH环境变量,这样我们就可以直接输入对应命令及命令的自动补全。
1 2 3 |
$ echo "export PATH=/usr/local/mysql/bin:$PATH" > /etc/profile.d/mysql.sh $ chmod a+x /etc/profile.d/mysql.sh $ source /etc/profile.d/mysql.sh |
6. 启动MySQL
然后使用mysqld_safe来启动mysqld程序
1 |
$ nohup /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysql/3306/conf/my.cnf & |
使用mysqld_safe工具来启动MySQL是一个常见做法,由mysqld_safe来启动mysqld程序。mysqld_safe增加了一些安全特性,例如当出现错误时重启服务器并向错误日志文件写入运行时间信息,另外还会在启动mysqld服务后继续监控其运行情况,并在其死机时重新启动它等等。
如果启动时不指定配置文件呢?我们可以看一下mysqld的帮助信息。
1 2 3 |
$ /usr/local/mysql/bin/mysqld --help -vv | grep my.cnf /etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf my.cnf, $MYSQL_TCP_PORT, /etc/services, built-in default |
意思就是,如果启动时没有指定配置文件,那么MySQL会以上面这种顺序来查找配置文件并应用,不是只读一个文件哦,是应用所有文件。就是说最后MySQL应用的参数是所有文件的合集,后面的文件参数会覆盖前面的文件参数。这样就会带来一个问题,如果你的服务器上有多个配置文件时,可能会出现你设置的参数总是无法生效,这个时候可能就是出现了参数覆盖。
7. 密码安全
登录时输入的密码是刚刚初始化完的密码:
1 |
$ mysql -uroot -p'zJs*fdcSs5Pt' -S /data/mysql/3306/mysql.sock |
第一次登录,是必须要修改密码才能查看show databases;
1 2 |
mysql> show databases; ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement. |
从上面的信息可以看到,叫我们使用ALTER USER进行修改,下面我们修改一下密码,有关更多MySQL 5.7的用户密码设置可以参考:https://dev.mysql.com/doc/refman/5.7/en/password-expiration-policy.html
1 2 3 4 5 6 7 8 9 10 11 12 13 |
mysql> ALTER USER USER() IDENTIFIED BY '123456'; Query OK, 0 rows affected (0.01 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec) |
这里没有装载validate_password插件,如果想装载,如下操作:
1 |
mysql> INSTALL PLUGIN validate_password SONAME 'validate_password.so'; |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
mysql> show variables like '%validate%'; +--------------------------------------+--------+ | Variable_name | Value | +--------------------------------------+--------+ | query_cache_wlock_invalidate | OFF | | validate_password_dictionary_file | | | validate_password_length | 8 | | validate_password_mixed_case_count | 1 | | validate_password_number_count | 1 | | validate_password_policy | MEDIUM | | validate_password_special_char_count | 1 | +--------------------------------------+--------+ 7 rows in set (0.00 sec) |
MySQL 5.7的mysql.user表已经没有Password这一列了,所以查询用户和密码的方式如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
mysql> select user,host,authentication_string from mysql.user; +-----------+-----------+-------------------------------------------+ | user | host | authentication_string | +-----------+-----------+-------------------------------------------+ | root | localhost | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | | mysql.sys | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | +-----------+-----------+-------------------------------------------+ 2 rows in set (0.00 sec) mysql> select password('123456'); +-------------------------------------------+ | password('123456') | +-------------------------------------------+ | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | +-------------------------------------------+ 1 row in set, 1 warning (0.00 sec) |
如果说初始密码要是忘了或者是不知道,就需要在启动数据库时加上--skip-grant-tables
参数跳过密码先进入到MySQL中,MySQL 8.0开始如果跳过密码启动MySQL会默认也关闭远程访问。然后直接修改表,MySQL5.7修改密码:
1 |
Mysql> update mysql.user set authentication_string=PASSWORD('redhat') where user='root'; |
然后利用修改过的密码进入到数据库。
四、总结
- MySQL 5.7初始方法相比之前的版本都有所不同,做的相对更为安全了,以前版本初始化完root密码是空的,MySQL 5.7则有一个临时密码。
- MySQL 5.7在CREAE TABLE和ALTER TABLE 中都支持增加计算列的方式了,所有可以少用触发器和视图来实现计算列了。
- MySQL 5.7无论在性能还是安全性方面都得到了很大的提升,希望小伙伴们一起好好学习MySQL 5.7的一些新特性。
<参考>
http://dev.mysql.com/doc/refman/5.7/en/installing.html