MySQL Performance-Schema(一) 配置篇

本文详细介绍MySQL的Performance Schema,包括配置表、监控项及统计信息等内容,适用于DBA进行性能诊断分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为了系统的整理MYSQL 性能优化方面的知识,这里收集部分好文章,方便自己学习。

performance-schema



performance-schema最早在MYSQL 5.5中出现,而现在5.6,5.7中performance-Schema又添加了更多的监控项,统计信息也更丰富,越来越有ORACLE-AWR统计信息的赶脚,真乃DBA童鞋进行性能诊断分析的福音。本文主要讲Performance-Schema中的配置表,通过配置表能大概了解performance-schema的全貌,为后续使用和深入理解做准备。

配置表

Performance-Schema中主要有5个配置表,具体如下:

root@performance_schema 06:03:09>show tables like '%setup%';
+----------------------------------------+
| Tables_in_performance_schema (%setup%) |
+----------------------------------------+
| setup_actors |
| setup_consumers |
| setup_instruments |
| setup_objects |
| setup_timers |
+----------------------------------------+

1.setup_actors用于配置user维度的监控,默认情况下监控所有用户线程。
root@performance_schema 05:47:27>select * from setup_actors;
+------+------+------+
| HOST | USER | ROLE |
+------+------+------+
| % | % | % |
+------+------+------+

2.setup_consumers表用于配置事件的消费者类型,即收集的事件最终会写入到哪些统计表中。
root@performance_schema 05:48:16>select * from setup_consumers;
+--------------------------------+---------+
| NAME | ENABLED |
+--------------------------------+---------+
| events_stages_current | NO |
| events_stages_history | NO |
| events_stages_history_long | NO |
| events_statements_current | YES |
| events_statements_history | NO |
| events_statements_history_long | NO |
| events_waits_current | NO |
| events_waits_history | NO |
| events_waits_history_long | NO |
| global_instrumentation | YES |
| thread_instrumentation | YES |
| statements_digest | YES |
+--------------------------------+---------+
可以看到有12个consumer,如果不想关注某些consumer,可以将ENABLED设置为NO,比如events_statements_history_long设置为NO,
则收集事件不会写入到对应的表events_statements_history_long中。12个consumer不是平级的,存在多级层次关系。具体如下表:
global_instrumentation
 |– thread_instrumentation
   |– events_waits_current
     |– events_waits_history
     |– events_waits_history_long
   |– events_stages_current
     |– events_stages_history
     |– events_stages_history_long
   |– events_statements_current
     |– events_statements_history
     |– events_statements_history_long
 |– statements_digest

多层次的consumer遵从一个基本原则,只有上一层次的为YES,才会继续检查该本层为YES or NO。global_instrumentation是最高级别consumer,如果它设置为NO,则所有的consumer都会忽略。如果只打开global_instrumentation,而关闭所有其它子consumer(设置为NO),则只收集全局维度的统计信息,比如xxx_instance表,而不会收集用户维度,语句维度的信息。第二层次的是thread_instrumentation,用户线程维度的统计信息,比如xxx_by_thread表,另外一个是statements_digest,这个用于全局统计SQL-digest的信息。第三层次是语句维度,包括events_waits_current,events_stages_current和events_statements_current,分别用于统计wait,stages和statement信息,第四层次是历史表信息,主要包括xxx_history和xxx_history_long。

3.setup_instruments表用于配置一条条具体的instrument,主要包含4大类:idle,stage/xxx,statement/xxx,wait/xxx.
root@performance_schema 06:25:50>select name,count(*) from setup_instruments group by LEFT(name,5);
+---------------------------------+----------+
| name | count(*) |
+---------------------------------+----------+
| idle | 1 |
| stage/sql/After create | 111 |
| statement/sql/select | 170 |
| wait/synch/mutex/sql/PAGE::lock | 296 |
+---------------------------------+----------+
idle表示socket空闲的时间,stage类表示语句的每个执行阶段的统计,statement类统计语句维度的信息,wait类统计各种等待事件,比如IO,mutux,spin_lock,condition等。从上表统计结果来看,可以基本看到每类的instrument数目,stage包含111个,statement包含170个,wait包含296个。

4.setup_objects表用于配置监控对象,默认情况下所有mysql,performance_schema和information_schema中的表都不监控。而其它DB的所有表都监控。

root@performance_schema 06:25:55>select * from setup_objects;
+-------------+--------------------+-------------+---------+-------+
| OBJECT_TYPE | OBJECT_SCHEMA | OBJECT_NAME | ENABLED | TIMED |
+-------------+--------------------+-------------+---------+-------+
| TABLE | mysql | % | NO | NO |
| TABLE | performance_schema | % | NO | NO |
| TABLE | information_schema | % | NO | NO |
| TABLE | % | % | YES | YES |
+-------------+--------------------+-------------+---------+-------+

5.setup_timers表用于配置每种类型指令的统计时间单位。MICROSECOND表示统计单位是微妙,CYCLE表示统计单位是时钟周期,时间度量与CPU的主频有关,NANOSECOND表示统计单位是纳秒,关于每种类型的具体含义,可以参考performance_timer这个表。由于wait类包含的都是等待事件,单个SQL调用次数比较多,因此选择代价最小的度量单位cycle。但无论采用哪种度量单位,最终统计表中统计的时间都会装换到皮秒。

