作者介绍:朱强,腾讯云数据库高级工程师,主要负责腾讯云数据库MySQL的开发和运营,曾就职于华为和网宿,在存储、文件系统开发有丰富经验。
MySQL 8.0.11从4月中旬发布GA版本。
本文主要从备份恢复,版本升级,安全,性能,可靠性,监控,易用性,增减功能几个方面来观察MySQL 8.0版本的一些变更
备份和恢复
备份方法
- MySQL Enterprise Backup 支持对整个实例,多个databases,tables进行物理备份(全量,增量,压缩)。对innodb的table支持热备。
- mysqldump 逻辑备份,对innodb支持无锁( --single-transaction ) 在线备份
- 拷贝table files方式。 需要加"flush tables tbl_list with read lock"加读锁,并flush保证数据落盘
- 导出为文件。select * into outfile '
/' form table; 或者mysqldump -tab
导入方式为load data infile filepath或者mysqlimport - 使用binlog做增量备份
- 使用slave节点复制
- 使用本地快照方式备份(先加FTWRL锁,执行快照,unlock tables)
文件系统快照方式
支持(需要agent支持加入FTWRL锁,并在备份结束后unlock tables)
mysqldump
支持
xtrabackup
暂不支持
Error: Unsupported server version: '8.0.11'.
安装xtrabackup24版本
#yum install percona-xtrabackup-24
#innobackupex /home/backup/
Error: Unsupported server version: '8.0.11'.
遇到的问题
Failed to connect to MySQL server: Authentication plugin 'caching_sha2_password' cannot be loaded:
/usr/lib/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory.
mysql> select host,user,plugin from mysql.user;
+---------------+------------------+-----------------------+
| host | user | plugin |
+---------------+------------------+-----------------------+
| % | pmm | mysql_native_password |
| % | root | caching_sha2_password |
mysql> alter user 'root'@'%' IDENTIFIED WITH mysql_native_password by 'passssss';
Query OK, 0 rows affected (0.07 sec)
mysql> select host,user,plugin from mysql.user;
+---------------+------------------+-----------------------+
| host | user | plugin |
+---------------+------------------+-----------------------+
| % | pmm | mysql_native_password |
| % | root | mysql_native_password |
复制
配置复制方式同之前的方式。
默认参数有变更
- log_bin 从off变为on。 默认开启binlog
- log-slave-updates 从off变为on,默认从节点也要记录日志(gtid强制要求从开启binlog,也是MGR特性强制要求)
- master-info-repository 由 file 变为 table (InnoDB )增强数据可靠性
- relay-log-info-repository 由 file 变为 table 增强数据可靠性
版本升级
升级限制
- 支持MySQL5.7升级到MySQL8.0(限制条件从GA版本到GA版本升级,比如MySQL 5.7 GA release (5.7.9 or higher),到
MySQL 8.0.11 (2018-04-19, General Availability)) - 不支持MySQL5.6到MySQL 8.0
升级方式
- 通过yum replace实现in-place升级版本
参考:Upgrading MySQL
升级需要变更事项参考 Changes Affecting Upgrades to MySQL 8.0
安全
OpenSSL的改进,新的默认验证方式,SQL角色权限,分解super权限,密码强度提升等等
修改默认的atuh plugin
默认auth plugin从mysql_native_password转为caching_sha2_password。这个需要对应的driver也要做修改,或者直接在server端参数default-authentication-plugin=mysql_native_password改为默认的方式。
caching_sha2_password采用sha1增强安全性,caching提升性能。
默认使用OpenSSL lib来完成加密和解密功能
默认加密存储redo和undo log
redo log使用参数 innodb_redo_log_encrypt 开启和关闭加密(默认关闭)
undo log使用innodb_undo_log_encrypt开关控制
增加sql role功能
role为特定权限集合,目的是简化用户访问权限管理。可以为用户授予角色,授予角色权限,创建角色,删除角色以及决定会话期间适用的角色。
比如 下面创建一个只读的role,创建用户时指定一个特殊的用户角色,不用去细化每个权限
mysql> CREATE ROLE reader_user_role;
mysql> GRANT SELECT ON mydb.* to reader_user;
mysql> CREATE USER foouser IDENTIFIED BY 'password';
mysql> GRANT reader_user_role TO foouser;
对super权限做细粒度的划分
细粒度的划分super权限防止不同的权限做过多的操作。
比如 BINLOG_ADMIN(可以purge binlog), CONNECTION_ADMIN(设置read_only), and ROLE_ADMIN
password rotate policy
可以设置密码的过期策略(Expiration Policy)和重用周期(reuse policy).用于增强密码的安全性。
过期配置: default_password_lifetime=180 为6个月
重用周期:
password_history=6 禁止使用过去的6个已用的密码
password_reuse_interval=365 在365天的周期内禁止使用之前使用过的6个密码
性能
扩展读写负载
mysql5.7在只读负载上做了很多优化,mysql8在读写负载上都做了优化。优化点主要是通过重新设计了innodb的redo日志写入方案(基于event-driven模式,使用无锁用户态线程,独立的后台线程刷redo日志)
详细参考here
基于硬件的专门优化,对于hot rows优化
hot rows:当多个事务等待表内的同一行的锁,这样的row为hot row。
创建和管理资源组
创建和管理资源组,用于调优不同负载压力的请求调度到不同的CPU上。比如对于当前对于查询特别长的请求可以调度到独立的资源组内执行。如下:
SET RESOURCE GROUP <GROUP_NAME>; ##对这个session下的query请求在group_name下的资源组内执行
可靠性
mysql8通过以下手段增强可靠性
- 元数据存入innodb中(事务安全)
比如: mysql5.7的mysql.user表使用MyISAM引擎。 mysql8则为InnoDB - server和innodb使用同一个数据字典。防止数据不一致的情况
- 支持原子性DDL
监控优化
- 使用innodb引擎存放information_schema的表空间和数据。增加100多个索引支持performance schema表空间的访问。
- error logging 格式优化
- 直方图展示Performance Schema statement,DBA可以对数据分布进行统计方便优化
比如performance_schema增加 下面两张表
events_statements_histogram_by_digest: details about latency related to schema and query digest
events_statements_histogram_global: global latency summary across all schemas and queries
展示方式
mysql> CALL sys.ps_statement_avg_latency_histogram()\G;
易用性
-
不可见索引(invisible index)
MySQL 8.0增加了切换索引可见性(可见/不可见)的功能。优化器在执行查询执行计划时不会考虑不可见索引。
这样做的目的是让DBA / DevOp确定是否可以删除索引。 mysql> show global variables like 'innodb_buffer_pool_size';
+-------------------------+-----------+
| Variable_name | Value |
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-----------+mysql> set persist innodb_buffer_pool_size=134217728*2;
重启mysql-server服务
mysql> show global variables like 'innodb_buffer_pool_size';
+-------------------------+-----------+
| Variable_name | Value |
+-------------------------+-----------+
| innodb_buffer_pool_size | 268435456 |
+-------------------------+-----------+ -
弹性管理undo tablespace
- 可以灵活管理undo log。不再跟system tablespace一起存放。参数:innodb_undo_tablespaces
- undo log可以独立存放在更快速的存储空间上, 配置innodb_undo_directory
-
persist variables
支持持久化保存动态配置参数,不用更改my.cnf内的配置。 -
远程管理
mysql> restart; 远程重启mysql-server -
rename tablespace(DDL) 和 rename colume(DDL)
支持语法: ALTER TABLESPACE s1 RENAME TO s2
支持语法: ALTER TABLE ... RENAME COLUMN old_name TO new_name
其他特性
变更的默认参数
比如 server和replication相关的一些参数
- character_set_server 从latin1转为utf8mb4 支持emoji
- max_allowed_packet 4MB 到 64MB
- log_error_verbosity 从Notice转为Warning
- log_bin 从off转为on默认开启binlog
- log-slave-updates 从off转为on
参考链接
mysql8 去除和变更的功能
不再支持的一些功能
- 不再支持query cache。 have_query_cache=NO
同样不支持flush query cache;reset query cache - 删除一批过时的error code
参数替换
- information_schema_stats --> information_schema_stats_expiry
- tx_isolation --> transaction_isolation
- tx_read_only --> transaction_read_only
- log_warnings --> log_error_verbosity
删除的参数
- ignore-db-dir
- sync_frm 因为不再使用.frm格式
- secure_auth
- multi_range_count
- sql_log_bin
- date_format, datetime_format, time_format, and max_tmp_tables
监控相关
- INNODB_SYS 替换为 INNODB__
- setup_timers 替换为 performance_timers
- INFORMATION_SCHEMA中不再有下面这些表:
GLOBAL_VARIABLES, SESSION_VARIABLES, GLOBAL_STATUS, SESSION_STATUS - 删除一些状态值:
Slave_heartbeat_period, Slave_last_heartbeat, Slave_received_heartbeats, Slave_retried_transactions, Slave_running
不再支持的sql语法
- 不支持\N代替NULL,推荐使用NULL
- PROCEDURE ANALYSE()
- 加密相关的一些函数(ENCODE() and DECODE(), ENCRYPT() )
删除的功能
- 不再支持mysql_install_db,使用mysqld --initialize
- 删除--partition 和 --skip-partition两个选项。只有使用InnoDB引擎才能支持对指定table进行分片
带有分片的表,在升级到mysql8需要特殊处理:
删除分片配置: ALTER TABLE ... REMOVE PARTITIONING.
使用Innodb引擎: ALTER TABLE ... ENGINE=INNODB.
更多前沿数据库技术和案例分享,请关注我们的微信号:腾讯云数据库CDB
参考:
https://dev.mysql.com/doc/relnotes/mysql/8.0/en/
http://mysqlserverteam.com/the-mysql-8-0-0-milestone-release-is-available/