MySQL表锁情况和文件打开数

本文介绍了如何查看MySQL的表锁状态及文件打开数量,并提供了判断是否需要从MyISAM切换到InnoDB引擎的标准。

MySQL表锁情况和文件打开数

2013-01-10 00:00 中国IT实验室 佚名
关键字:

  在数据库中,我们需要根据数据库的状态调整一些系统参数,下面为您介绍的是MySQL表锁情况和文件打开数的调整方法,供您参考。

  文件打开数(open_files)

  mysql

  >

  show global status like 'open_files';

  +---------------+-------+

  | Variable_name | Value |

  +---------------+-------+

  | Open_files | 1410 |

  +---------------+-------+

  mysql

  >

  show variables like 'open_files_limit';

  +------------------+-------+

  | Variable_name | Value |

  +------------------+-------+

  | open_files_limit | 4590 |

  MySQL表锁情况

  mysql

  >

  show global status like 'table_locks%';

  +-----------------------+-----------+

  | Variable_name | Value |

  +-----------------------+-----------+

  | Table_locks_immediate | 490206328 |

  | Table_locks_waited | 2084912 |

  +-----------------------+-----------+

  Table_locks_immediate表示立即释放MySQL表锁数,Table_locks_waited表示需要等待的MySQL表锁数,如果Table_locks_immediate / Table_locks_waited > 5000,最好采用InnoDB引擎,因为InnoDB是行锁而MyISAM是MySQL表锁,对于高并发写入的应用InnoDB效果会好些。示例中的服务器Table_locks_immediate / Table_locks_waited = 235,MyISAM就足够了。