root@performance_schema 06:29:50>select * from setup_timers;
+-----------+-------------+
| NAME | TIMER_NAME |
+-----------+-------------+
| idle | MICROSECOND |
| wait | CYCLE |
| stage | NANOSECOND |
| statement | NANOSECOND |
+-----------+-------------+

配置方式

      默认情况下,setup_instruments表只打开了statement和wait/io部分的指令,setup_consumer表中很多consumer也没有打开。为了打开需要的选项,可以通过update语句直接修改配置表,并且修改后可以立即生效,但这种方式必需得启动服务器后才可以修改,并且无法持久化,重启后,又得重新设置一遍。从5.6.4开始提供了my.cnf的配置方式,格式如下:

1.设置采集的instrument
performance_schema_instrument='instrument_name=value'
(1)打开wait类型的指令
performance_schema_instrument='wait/%'
(2)打开所有指令
performance_schema_instrument='%=on'

2.设置consumer
performance_schema_consumer_xxx=value
(1)打开 events_waits_history consumer

performance_schema_consumer_events_waits_current=on

performance_schema_consumer_events_waits_history=on

这里要注意consumer的层次关系, events_waits_history处于第4层,因此设置它时,要确保events_statements_current,thread_instrumentation和global_instrumentation的ENABLED状态都为YES,才能生效。由于默认thread_instrumentation和global_instrumentation都是YES,因此只需要显示设置events_waits_current和events_waits_current即可。

3.设置统计表大小
所有的performance_schema表均采用PERFORMANCE_SCHEMA存储引擎,表中的所有数据只存在内存,表的大小在系统初始化时已经
固定好,因此占用的内存是一定的。可以通过配置来定制具体每个表的记录数。
performance_schema_events_waits_history_size=20
performance_schema_events_waits_history_long_size=15000



转载自: http://www.cnblogs.com/cchust/p/5022148.html


