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 '<secure-file-priv>/' 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 https://dev.mysql.com/doc/refman/8.0/en/upgrading.html
升级需要变更事项参考 Changes Affecting Upgrades to MySQL 8.0 https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html
安全
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 http://dimitrik.free.fr/blog/archives/2017/10/mysql-performance-80-redesigned-redo-log-readwrite-workloads-scalability.html
基于硬件的专门优化, 对于 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
参考链接 https://mysqlserverteam.com/new-defaults-in-mysql-8-0/
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
监控相关
INNODBSYS 替换为 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.
来源: https://www.qcloud.com/developer/article/1158503