mysql日常巡检

news2025/4/23 10:10:17

1.查看mysql服务是否异常

systemctl status mysql_3306

查看MySQL进程是否存在

ps -ef | grep mysql

2.连接异常检查
(1)查看是否异常连接

show processlist;  
#或
show full processlist;

(2)查看当前失败连接数

show global status like 'aborted_connects';

(3)查看试图连接到MySQL(不管是否连接成功)的连接数

show status like 'connections';

(4)查看有多少由于客户没有正确关闭连接而死掉的连接数

show global status like 'aborted_clients';

(5)查看最大连接数上限

show variables like '%max_connections%';
show global status like 'max_connections';

(6)查看最大连接数

show global status like 'Max_used_connections';


比较理想的设置是:
Max_used_connections / max_connections * 100% ≈ 85%
最大连接数占上限连接数的85%左右,如果发现比例在10%以下,MySQL服务器连接数上限设置的过高了。

3.存储引擎状态检查
(1)查看默认存储引擎

show engines;

(2)检查InnoDB存储引擎的状态:

SHOW ENGINE INNODB STATUS;

4.mysql日志巡检
(1)查看异常日志路径

SHOW VARIABLES LIKE 'log_error';
tail -200f /mysql/log/3306/host01-error.log 

(2)查看慢查询日志路径

SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'slow_query_log_file';
tail -200f  /mysql/log/3306/host01-query.log 

(3)查询数据库的慢查询日志

SELECT * FROM mysql.slow_log WHERE start_time >= NOW() - INTERVAL 1 DAY ORDER BY start_time DESC;

5.查看数据库基本信息
(1)查看数据库的版本

SELECT VERSION() AS 'MySQL版本';

(2)查看数据库字符集

SHOW VARIABLES LIKE 'character_set_database';

(3)查看数据库当前时间

SELECT NOW() AS '数据库当前时间';

(4)查看MySQL本次启动后的运行时间(单位:秒)

show status like 'uptime';


6.查看数据库数据量
(1)mysql查看所有数据库数据量

select 
table_schema as 'Database_name',
sum(table_rows) as 'rows',
sum(truncate(data_length/1024/1024, 2)) as 'Size_data(MB)',
sum(truncate(index_length/1024/1024, 2)) as 'Size_index(MB)'
from information_schema.tables
group by table_schema
order by sum(data_length) desc, sum(index_length) desc;

(2)mysql查看各个数据库表容量

select 
table_schema as 'Database_name',
table_name as 'table_name',
table_rows as 'rows',
truncate(data_length/1024/1024, 2) as 'Size_data(MB)',
truncate(index_length/1024/1024, 2) as 'Size_index(MB)'
from information_schema.tables
order by data_length desc, index_length desc;

(3)mysql查看指定数据库容量大小

select 
table_schema as 'Database_name',
sum(table_rows) as 'rows',
sum(truncate(data_length/1024/1024, 2)) as 'Size_data(MB)',
sum(truncate(index_length/1024/1024, 2)) as 'Size_index(MB)'
from information_schema.tables
where table_schema = 'mysql';

(4)mysql查看指定数据库表容量

select 
table_schema as 'Database_name',
table_name as 'table_name',
table_rows as 'rows',
truncate(data_length/1024/1024, 2) as 'Size_data(MB)',
truncate(index_length/1024/1024, 2) as 'Size_index(MB)'
from information_schema.tables
where table_schema='mysql'
order by data_length desc, index_length desc;

(5)自增id使用情况

SELECT table_schema , table_name , ENGINE , Auto_increment 
FROM information_schema.TABLES 
WHERE TABLE_SCHEMA NOT IN ("INFORMATION_SCHEMA","PERFORMANCE_SCHEMA", "MYSQL","SYS");

(6)表行数 

SELECT TABLE_SCHEMA , TABLE_NAME , TABLE_ROWS
FROM  information_schema.tables 
WHERE TABLE_SCHEMA not in('information_schema','sys','mysql','performance_schema')
ORDER BY table_rows DESC LIMIT 100;


7.mysql数据库用户巡检
(1)mysql查看所有用户信息

SELECT user, host FROM mysql.user;

