• Модуль: 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;
}