Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z wpisywaniem do bazy danych
Forum PHP.pl > Forum > Bazy danych > MySQL
matisq
Witam,
Mam taki oto skrypt wpisujący dane z Nagiosa do bazy danych. Skrypt jest wywoływany średnio 8 razy na sekundę.
Problem jest taki, że cały czas po około godzinie działania skrypt zawiesza program który go wywołuje (Nagios <defunct>).

Całe środowisko postawione jest na wirtualnej maszynie:
521 MB ramu.
Dodatkowy wirtualny dysk wpięty na baze danych.
Każdorazowy wpis do bazy nie ma więcej niż 22 kb czystego tekstu.
Baza przyrasta dziennie około 1 GB. Baza ma wielkość 26 GB na dziś.
Może wystarczy przenieść wirtualne środowisko do "normalnego" systemu?
Chyba ze w skrypcie jest jakiś błąd, albo w ustawieniach MySQL?

  1. <?php
  2.  
  3. define('LOG', '/usr/mysql.log');
  4.  
  5. class dataBase
  6. {
  7.  function dataBase()
  8.  {
  9.    $user = 'root';
  10.    $pass = 'passwd';
  11.    $host = 'localhost';
  12.    $base = 'db_test';
  13.  
  14.    $this->conn =  mysql_connect($host, $user, $pass);
  15.    if(!$this->conn)
  16.    {
  17.     file_put_contents(LOG, mysql_error());
  18.    exit(2);
  19.    }
  20.    
  21.    if(!mysql_select_db($base))
  22.    {
  23.     file_put_contents(LOG, mysql_error());
  24.    exit(2);
  25.    }
  26.   }
  27.  
  28.  function getHostId($name)
  29.  {
  30.   $sql = "SELECT host_id FROM host_data WHERE  host_name = '$name'";
  31.   $res = mysql_query($sql, $this->conn);
  32.   if(!$res)
  33.   {    
  34.        file_put_contents(LOG, mysql_error());
  35.    exit(2);
  36.   }
  37.   $row = mysql_fetch_row($res);
  38.  
  39.   if(empty($row[0])) return false;
  40.   else return $row[0];
  41.  
  42.  }
  43.  function getServiceId($name)
  44.  {
  45.   $sql = "SELECT id FROM service_name WHERE name = '$name'";
  46.   $res = mysql_query($sql);
  47.   if(!$res)
  48.   {
  49.     file_put_contents(LOG, mysql_error());
  50.    exit(2);
  51.   }
  52.   $row = mysql_fetch_row($res);
  53.  
  54.   if(empty($row[0])) return false;
  55.   else return $row[0];
  56.  
  57.  }
  58.  
  59.  function insertRecordToServiceData($time, $hostName, $hostAlias,  $serviceName, $serviceState, $serviceOutput, $serviceLongOutput,  $servicePerfData=0)
  60.  {
  61.    $hostId = $this -> getHostId($hostName);
  62.    if(!$hostId)
  63.    {
  64.      $hostId =  $this -> insertRecordToHostData($hostName, $hostAlias);
  65.    }
  66.    
  67.    $serviceId = $this -> getServiceId($serviceName);
  68.    if(!$serviceId)
  69.    {
  70.      file_put_contents(LOG, mysql_error());
  71.      exit(2);
  72.    }
  73.      
  74.    $this -> insertRecordHostService($hostId, $serviceId);    
  75.  
  76.    $sql = "INSERT INTO service_data (timet, host_id, service_id, service_state, service_output, service_long_output, service_perf_data)  VALUES ('$time', '$hostId', '$serviceId', '$serviceState', '$serviceOutput', '$serviceLongOutput', '$servicePerfData')
  77.           ";
  78.  
  79.     $res = mysql_query($sql, $this->conn);
  80.     if(!$res)
  81.     {    
  82.        file_put_contents(LOG, mysql_error());
  83.    exit(2);
  84.     }
  85.  }
  86.  
  87.  function insertRecordHostService($hostId, $serviceId)
  88.  {
  89.    $sql = "SELECT * FROM host_service WHERE host_id = '$hostId' AND service_id = '$serviceId'";
  90.    $res = mysql_query($sql, $this->conn);
  91.    if(!$res)
  92.    {    
  93.        file_put_contents(LOG, mysql_error() . $sql);
  94.    exit(2);
  95.    }
  96.    $row = mysql_fetch_row($res);
  97.    if($row===FALSE)
  98.    {
  99.       $sql = "INSERT INTO host_service (host_id, service_id) VALUES( '$hostId', '$serviceId')";
  100.    $res = mysql_query($sql, $this->conn);
  101.    if(!$res)
  102.       {    
  103.        file_put_contents(LOG, mysql_error() . $sql);
  104.    exit(2);
  105.    }
  106.    }  
  107.  
  108.  }
  109.  
  110.  function insertRecordToHostData($hostName, $hostAlias)
  111.  {
  112.     $sql = "INSERT INTO host_data (host_name, host_alias) VALUES ('$hostName', '$hostAlias') ";
  113.     $res = mysql_query($sql, $this->conn);
  114.     if($res)
  115.     {    
  116.        file_put_contents(LOG, mysql_error());
  117.    exit(2);
  118.     }
  119.     $id = mysql_insert_id($this->conn);
  120.     if($id)
  121.     {    
  122.        file_put_contents(LOG, mysql_error());
  123.    exit(2);
  124.     }
  125.     return $id;
  126.  }
  127.  
  128.  
  129. var $conn = null;
  130. }
  131.  
  132. $db = new dataBase();
  133. $db -> insertRecordToServiceData($_SERVER['argv'][1], $_SERVER['argv'][2], $_SERVER['argv'][3], $_SERVER['argv'][4],
  134.                  $_SERVER['argv'][5], $_SERVER['argv'][6], $_SERVER['argv'][7],  $_SERVER['argv'][8]);
  135.  
  136.  
  137. ?>
erix
Cytat
Może wystarczy przenieść wirtualne środowisko do "normalnego" systemu?

Spróbować zawsze można. Nie podałeś, z jakiego silnika korzysta tabela.

Poza tym, najlepiej by było jakoś porcjować te zapytania...
matisq
Apache/2.2.9 (Unix)
Wersja klienta MySQL: 5.0.45
Rozszerzenie PHP: mysql

Znaczy porcjowanie wpisywania danych do tabeli?
Może tabela jest za duża i jest z tym jakiś problem?
A może wpisywać dane do jakiejś tymczasowej tabeli i "hurtem" co np 5 minut wrzucać te dane do głównej bazy i zerować tymczasową?
erix
Cytat
Spróbować zawsze można. Nie podałeś, z jakiego silnika korzysta tabela.

MyISAM, czy InnoDB.

Cytat
Znaczy porcjowanie wpisywania danych do tabeli?

Tak.

Cytat
Może tabela jest za duża i jest z tym jakiś problem?

Nie sądzę. Nie odpowiedziałeś na moje pytanie, a to w pewien sposób uzależnia dalsze działania.
matisq
MyISAM

Jak porcjować te dane?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.