- Модуль: cluster
- Путь к файлу: ~/bitrix/modules/cluster/classes/mysql/slave.php
- Класс: CClusterSlave
- Вызов: CClusterSlave::GetStatus
static function GetStatus($node_id, $bSlaveStatus = true, $bGlobalStatus = true, $bVariables = true)
{
global $DB;
$arNode = CClusterDBNode::GetByID($node_id);
if (!is_array($arNode))
{
return false;
}
if ($node_id == 1)
{
$nodeDB = $DB;
}
else
{
ob_start();
$nodeDB = CDatabase::GetDBNodeConnection($node_id, true, false);
ob_end_clean();
}
if (!is_object($nodeDB))
{
return false;
}
$arStatus = ['server_id' => null];
if ($bVariables)
{
$rs = $nodeDB->Query("show variables like 'server_id'", false, "", ['fixed_connection' => true]);
if ($ar = $rs->Fetch())
{
$arStatus['server_id'] = $ar['Value'];
}
}
$rsSlaves = CClusterDBNode::GetList([], ['=MASTER_ID' => $node_id]);
if ($rsSlaves->Fetch())
{
$arStatus = array_merge($arStatus, [
'File' => null,
'Position' => null,
]);
if ($bSlaveStatus)
{
$rs = $nodeDB->Query("SHOW MASTER STATUS", true, "", ['fixed_connection' => true]);
if (!$rs)
{
return GetMessage("CLU_NO_PRIVILEGES", ["#sql#" => "GRANT REPLICATION CLIENT on *.* to '".$nodeDB->DBLogin."'@'%';"]);
}
$ar = $rs->Fetch();
if (is_array($ar))
{
foreach ($ar as $key=>$value)
{
if ($key == 'Last_Error')
{
$key = 'Last_SQL_Error';
}
if (array_key_exists($key, $arStatus))
{
$arStatus[$key] = $value;
}
}
}
}
}
if ($arNode["MASTER_ID"] <> '')
{
$arStatus = array_merge($arStatus, [
'Slave_IO_State' => null,
'Slave_IO_Running' => null,
'Read_Master_Log_Pos' => null,
'Slave_SQL_Running' => null,
'Exec_Master_Log_Pos' => null,
'Seconds_Behind_Master' => null,
'Last_IO_Error' => null,
'Last_SQL_Error' => null,
'Com_select' => null,
]);
if ($bSlaveStatus)
{
$rs = $nodeDB->Query("SHOW SLAVE STATUS", true, "", ['fixed_connection' => true]);
if (!$rs)
{
return GetMessage("CLU_NO_PRIVILEGES", ["#sql#" => "GRANT REPLICATION CLIENT on *.* to '" . $nodeDB->DBLogin . "'@'%';"]);
}
$ar = $rs->Fetch();
if (is_array($ar))
{
foreach ($ar as $key => $value)
{
if ($key == 'Last_Error')
{
$key = 'Last_SQL_Error';
}
if (array_key_exists($key, $arStatus))
{
$arStatus[$key] = $value;
}
}
}
}
}
if($bGlobalStatus)
{
$rs = $nodeDB->Query("show global status where Variable_name in ('Com_select', 'Com_do')", true, '', ['fixed_connection' => true]);
if (is_object($rs))
{
while ($ar = $rs->Fetch())
{
if ($ar['Variable_name'] == 'Com_do')
{
$arStatus['Com_select'] -= $ar['Value'] * 2;
}
else
{
$arStatus['Com_select'] += $ar['Value'];
}
}
}
else
{
$rs = $nodeDB->Query("show status like 'Com_select'", false, "", ["fixed_connection" => true]);
$ar = $rs->Fetch();
if ($ar)
{
$arStatus['Com_select'] += $ar['Value'];
}
$rs = $nodeDB->Query("show status like 'Com_do'", false, "", ["fixed_connection" => true]);
$ar = $rs->Fetch();
if ($ar)
{
$arStatus['Com_select'] -= $ar['Value'] * 2;
}
}
}
return $arStatus;
}