(2)查看所有用户信息

SELECT * FROM mysql.user\G

(3)查看指定用户信息

SELECT * FROM mysql.user WHERE user in ('root','repuser')\G
Select_priv:            确定用户是否可以通过SELECT命令选择数据 
Insert_priv:            确定用户是否可以通过INSERT命令插入数据 
Update_priv:            确定用户是否可以通过UPDATE命令修改现有数据 
Delete_priv:            确定用户是否可以通过DELETE命令删除现有数据 
Create_priv:            确定用户是否可以创建新的数据库和表 
Drop_priv:                确定用户是否可以删除现有数据库和表 
Reload_priv:            确定用户是否可以执行刷新和重新加载MySQL所用各种内部缓存的特定命令,包括日志、权限、主机、查询和表 
Shutdown_priv:            确定用户是否可以关闭MySQL服务器,将此权限提供给root账户之外的任何用户时,都应当非常谨慎 
Process_priv:            确定用户是否可以通过SHOW 
File_priv:                确定用户是否可以执行SELECT INTO OUTFILE和LOAD DATA INFILE命令 
Grant_priv:            确定用户是否可以将已经授予给该用户自己的权限再授予其他用户,例如,如果用户可以插入、选择和删除foo数据库中的信息,并且授予了GRANT权限,则该用户就可以将其任何或全部权限授予系统中的任何其他用户 
References_priv:        目前只是某些未来功能的占位符,现在没有作用 
Index_priv:            确定用户是否可以创建和删除表索引 
Alter_priv:            确定用户是否可以重命名和修改表结构 
Show_db_priv:            确定用户是否可以查看服务器上所有数据库的名字,包括用户拥有足够访问权限的数据库,可以考虑对所有用户禁用这个权限,除非有特别不可抗拒的原因 
Super_priv:            确定用户是否可以执行某些强大的管理功能,例如通过KILL命令删除用户进程,使用SET GLOBAL修改全局MySQL变量,执行关于复制和日志的各种命令 
Create_tmp_table_priv:    确定用户是否可以创建临时表 
Lock_tables_priv:        确定用户是否可以使用LOCK 
Execute_priv:            确定用户是否可以执行存储过程,此权限只在MySQL 5.0及更高版本中有意义 
Repl_slave_priv:        确定用户是否可以读取用于维护复制数据库环境的二进制日志文件,此用户位于主系统中,有利于主机和客户机之间的通信 
Repl_client_priv:        确定用户是否可以确定复制从服务器和主服务器的位置 
Create_view_priv:        确定用户是否可以创建视图,此权限只在MySQL 5.0及更高版本中有意义 
Show_view_priv:        确定用户是否可以查看视图或了解视图如何执行,此权限只在MySQL 5.0及更高版本中有意义 Create_routine_priv:确定用户是否可以更改或放弃存储过程和函数,此权限是在MySQL 5.0中引入的 Alter_routine_priv:确定用户是否可以修改或删除存储函数及函数,此权限是在MySQL 5.0中引入的 Create_user_priv:确定用户是否可以执行CREATE 
Event_priv:            确定用户能否创建、修改和删除事件,这个权限是MySQL 5.1.6新增的 
Trigger_priv:            确定用户能否创建和删除触发器,这个权限是MySQL 5.1.6新增的
Create_tablespace_priv: 创建表的空间


8.mysql查看锁
(1)查看表锁
--查看需要等待的表锁数

show global status like 'Table_locks_waited';


--查看立即释放表锁数

show global status like 'Table_locks_immediate';


Table_locks_immediate / Table_locks_waited >5000 建议采用InnoDB引擎,对于高并发写入的应用InnoDB效果会好些。
Table_locks_immediate / Table_locks_waited = 235 MyISAM就足够


(2)行锁

show status like 'InnoDB_row_lock%';
Innodb_row_lock_current_waits        #当前等待锁的行锁数量
Innodb_row_lock_time                #请求行锁总耗时
Innodb_row_lock_time_avg            #请求行锁平均耗时
Innodb_row_lock_time_max            #请求行锁最久耗时
Innodb_row_lock_waits                #行锁发生次数