<think>我们正在讨论的是MySQL中如何获取当前已打开名(即当前被查询或操作的)。然而,在MySQL中,并没有直接提供“已打开”的概念,但我们可以通过查询进程列(Process List)来获取当前正在执行的SQL语句,然后从中解析出名。此外,我们还可以通过查询`INFORMATION_SCHEMA.INNODB_TRX`(针对InnoDB引擎)来获取当前事务中涉及的。 不过,用户的需求是“读取已打开名”,我们可以理解为当前正在被操作或定的。以下是几种方法: ### 方法1:通过`SHOW PROCESSLIST`获取当前SQL并解析名 此方法可以显示当前所有连接正在执行的SQL语句,我们可以通过分析SQL语句来提取名。但这种方法需要解析SQL,且不一定能完全准确获取(因为有些SQL可能涉及多个,且状态可能很快变化)。 ### 方法2:查询`INFORMATION_SCHEMA.INNODB_LOCKS``INFORMATION_SCHEMA.INNODB_LOCK_WAITS`(仅InnoDB) 在存在情况下,我们可以通过这些查看哪些定(即被打开)。但是,这些MySQL 8.0中已被移除,改用`performance_schema`。 ### 方法3:查询`performance_schema.metadata_locks`(MySQL 5.7及以上) 该显示了元(metadata locks)的信息,当一个打开(例如被查询)时,会有一个元。我们可以通过该获取当前哪些定(即被打开)。 **示例查询:** ```sql SELECT OBJECT_SCHEMA, OBJECT_NAME FROM performance_schema.metadata_locks WHERE OBJECT_TYPE = 'TABLE' AND LOCK_STATUS = 'GRANTED'; ``` 注意:`performance_schema`默认可能未开启所有监控,需要确保`performance_schema`已启用,并且`wait/lock/metadata/sql/mdl`仪器已启用。 ### 方法4:查询`INFORMATION_SCHEMA.PROCESSLIST`并解析SQL(同方法1) 可以通过以下查询获取当前所有连接它们正在执行的SQL语句: ```sql SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST; ``` 然后解析其中的`INFO`字段(即SQL语句)来获取名。但这种方法比较繁琐,且SQL语句可能很长,解析复杂。 ### 方法5:查询`sys.schema_table_lock_waits`(需要安装sys库) 如果安装了`sys`库(MySQL 5.7及以上默认不安装,但可以手动安装),可以使用该视图查看当前被定的。 **示例查询:** ```sql SELECT * FROM sys.schema_table_lock_waits; ``` ### 总结 由于用户提到“已打开”,在MySQL中我们可以理解为当前有元(MDL)的或者正在被操作的。最直接的方法是查询`performance_schema.metadata_locks`(如果可用)。但需要注意,这种方法需要MySQL版本>=5.7,且开启相关监控。 ### 步骤 1. 确认MySQL版本并确保`performance_schema`已启用(通常默认启用): ```sql SHOW VARIABLES LIKE 'performance_schema'; ``` 如果返回`ON`,则已启用。 2. 确保`metadata_locks`仪器已启用: ```sql SELECT ENABLED FROM performance_schema.setup_instruments WHERE NAME = 'wait/lock/metadata/sql/mdl'; ``` 如果返回`YES`,则已启用;如果为`NO`,需要更新配置(需重启或动态设置)。 3. 查询当前被定的(即已打开): ```sql SELECT OBJECT_SCHEMA, OBJECT_NAME, LOCK_TYPE, LOCK_STATUS FROM performance_schema.metadata_locks WHERE OBJECT_TYPE = 'TABLE'; ``` ### 注意事项 - 这些查询可能返回很多系统,可以根据需要过滤。 - 元的持有时间可能很短,所以可能捕获不到瞬间的操作。 - 需要具有足够的权限(如`PROCESS`权限)来查询这些系统。 ### 相关问题 1. 如何启用MySQL的performance_schema? 2. 如何解析SQL语句获取名? 3. 在MySQL中如何查看当前被定的? 4. MySQL中元(MDL)是什么? 5. 如何监控MySQL中的等待情况? [^1]: 使用`mysqlfrm`工具从`.frm`文件恢复建语句 [^2]: 检查MySQL`lower_case_table_names`对名大小写的影响 [^3]: 使用VB获取SQL Server据库中所有名的方法 </think>在 MySQL 中,可以通过以下方法查询当前被打开(被访问或定)的名: ### 方法一:查询 `performance_schema.metadata_locks` (推荐) ```sql SELECT OBJECT_SCHEMA AS database_name, OBJECT_NAME AS table_name, LOCK_TYPE, LOCK_STATUS FROM performance_schema.metadata_locks WHERE OBJECT_TYPE = 'TABLE' AND LOCK_STATUS = 'GRANTED'; ``` **说明**: 1. 显示当前已被定的 2. `LOCK_TYPE` 列显示类型: - `SHARED_READ`:共享读 - `SHARED_WRITE`:共享写 - `EXCLUSIVE`:排他 3. 需要开启 `performance_schema`(默认启用)[^1] ### 方法二:查询 `sys.schema_table_lock_waits` 视图 ```sql SELECT object_schema AS database_name, object_name AS table_name, waiting_pid AS process_id FROM sys.schema_table_lock_waits; ``` **说明**: 1. 显示正在等待的进程 2. 需要安装 `sys` 库(MySQL 5.7+ 默认包含) ### 方法三:使用 `SHOW OPEN TABLES` 命令 ```sql SHOW OPEN TABLES WHERE In_use > 0; ``` **输出示例**: ``` +----------+---------------+--------+-------------+ | Database | Table | In_use | Name_locked | +----------+---------------+--------+-------------+ | sales | orders | 1 | 0 | | hr | employees | 3 | 0 | +----------+---------------+--------+-------------+ ``` **说明**: 1. `In_use` 列显示当前使用的线程 2. `Name_locked` 名是否被定(如重命名操作) ### 方法四:监控 InnoDB 信息(仅 InnoDB ) ```sql SELECT r.trx_id AS transaction_id, r.trx_mysql_thread_id AS thread_id, l.lock_table AS locked_table FROM information_schema.innodb_trx r JOIN information_schema.innodb_locks l ON r.trx_id = l.lock_trx_id WHERE l.lock_table IS NOT NULL; ``` ### 使用注意事项 1. 需要对应权限: ```sql GRANT PROCESS, SELECT ON performance_schema.* TO 'your_user'@'%'; ``` 2. 若返回空结果,示当前没有被显式定 3. 瞬时的访问可能无法捕获(如快速查询) ### 示例场景 ```sql -- 步骤1:在会话A中 LOCK TABLES orders WRITE; -- 步骤2:在会话B中查询打开 SHOW OPEN TABLES WHERE In_use > 0; ``` **结果**: ``` +----------+-------+--------+-------------+ | Database | Table | In_use | Name_locked | +----------+-------+--------+-------------+ | shop | orders| 1 | 0 | +----------+-------+--------+-------------+ ``` 通过以上方法,可以实时监控 MySQL 中当前被访问或定的,对于诊断性能问题定冲突非常有用[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值