<think>我们正在处理MySQL安装或升级过程中出现的模式设置错误(setup schema error)问题。根据用户提供的引用信息,特别是引用[3]中的错误信息,我们可以推断出两个关键错误: 1. `mysql :Native table 'performance_schema'.'cond_instances' has the wrong structure.` 2. `ERROR 1813 (HY000): Tablespace for table '`mysql`.`gtid_slave_pos`' exists. Please DISCARD the table space before IMPORT.` 这些错误通常发生在MySQL升级或初始化过程中,表明系统表的结构与当前MySQL版本不匹配,或者表空间已经存在导致冲突。 ### 问题分析 1. **performance_schema表结构错误**:这可能是由于升级MySQL后没有正确升级系统表,或者旧的系统表残留与新版本不兼容。 2. **gtid_slave_pos表空间已存在**:这表示在初始化或升级过程中,系统尝试创建`mysql.gtid_slave_pos`表,但发现该表的数据文件(表空间)已经存在,因此需要先丢弃表空间再导入。 ### 解决方案 #### 步骤1: 备份数据 在进行任何修复操作前,请务必备份整个MySQL数据目录(通常是`/var/lib/mysql`或用户指定的数据目录,如引用[2]中的`/data/mysql/data`)和配置文件(如`my.cnf`)。 #### 步骤2: 尝试自动升级 MySQL在启动时会自动检测系统表是否需要升级。如果是因为版本升级导致的,可以尝试运行`mysql_upgrade`工具(注意:在MySQL 8.0中,该工具已被整合到服务器启动过程中,但在某些情况下仍可能需要手动执行)。 对于MySQL 8.0,通常的步骤是: 1. 停止MySQL服务。 2. 启动MySQL服务器,它会自动执行升级步骤(如果检测到需要升级)。 3. 查看错误日志(如引用[2]中提到的`log-error=/data/mysql/mysql_error.log`)以确认升级是否成功。 如果自动升级失败,则进入手动修复步骤。 #### 步骤3: 手动修复系统表 针对`performance_schema`表结构错误,可以尝试以下步骤: 1. 停止MySQL服务。 2. 删除`performance_schema`数据库的所有文件(位于数据目录下的`performance_schema`文件夹)。注意:这些表是系统表,删除后MySQL会在下次启动时重新创建。 3. 启动MySQL服务,让服务器重新创建这些系统表。 针对`gtid_slave_pos`表空间已存在的错误,可以按照错误提示丢弃表空间再导入: 1. 连接到MySQL服务器(可能需要使用`--skip-grant-tables`模式启动,如果无法正常启动的话)。 2. 执行以下SQL命令: ```sql USE mysql; ALTER TABLE gtid_slave_pos DISCARD TABLESPACE; ``` 3. 退出MySQL,然后正常启动MySQL服务(如果之前是安全模式启动,现在改为正常启动)。服务器应该会重新创建该表的表空间。 但是,请注意:`gtid_slave_pos`表是用于复制中记录GTID位置的系统表。如果丢弃表空间,该表的数据将会丢失。如果该表中有重要数据(比如复制信息),则需要从其他途径恢复(如备份)。在初始化或升级过程中,通常该表还没有重要数据,所以可以安全丢弃。 #### 步骤4: 重新初始化(作为最后手段) 如果上述步骤无法解决问题,可能需要考虑重新初始化MySQL数据目录。但请注意,这将删除所有数据,因此只适用于新安装或没有重要数据的情况。 重新初始化步骤(参考引用[2]): 1. 停止MySQL服务。 2. 备份并删除数据目录(如`/data/mysql/data`)。 3. 重新创建数据目录并设置正确的权限: ```bash mkdir -p /data/mysql/data chown -R mysql:mysql /data/mysql/data ``` 4. 使用`mysqld --initialize`命令初始化数据目录(如引用[2]所示),记录生成的临时密码。 5. 启动MySQL服务,并使用临时密码登录,然后修改密码。 ### 注意事项 - 在操作过程中,请确保MySQL配置文件(如`my.cnf`)中的设置正确,特别是数据目录、套接字文件路径等。 - 如果之前有数据,重新初始化会导致数据丢失,所以务必先备份。 - 对于生产环境,建议在测试环境中验证修复步骤。 ### 引用说明 在引用[2]中,提到了初始化MySQL数据目录并生成临时密码的步骤,这对于重新初始化数据目录非常重要。引用[3]提供了具体的错误信息,帮助我们定位问题。引用[4]展示了配置文件`my.cnf`的示例,确保配置正确。 以上步骤应能解决MySQL设置模式时遇到的错误。 §§相关问题§§ 1. 如何安全升级MySQL版本以避免系统表错误? 2. MySQL数据目录的结构是怎样的? 3. 在无法启动MySQL服务时,如何重置root密码? 4. 如何配置MySQL的二进制日志和复制功能?</think>### MySQL 设置模式错误排查指南 当遇到 MySQL 的 `setup schema error`(模式设置错误)时,通常由系统表结构不兼容或升级残留问题导致。以下是分步解决方案: #### 1. **核心错误分析** 根据引用[3]的报错信息: ```bash ERROR 1813 (HY000): Tablespace for table '`mysql`.`gtid_slave_pos`' exists. Native table 'performance_schema'.'cond_instances' has the wrong structure ``` 这表示: - `gtid_slave_pos` 表空间已存在但结构不兼容(常见于 MySQL 5.7→8.0 升级) - `performance_schema` 系统表结构损坏 #### 2. **解决方案步骤** **步骤1:清理冲突表空间** ```sql -- 登录MySQL(使用安全模式启动) ALTER TABLE mysql.gtid_slave_pos DISCARD TABLESPACE; -- 删除冲突表空间[^3] ``` **步骤2:重建系统表** ```bash # 停止MySQL服务 systemctl stop mysqld # 备份数据目录(重要!) cp -r /var/lib/mysql /backup/mysql_bak # 删除损坏的系统表 rm -f /var/lib/mysql/mysql/gtid_slave_pos.* rm -rf /var/lib/mysql/performance_schema/* # 重新初始化系统库(保持用户数据完整) mysqld --initialize-insecure --user=mysql --datadir=/var/lib/mysql ``` > 注:`--initialize-insecure` 会重置系统表但保留用户创建的数据库[^2] **步骤3:修复权限** ```bash chown -R mysql:mysql /var/lib/mysql chmod 750 /var/lib/mysql ``` **步骤4:检查配置文件** 确保 `my.cnf` 包含关键配置(参考引用[4]): ```ini [mysqld] datadir=/var/lib/mysql log-error=/var/log/mysql/error.log # 错误日志路径必须存在 server_id=1 # 主从复制必需 character-set-server=utf8 # 字符集设置 ``` #### 3. **验证修复** ```bash # 启动服务 systemctl start mysqld # 检查错误日志 tail -f /var/log/mysql/error.log # 确认无结构错误[^3] ``` #### 4. **高级修复(当基础步骤无效时)** ```sql --MySQL命令行中重建performance_schema DROP SCHEMA performance_schema; CREATE SCHEMA performance_schema; USE performance_schema; SOURCE /usr/share/mysql/performance_schema.sql; -- 路径根据安装目录调整 ``` > ⚠️ **注意事项**: > 1. 操作前务必备份数据(`mysqldump` 或物理备份) > 2. 确保 MySQL 版本与配置文件兼容(8.0+ 需移除废弃参数) > 3. 如遇权限问题,检查 SELinux/AppArmor 状态 ### 典型错误场景分析 | 错误类型 | 原因 | 解决方案 | |---------|------|---------| | 表空间已存在 | 升级残留或异常中断 | `DISCARD TABLESPACE` [^3] | | 系统表结构错误 | 版本不兼容或文件损坏 | 重建系统表 | | 字符集冲突 | 配置缺失或升级未完成 | 检查 `my.cnf` 字符集设置[^4] | 通过以上步骤,90% 的模式设置错误可被解决。若问题持续,建议检查磁盘完整性(`fsck`)和内存状态(`memtester`),硬件故障也可能导致表结构异常[^5]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值