当我在数据库服务器上运行 top 时,我发现 mysqld 已经运行了 4:00.51,并且还在继续上升。
从这里的其他帖子来看,我推测这意味着一个 mysql 进程已经运行了这么长时间。据我所知,它没有设置为累积模式,因为如果是这样的话,标题看起来会更改为 CTIME。
我想知道的是,对于使用 PHP 进行大量单独连接的网站来说,这是否正常。我不应该有任何长时间运行的进程会占用 mysql 连接这么长时间,最多只有几秒钟。
我假设这个时间与一个连接/进程的运行有关,这是错误的吗?我认为我通常会看到它在顶部闪烁,而不是一直停留在那里,并且这个数字在增加。
答案1
当你观察top
并看到mysqld
,mysqld
每个实例只能有一个。旧版本的服务器编译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}
试一试 !!!