(3)查询死锁表及查询死锁等待时间

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
SELECT * FROM information_schema.INNODB_LOCK_waits;
MySQL 8.0 
select * from performance_schema.data_locks;
select * from performance_schema.data_lock_waits;

9.临时表/临时文件

show global status like 'created_tmp%';
Created_tmp_disk_tables 创建在磁盘上的临时表的数量
Created_tmp_files       临时文件文件数
Created_tmp_tables      创建的临时表的数量
每次创建临时表,Created_tmp_tables增加,如果是在磁盘上创建临时表,Created_tmp_disk_tables也增加,Created_tmp_files表示MySQL服务创建的,
理想的配置为:
Created_tmp_disk_tables / Created_tmp_tables * 100% <= 25%

10.打开表/文件数

show global status like 'Open_files';
show variables like 'open_files_limit';
比较合适的设置:Open_files / open_files_limit * 100% <= 75%

11.打开表的数量

show global status like '%Open%_table%';
Open_tables                    打开表数量
Opened_tables                表示打开过的表数量
Open_table_definitions         代表当前缓存了多少.frm文件。
Opened_table_definitions    代表自从MySQL启动后,缓存了.frm文件的数量
理想值为:
Open_tables / Opened_tables * 100% >= 85%
Open_tables / table_cache * 100% <= 95%

show variables like 'table%';
table_definition_cache      控制总frm文件的数量
table_open_cache            所有线程打开的表的数量
table_open_cache_instances  打开的表缓存实例的数量

12.线程
(1)线程使用情况

show global status like 'Thread%';
threads_cached                线程缓存内的线程的数量
threads_connected            当前打开的连接的数量
threads_connected            当前打开的连接的数量
threads_created                创建用来处理连接的线程数,如果Threads_created较大,你可能要增加thread_cache_size值。
threads_running                激活的(非睡眠状态)线程数

(2)查看创建时间超过slow_launch_time秒的线程数。

show status like 'slow_launch_threads';

(3)查看查询时间超过long_query_time秒的查询的个数。

show status like 'slow_queries';

13.查询缓存

show global status like 'qcache%';  
Qcache_free_blocks            缓存中相邻内存块的个数。数目大说明可能有碎片。FLUSH QUERY CACHE会对缓存中的碎片进行整理,从而得到一个空闲块。
Qcache_free_memory            缓存中的空闲内存。
Qcache_hits                    每次查询在缓存中命中时就增大
Qcache_inserts                每次插入一个查询时就增大。命中次数除以插入次数就是不中比率。
Qcache_lowmem_prunes        缓存出现内存不足并且必须要进行清理以便为更多查询提供空间的次数。这个数字最好长时间来看;如果这个数字在不断增长,就表示可能碎片非常严重,或者内存很少。(上面的 free_blocks和free_memory可以告诉您属于哪种情况)
Qcache_not_cached            不适合进行缓存的查询的数量,通常是由于这些查询不是 SELECT 语句或者用了now()之类的函数。
Qcache_queries_in_cache        当前缓存的查询(和响应)的数量。
Qcache_total_blocks            缓存中块的数量。

查询服务器关于query_cache的配置

show variables like 'query_cache%';  
query_cache_limit                超过此大小的查询将不缓存
query_cache_min_res_unit        缓存块的最小大小
query_cache_size                查询缓存大小
query_cache_type                缓存类型,决定缓存什么样的查询,示例中表示不缓存 select sql_no_cache 查询
query_cache_wlock_invalidate    当有其他客户端正在对MyISAM表进行写操作时,如果查询在query cache中,是否返回cache结果还是等写操作完成再读表获取结果。

query_cache_min_res_unit的配置默认是4KB,设置值大对大数据查询有好处,但如果查询都是小数据查询,容易造成内存碎片和浪费。

查询缓存碎片率 = Qcache_free_blocks / Qcache_total_blocks * 100% (如果查询缓存碎片率超过20%且查询都是小数据量,可以用FLUSH QUERY CACHE整理缓存碎片,或者减小query_cache_min_res_unit)
查询缓存利用率 = (query_cache_size – Qcache_free_memory) / query_cache_size * 100% (查询缓存利用率在25%以下的话说明query_cache_size设置的过大,可适当减小;查询缓存利用率在80%以上而且Qcache_lowmem_prunes > 50的话说明query_cache_size可能有点小,要不就是碎片太多)
查询缓存命中率 = (Qcache_hits – Qcache_inserts) / Qcache_hits * 100%

