mysql TOP 命令中的 TIME 列

mysql TOP 命令中的 TIME 列

当我在数据库服务器上运行 top 时,我发现 mysqld 已经运行了 4:00.51,并且还在继续上升。

从这里的其他帖子来看,我推测这意味着一个 mysql 进程已经运行了这么长时间。据我所知,它没有设置为累积模式,因为如果是这样的话,标题看起来会更改为 CTIME。

我想知道的是,对于使用 PHP 进行大量单独连接的网站来说,这是否正常。我不应该有任何长时间运行的进程会占用 mysql 连接这么长时间,最多只有几秒钟。

我假设这个时间与一个连接/进程的运行有关,这是错误的吗?我认为我通常会看到它在顶部闪烁,而不是一直停留在那里,并且这个数字在增加。

答案1

当你观察top并看到mysqldmysqld每个实例只能有一个。旧版本的服务器编译mysqld会产生许多线程。我假设您没有使用此类线程。

要查看单个连接,您可以执行以下两项操作之一

在 mysql 客户端中,运行SHOW PROCESSLIST;(第三列中的传入连接源Host

在操作系统中,运行

  • netstat | grep -i mysql
  • netstat | grep 3306

为了强调,mysqld每个实例只能看到一个进程

如果你想仔细检查 top 中显示的时间值,请询问 mysqld

如果你有 MySQL 5.1+,请运行以下命令:

SELECT 
    TRIM(REPLACE(CONCAT(
        IF(dy=0,'',IF(dy=1,'1 day ',CONCAT(dy,' days '))),
        IF(hr=0,'',IF(hr=1,'1 hr ', CONCAT(hr,' hrs  '))),
        IF(mn=0,'',IF(mn=1,'1 min ',CONCAT(mn,' mins '))),
        IF(sc=0,'',IF(sc=1,'1 sec ',CONCAT(sc,' secs ')))),'  ',' '))
    TimeDisplay
FROM (SELECT dy,hr,mn,MOD(sec_aaaa,60) sc
FROM (SELECT dy,hr,FLOOR((sec_aaa - dy*86400 - hr*3600)/60) mn,sec_aaa sec_aaaa
FROM (SELECT dy,FLOOR((sec_aa - (dy*86400))/3600) hr,sec_aa sec_aaa
FROM (SELECT FLOOR(sec_a/86400) dy,sec_a sec_aa
FROM
    (
        SELECT variable_value sec_a
        FROM information_schema.global_status
        WHERE variable_name = 'Uptime'
    )
A) AA) AAA) AAAA) B;

如果你有 MySQL 5.0,请运行此命令

MYSQL_CONN="-uroot -ppassword"
UPTIME_SEC=`mysql ${MYSQL_CONN} -A -N -e"SHOW GLOBAL STATUS LIKE 'Uptime'" | awk '{print $2}'`
SQLTIME="SELECT TRIM(REPLACE(CONCAT("
SQLTIME="${SQLTIME} IF(dy=0,'',IF(dy=1,'1 day ',CONCAT(dy,' days '))),"
SQLTIME="${SQLTIME} IF(hr=0,'',IF(hr=1,'1 hr ', CONCAT(hr,' hrs  '))),"
SQLTIME="${SQLTIME} IF(mn=0,'',IF(mn=1,'1 min ',CONCAT(mn,' mins '))),"
SQLTIME="${SQLTIME} IF(sc=0,'',IF(sc=1,'1 sec ',CONCAT(sc,' secs ')))),'  ',' ')) TimeDisplay"
SQLTIME="${SQLTIME} FROM (SELECT dy,hr,mn,MOD(sec_aaaa,60) sc"
SQLTIME="${SQLTIME} FROM (SELECT dy,hr,FLOOR((sec_aaa - dy*86400 - hr*3600)/60) mn,sec_aaa sec_aaaa"
SQLTIME="${SQLTIME} FROM (SELECT dy,FLOOR((sec_aa - (dy*86400))/3600) hr,sec_aa sec_aaa"
SQLTIME="${SQLTIME} FROM (SELECT FLOOR(sec_a/86400) dy,sec_a sec_aa"
SQLTIME="${SQLTIME} FROM (SELECT ${UPTIME_SEC} sec_a ) A) AA) AAA) AAAA) B"
MYSQL_START_TIME=`mysql ${MYSQL_CONN} -A -N -e"${SQLTIME}"`
echo ${MYSQL_START_TIME}

这将为您提供 mysqld 已运行的秒数。

如果你想查看 mysqld 启动的日期和时间

MySQL 5.1+

select (now() - interval variable_value second) MySQLStartTime from
information_schema.global_status where variable_name='uptime';

MySQL 5.0

MYSQL_CONN="-uroot -ppassword"
UPTIME_SEC=`mysql ${MYSQL_CONN} -A -N -e"SHOW GLOBAL STATUS LIKE 'Uptime'" | awk '{print $2}'`
MYSQL_START_TIME=`mysql ${MYSQL_CONN} -A -N -e"SELECT (NOW() - INTERVAL ${UPTIME_SEC} SECOND) MySQLStartTime"`
echo ${MYSQL_START_TIME}

试一试 !!!

相关内容