MySQL5.7的新特性
MySQL 5.7版本据说已经在了很大的性能提升以及做得更加安全了,想了解更多MySQL 5.7的新特性可以参考我转载叶金荣老师的MySQL 5.7的新特性说明。这里我简单演示一下MySQL 5.7的安装已经一些新特性的使用,希望大家能一起进去,一起探讨技术。
MySQL 5.7的官方下载地址:http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.10-linux-glibc2.5-x86_64.tar.gz
下面简单介绍一下安装:
[root@MySQL soft]# tar xf mysql-5.7.-linux-glibc2.-x86_64.tar.gz -C /data/service/
[root@MySQL soft]# cd /data/service/
[root@MySQL service]# mv mysql-5.7.-linux-glibc2.-x86_64/ mysql-5.7.
下面进行数据目录的创建以及授权:
[root@MySQL service]# mkdir /data/{mysql3306,mysql3306log} -p
[root@MySQL service]# groupadd mysql
[root@MySQL service]# useradd -r -g mysql mysql
[root@MySQL service]# chown -R mysql:mysql mysql-5.7./
[root@MySQL service]# chown -R mysql:mysql /data/mysql3306*
基本操作已经完成,下面进行初始化操作,在MySQL 5.7的初始化操作与MySQL 5.6有点不同了,下面在MySQL 5.7的版本用MySQL 5.6的初始化方式进行操作一下,让大家看下会报什么错:
[root@MySQL mysql-5.7.]# ./bin/mysql_install_db --user=mysql --datadir=/data/mysql3306
-- :: [WARNING] mysql_install_db is deprecated. Please consider switching to mysqld --initialize
-- :: [ERROR] The bootstrap log isn't empty:
-- :: [ERROR] --21T03::.633658Z [Warning] --bootstrap is deprecated. Please consider using --initialize instead
--21T03::.641584Z [ERROR] Can't read from messagefile '/usr/share/mysql/english/errmsg.sys'
[root@MySQL mysql-5.7.]#
可以看到mysql_install_db is deprecated,说不赞同使用mysql_install_db,推荐使用的方法是:
Please consider switching to mysqld --initialize ,Please consider using --initialize instead
正确的初始方式如下:./bin/mysqld --initialize --user=mysql --basedir=/data/service/mysql-5.7.10/ --datadir=/data/mysql3306,如果datadir目录有文件,则会报以下错:
[root@MySQL mysql-5.7.]# ./bin/mysqld --initialize --user=mysql --basedir=/data/service/mysql-5.7./ --datadir=/data/mysql3306
--21T05::.355999Z [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
--21T05::.357796Z [ERROR] --initialize specified but the data directory has files in it. Aborting.
--21T05::.357814Z [ERROR] Aborting
所以要把data directory文件删除掉再执行,如果删除目录下的文件还是报同样的错,可以试试把目录删除掉,再创建一个,然后授权:
[root@MySQL mysql-5.7.]# ./bin/mysqld --initialize --user=mysql --basedir=/data/service/mysql-5.7./ --datadir=/data/mysql3306
--21T05::.804937Z [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
--21T05::.552899Z [Warning] InnoDB: New log files created, LSN=
--21T05::.816849Z [Warning] InnoDB: Creating foreign key constraint system tables.
--21T05::.883956Z [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: 660686ae-c002-11e5-843e-00163e0217d7.
--21T05::.886131Z [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
--21T05::.887120Z [Note] A temporary password is generated for root@localhost: )vyd3aXj8hhC
MySQL 5.7初始化完后会生成一个临时的密码,A temporary password is generated for root@localhost: )vyd3aXj8hhC 如果想初始化表空间,在后面加上 --innodb_data_file_path=ibdata1:1G:autoextend即可。
启动MySQL 5.7,拷贝support-files/my-default.cnf ./
[root@MySQL mysql-5.7.]# cp support-files/my-default.cnf ./my.cnf
[root@MySQL mysql-5.7.]# chown -R mysql:mysql my.cnf
编辑my.cnf加上基本选项:
[mysqld]
# changes to the binary log between backups.
log_bin # These are commonly set, remove the # and set as required.
basedir = /data/service/mysql-5.7.
datadir = /data/mysql3306
port =
server_id =
socket = /tmp/mysqld.sock
编辑启动脚本:
[root@MySQL mysql-5.7.]# cat start_mysql.sh
#!/bin/bash nohup /data/service/mysql-5.7./bin/mysqld_safe --defaults-file=/data/service/mysql-5.7./my.cnf > /data/service/mysql-5.7./start_stop.log >& &
运行脚本启动 sh start_mysql.sh 。
登录MySQL 5.7,先添加MySQL 5.7的bin路径:
[root@MySQL mysql-5.7.]# cat /etc/profile.d/mysql.sh
export PATH=/data/service/mysql-5.7./bin:$PATH
[root@MySQL mysql-5.7.]# source /etc/profile.d/mysql.sh
登录时输入的密码是刚刚初始化完的密码:
[root@MySQL mysql-5.7.]# mysql -uroot -p')vyd3aXj8hhC' -S /tmp/mysqld.sock
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is
Server version: 5.7.-log Copyright (c) , , Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
第一次登录,是必须要修改密码才能查看show databases;
mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql>
从上面的信息可以看到,叫我们使用ALTER USER进行修改,下面我们修改一下密码,有关更多MySQL 5.7的用户密码设置可以参考:https://dev.mysql.com/doc/refman/5.7/en/password-expiration-policy.html
mysql> ALTER USER USER() IDENTIFIED BY '';
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) mysql>
MySQL 5.7的mysql.user表已经没有password这一列了,所以查询用户和密码的方式如下:
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)
MySQL 5.7支持为表增加计算列
什么叫计算列呢,简单来说就是某一列的值是通过别的列计算得来,例如a列值为1,b列值为2,c列不需要操作手动插入,定义为a + b的结果为c的值,那么c就是计算列,是通过别的列计算得来,下面我们进行例子说明:
在MySQL 5.7之前的版本中,要实现这样的效果要利用触发器来完成,以下是以前的实现过程:
mysql> show create table tb1\G
*************************** 1. row ***************************
Table: tb1
Create Table: CREATE TABLE `tb1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`c1` int(11) DEFAULT NULL,
`c2` int(11) DEFAULT NULL,
`c3` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
1 row in set (0.01 sec) mysql>
创建一个插入的触发器:
mysql> create trigger insert_tb1 before insert on tb1 for each row set new.c3=new.c1+new.c2;
Query OK, 0 rows affected (0.01 sec)
我们插入数据:
mysql> insert into tb1(c1,c2) values (1,2);
Query OK, 1 row affected (0.00 sec) mysql> select * from tb1;
+----+------+------+------+
| id | c1 | c2 | c3 |
+----+------+------+------+
| 1 | 1 | 2 | 3 |
+----+------+------+------+
1 row in set (0.00 sec) mysql>
但如果我们更新了c1或者c2的值,c3是不会变动的,所以我们要加一个update的触发器:
mysql> select * from tb1;
+----+------+------+------+
| id | c1 | c2 | c3 |
+----+------+------+------+
| 1 | 1 | 2 | 3 |
+----+------+------+------+
1 row in set (0.00 sec) mysql> create trigger update_tb1 before update on tb1 for each row set new.c3=new.c1+new.c2;
Query OK, 0 rows affected (0.01 sec) mysql> update tb1 set c1 = 3;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from tb1;
+----+------+------+------+
| id | c1 | c2 | c3 |
+----+------+------+------+
| 1 | 3 | 2 | 5 |
+----+------+------+------+
1 row in set (0.00 sec) mysql>
可以看到,如果想实现计算列,那么就要借助触发器或者视图来实现,但在生产环境中,是不太建议使用触发器或者视图的。下面用MySQL 5.7来实现就变得很简单了。
MySQL 5.7计算列的实现:
在CREAE TABLE和ALTER TABLE 中都支持增加计算列的方式:
col_name data_type [GENERATED ALWAYS] AS (expression)
[VIRTUAL | STORED] [UNIQUE [KEY]] [COMMENT comment]
[NOT NULL | NULL] [[PRIMARY] KEY]
下面我们创建测试表tb2:
mysql> show create table tb2\G
*************************** 1. row ***************************
Table: tb2
Create Table: CREATE TABLE `tb2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`c1` int(11) DEFAULT NULL,
`c2` int(11) DEFAULT NULL,
`c3` int(11) GENERATED ALWAYS AS ((`c1` + `c2`)) VIRTUAL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec) mysql>
插入数据看效果:
mysql> select * from tb2;
Empty set (0.00 sec) mysql> insert into tb2(c1,c2) values (1,2);
Query OK, 1 row affected (0.00 sec) mysql> select * from tb2;
+----+------+------+------+
| id | c1 | c2 | c3 |
+----+------+------+------+
| 1 | 1 | 2 | 3 |
+----+------+------+------+
1 row in set (0.00 sec) mysql>
更新数据看效果:
mysql> update tb2 set c1=10;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from tb2;
+----+------+------+------+
| id | c1 | c2 | c3 |
+----+------+------+------+
| 1 | 10 | 2 | 12 |
+----+------+------+------+
1 row in set (0.00 sec) mysql>
可以看到相当的方便,MySQL 5.7的很多新特性都给我们带来了便利和惊喜^.^
总结:
一、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/binary-installation.html
https://dev.mysql.com/doc/refman/5.7/en/password-expiration-policy.html
http://dev.mysql.com/doc/refman/5.7/en/create-table.html
作者:陆炫志 出处:xuanzhi的博客 http://www.cnblogs.com/xuanzhi201111 您的支持是对博主最大的鼓励,感谢您的认真阅读。本文版权归作者所有,欢迎转载,但请保留该声明。 |
MySQL5.7的新特性的更多相关文章
- MySQL5.6 GTID新特性实践
MySQL5.6 GTID新特性实践 GTID简介 搭建 实验一:如果slave所需要事务对应的GTID在master上已经被purge了 实验二:忽略purged的部分,强行同步 本文将简单介绍基于 ...
- 初试mysql5.7.2新特性:多源复制(MySQL 5.7 multi-source replication)
多源复制和多主复制的区别: 多主复制示意图: 多源复制示意图: 在my.cnf中添加crash safe特性参数:master_info_repository=TABLE;relay_log_info ...
- 利用Mysql5.7的新特性实现多机房高可用架构【转】
再牛逼的架构也敌不过挖掘机,无论单机房内你的架构多么的高可用,多么的完善,当挖掘机挖下去那一瞬间,都是扯蛋,楼主所在的公司也被挖掘机挖断过光纤.电力线. 为什么大家都在谈论服务冗余,缓存击穿等高可用时 ...
- MySQL5.6新特性Index conditontion pushdow
index condition pushdown是MySQL5.6的新特性,主要是对MySQL索引使用的优化. Index condition push简称ICP,索引条件下推,将索引条件从serve ...
- [MySQL5.6 新特性] 全局事务标示符(GTID)
GTID的全称为 global transaction identifier , 可以翻译为全局事务标示符,GTID在原始master上的事务提交时被创建.GTID需要在全局的主-备拓扑结构中保持唯 ...
- mysql5.1 有什么新特性
本章介绍 新特性和已过时的特性 新特性: 1.分隔 这个特性允许把一个表里的部分数据放入文件系统中,它会根据表的创建规则来存储,一个表的不同部分被存储在不同的物理地址下.不过这个特性对于用户是不可见的 ...
- MySQL5.6 新特性之GTID【转】
转自 MySQL5.6 新特性之GTID - jyzhou - 博客园http://www.cnblogs.com/zhoujinyi/p/4717951.html 背景: MySQL5.6在5.5的 ...
- mysql5.7新特性探究
一.MySql5.7增加的特性 1.MySql服务方面新特性 1) 初始化方式改变 MySql5.7之前版本初始化方式: scripts/mysql_install_db MySql5.7版本初始化方 ...
- MySQL5.7新特性
MySQL5.7介绍 身处 MySQL 这个圈子,能够切身地感受到大家对 MySQL 5.7 的期待和热情,似乎每个人都迫不及待的想要了解.学习和使用 MySQL 5.7.那么,我们不禁要问, MyS ...
随机推荐
- Linux上安装Perl模块的两种方法
Linux/Unix下安装Perl模块有两种方法:手工安装和自动安装.第一种方法是从CPAN上下载 您需要的模块,手工编译.安装.第二种方法是联上internet,使用一个叫做CPAN的模块自动完 ...
- 使用Eclipse Memory Analyzer 进行JAVA内存泄露分析
一,安装 Eclipse Memory Analyzer 在Memory Analyzer的官网找到 update site的地址:
- B树学习总结
1,B树的基本介绍 ①B树,相比于二叉树.红黑树而言,它的特点就是树的高度比其他类型的树要低很多.如何做到低呢?B树中的每个结点的分支数目非常大,即每个结点有很多很多孩子结点.这样,在相同结点数目情况 ...
- .Net并行编程之同步机制
一:Barrier(屏障同步) 二:spinLock(自旋锁) 信号量 一:CountdownEvent 虽然通过Task.WaitAll()方法也可以达到线程同步的目的. 但是Countdown ...
- C#窗口防止闪烁两种方法
public class PaintIncrease { public static void SetDoubleBuffered(object obj) { Type type = obj.GetT ...
- 三、u-boot 的配置-mkconfig 脚本
3.1 mkconfig 脚本 100ask24x0_config : unconfig @$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL ...
- buildroot构建项目(二)--- u-boot 2017.11 建立 2440 开发板
一.准备工作 在建立之前,先需要将下载的u-boot 拷贝一份出来解压,在此工程下进行更改和创建.同时根据前面搜索到的 mini2440开发板所在的版本,下载一份u-boot 拷贝出 mini2440 ...
- JavaScript之Array/数组小结
MDN-Array的属性/方法:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Arr ...
- Python3之网络爬虫<0>初级
由于Python3合并URLib与URLlib2统一为URLlib,Python3将urlopen方法放在了urllib.request对象下. 官方文档:https://docs.python.or ...
- python 线程 event
全局定义了一个“Flag”,如果“Flag”值为 False,那么当程序执行 event.wait 方法时就会阻塞,如果“Flag”值为True,那么执行event.wait 方法时便不再阻塞. cl ...