14.排序使用情况

show global status like 'sort%'; 

15.表扫描情况

show global status like 'handler_read%';
show  status like 'com_select';
表扫描率 = Handler_read_rnd_next / Com_select


如果表扫描率超过4000,说明进行了太多表扫描,很有可能索引没有建好,增加read_buffer_size值会有一些好处,但最好不要超过8MB。

16.查看独立表空间是否开启及表空间默认大小

SHOW VARIABLES LIKE 'innodb_file_per_table';
SHOW VARIABLES LIKE 'innodb_data_file_path';

17.查看innodb文件路径

SHOW VARIABLES LIKE 'innodb_data_home_dir';
SHOW VARIABLES LIKE 'innodb_data_file_path';

18.查看等待事件

show global status like 'Innodb_buffer_pool_wait_free';
show global status like 'Innodb_log_waits';

19.查看binglog模式
(1)查看binlog相关参数配置

SHOW VARIABLES LIKE '%log_bin%';

(2)查看binlog保留天数

show VARIABLES LIKE 'expire_logs_days%';

(3)查看binlog记录模式

SHOW GLOBAL VARIABLES LIKE 'binlog_format';

(4)查看所有binlog文件

SHOW MASTER LOGS;

(5)查看当前记录的binlog文件

SHOW MASTER STATUS;

(6)查看binlog文件记录

show binlog events in 'host01-binlog.000002';

(7)手动切换binlog
 

FLUSH LOGS;

log_bin_trust_function_creators={on | off }    #默认为OFF,这个参数开启会限制存储过程、Function、触发器的创建
log_bin = {on | off | base_name}                 #指定是否启用记录二进制日志或者指定一个日志路径(路径不能加.否则.后的被忽略)
sql_log_bin ={ on | off }                         #指定是否启用记录二进制日志,只有在log_bin开启的时候才有效
expire_logs_days =                                 #指定自动删除二进制日志的时间,即日志过期时间
binlog_do_db =                                     #明确指定要记录日志的数据库
binlog_ignore_db =                                 #指定不记录二进制日志的数据库
log_bin_index =                                 #指定mysql-bin.index文件的路径
binlog_format = { mixed | row | statement }     #指定二进制日志基于什么模式记录
binlog_rows_query_log_events = { 1|0 }             # MySQL5.6.2添加了该变量,当binlog format为row时,默认不会记录row对应的SQL语句,设置为1或其他true布尔值时会记录,但需要使用mysqlbinlog -v查看,这些语句是被注释的,恢复时不会被执行。
max_binlog_size =                                 #指定二进制日志文件最大值,超出指定值将自动滚动。但由于事务不会跨文件,所以并不一定总是精确。
binlog_cache_size = 32768                         #基于事务类型的日志会先记录在缓冲区,当达到该缓冲大小时这些日志会写入磁盘
max_binlog_cache_size =                         #指定二进制日志缓存最大大小,硬限制。默认4G,够大了,建议不要改
binlog_cache_use                                #使用缓存写二进制日志的次数(这是一个实时变化的统计值)
binlog_cache_disk_use                            #使用临时文件写二进制日志的次数,当日志超过了binlog_cache_size的时候会使用临时文件写日志,如果该变量值不为0,则考虑增大binlog_cache_size的值
binlog_stmt_cache_size = 32768                     #一般等同于且决定binlog_cache_size大小,所以修改缓存大小时只需修改这个而不用修改binlog_cache_size
binlog_stmt_cache_use                            #使用缓存写二进制日志的次数
binlog_stmt_cache_disk_use                        #使用临时文件写二进制日志的次数,当日志超过了binlog_cache_size的时候会使用临时文件写日志,如果该变量值不为0,则考虑增大binlog_cache_size的值
sync_binlog = { 0 | n }                         #这个参数直接影响mysql的性能和完整性
sync_binlog=0                                    #不同步,日志何时刷到磁盘由FileSystem决定,这个性能最好。
sync_binlog=n                                    #每写n次二进制日志事件(不是事务),MySQL将执行一次磁盘同步指令fdatasync()将缓存日志刷新到磁盘日志文件中。Mysql中默认的设置是sync_binlog=0,即不同步,这时性能最好,但风险最大。一旦系统奔溃,缓存中的日志都会丢失

我回来啦,目前还在从事数据库工程师方面工作,这些是日常数据库巡检总结希望能够帮助到大家,有错误和不足的地方也欢迎大家指出。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2340685.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文件操作和IO(上)

绝对路径和相对路径 文件按照层级结构进行组织&#xff08;类似于数据结构中的树型结构&#xff09;&#xff0c;将专门用来存放管理信息的特殊文件称为文件夹或目录。对于文件系统中文件的定位有两种方式&#xff0c;一种是绝对路径&#xff0c;另一种是相对路径。 绝对路径…

JavaFX深度实践:从零构建高级打地鼠游戏(含多物品与反馈机制)

大家好&#xff01;经典的“打地鼠”游戏是许多人童年的回忆&#xff0c;也是学习 GUI 编程一个非常好的切入点。但仅仅是“地鼠出来就打”未免有些单调。今天&#xff0c;我们来点不一样的——用 JavaFX 打造一个高级版的打地鼠游戏&#xff01;在这个版本中&#xff0c;洞里钻…

Python 简介与入门

目录 一、Python 初识 1、Python 的优势 2、Python 的特性 3、Python 的应用领域 二、Linux 环境中安装 Python 1、下载 Python3.11.6 2、安装依赖包 3、解压 Python 压缩包 4、安装 Python 5、编译及安装 6、建立软链接 7、测试 Python3 运行 8、设置国内 pip 更…

理解RAG第六部分:有效的检索优化

在RAG系统中&#xff0c;识别相关上下文的检索器组件的性能与语言模型在生成有效响应方面的性能同样重要&#xff0c;甚至更为重要。因此&#xff0c;一些改进RAG系统的努力将重点放在优化检索过程上。 从检索方面提高RAG系统性能的一些常见方法。通过实施高级检索技术&#x…

实训Day-2 流量分析与安全杂项

目录 实训Day-2-1流量分析实战 实训目的 实训任务1 SYN半链接攻击流量分析 实训任务2 SQL注入攻击流量分析一 实训任务3 SQL注入攻击流量分析二 实训任务4 Web入侵溯源一 实训任务5 Web入侵溯源二 ​编辑 实训Day-2-1安全杂项实战 实训目的 实训任务1 流量分析 FTP…

几种电气绝缘类型

1. 基本绝缘 1.1 绝缘等级 1.2 I类设备 2. 附加绝缘 3. 双重绝缘 4. 加强绝缘 5. 功能性绝缘 1. 基本绝缘 用于防止触及带电部件的初级保护,该防护是由绝缘材料完成的 基本绝缘的目的在于为防电击提供一个基本的保护,以避免触电的危险,不过此类绝缘只能保证正常状态下…

char32_t、char16_t、wchar_t 用于 c++ 语言里存储 unicode 编码的字符,给出它们的具体定义

&#xff08;1&#xff09; #include <iostream> #include <string>int main() { std::u16string s u"C11 引入 char16_t"; // 定义 UTF-16 字符串for (char16_t c : s) // 遍历输出每个 char16_t 的值std::cout << std::hex << (…

Java Set/List 知识点 Java面试 基础面试题

Java Set/List 知识点 Set与List区别 List 有序、值可重复,内部数据结构 Obejct[ ] 数组Set 无序、值不重复,内部数据结构 HashMap keyobject value固定new Object() ArrayList 有序存储元素允许元素重复&#xff0c;允许存储 null 值支持动态扩容非线程安全 HashSet、LinkedHa…

Oracle Database Resident Connection Pooling (DRCP) 白皮书阅读笔记

本文为“Extreme Oracle Database Connection Scalability with Database Resident Connection Pooling (DRCP)”的中文翻译加阅读笔记。觉得是重点的就用粗体表示了。 白皮书版本为March 2025, Version 3.3&#xff0c;副标题为&#xff1a;Optimizing Oracle Database resou…

FastAPI WebSocket 聊天应用详细教程

项目简介 这是一个基于 FastAPI 和 WebSocket 实现的实时聊天应用&#xff0c;支持一对一聊天、离线消息存储等功能。 技术栈 后端&#xff1a;FastAPI (Python)前端&#xff1a;HTML、JavaScript、CSS通信&#xff1a;WebSocket认证&#xff1a;简单的 token 认证 项目结构…

vue3+canvas裁剪框样式【前端】

目录 canvas绘制裁剪框&#xff1a;拖拽改变框的大小&#xff1a;圆圈样式&#xff1a;方块样式&#xff1a; canvas绘制裁剪框&#xff1a; // 绘制裁剪框 const drawCropRect (ctx: CanvasRenderingContext2D): void > {if (cropRect.value.width > 0 && crop…

软件功能测试和非功能测试有什么区别和联系?

软件测试是保障软件质量的核心环节&#xff0c;而软件功能测试和非功能测试作为测试领域的两大重要组成部分&#xff0c;承担着不同但又相互关联的职责。 软件功能测试指的是通过验证软件系统的各项功能是否按照需求规格说明书来正确实现&#xff0c;确保软件的功能和业务流程…

10_C++入门案例习题: 结构体案例

案例描述 学校正在做毕设项目&#xff0c;每名老师带领5个学生&#xff0c;总共有3名老师&#xff0c;需求如下 设计学生和老师的结构体&#xff0c;其中在老师的结构体中&#xff0c;有老师姓名和一个存放5名学生的数组作为成员 学生的成员有姓名、考试分数&#xff0c; 创建…

快速定位达梦缓存的执行计划并清理

开发告诉你一个sql慢&#xff0c;你想看看缓存中执行计划时&#xff0c;怎么精准快速定位&#xff1f; 可能一般人通过文本内容模糊搜索 select cache_item, substr(sqlstr,1,60)stmt from v$cachepln where sqlstr like %YOUR SQL STRING%; 搜出来的内容比较多&#xff0c;研…

若依、vben-admin、三维可视化

对三维可视化&#xff0c;包括cesium、模型加载、GIS有关的项目和技术都可以私信&#xff0c;包括基础数据后台管理系统的搭建和配置

LLMs可在2位精度下保持高准确率

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

爆改 toxml 组件 支持数据双向绑定 解决数据刷新问题

GGGGGGGGGGGGGGGGGithub地址自行研究 sbfkcel/towxml: 微信小程序HTML、Markdown渲染库https://github.com/sbfkcel/towxml原组件是以导入数据渲染信息为目的、本文以AI数据返回小程序为模拟效果演示 默认情况只在ready 环节进行渲染静态资源 1、对传入数据容器的位置做处理 …

Unreal如何使用后处理材质实现一个黑屏渐变效果

文章目录 前言相机后期处理材质创建材质相机设置动态修改FadeAlpha参数使用示例最后前言 UE5 开发VR ,如何通过PostProcess轻松实现黑屏渐变效果 最简单的办法,其实是使用一个半球形模型,遮挡住相机,然后控制这个半球形遮罩的颜色透明度,至少Unity中默认的Tunneling是这么…

DB-GPT支持mcp协议配置说明

简介 在 DB-GPT 中使用 MCP&#xff08;Model Context Protocol&#xff09;协议&#xff0c;主要通过配置 MCP 服务器和智能体协作实现外部工具集成与数据交互。 开启mcp服务&#xff0c;这里以网页抓取为例 npx -y supergateway --stdio "uvx mcp-server-fetch" …

CoT-Drive:利用 LLM 和思维链提示实现自动驾驶的高效运动预测

25年3月来自澳门大学和 MIT 的论文“CoT-Drive: Efficient Motion Forecasting for Autonomous Driving with LLMs and Chain-of-Thought Prompting”。 准确的运动预测对于安全的自动驾驶 (AD) 至关重要。本研究提出 CoT-Drive&#xff0c;这是一种利用大语言模型 (LLM) 和思…