Hi!

uname -a
Linux mysql1 2.6.16TD322 #8 SMP Thu Jul 27 18:39:45 MSD 2006 i686 unknown 
unknown GNU/Linux

mysqld -V
mysqld  Ver 4.1.22-standard-log for pc-linux-gnu on i686 (MySQL Community 
Edition - Standard (GPL))


Выполнялся такой запрос из под PHP (в нем была допущена ошибка)

 $Query  = "SELECT SQL_SMALL_RESULT DEV.ID,I1.A as A1,I1.B as B1,I1.C as 
C1,I1.D as D1,I2.A as A2,I2.B as B2,I2.C as C2,I2.D as D2,DEV.ID_ROLE,".
           "I3.A as A3,I3.B as B3,I3.C as C3,I3.D as D3,I4.A as A4,I4.B as 
B4,I4.C as C4,I4.D as D4, DEV.SNMPCOMM_C, DEV.SNMPCOMM_M,DEV.LGSNMP,".
           
"DEV.LGSNMP2,DEV.SNMPPORT1,DEV.SNMPPORT2,DEV.LGSSH,MD.NAME_MODEL,DEV.LGDEAD,DEV.LGAUTOCH,DEV.TACACS_KEY_C,DEV.TYPEDEV
 FROM $TBDEV".
           " AS DEV FORCE INDEX (ID_IOF)".
           " LEFT JOIN $TBDEVIP  AS I1 ON I1.ID=DEV.ID_IPADDR".
           " LEFT JOIN $TBDEVIP  AS I2 ON I2.ID=DEV.ID_REALIP".
           " LEFT JOIN $TBDEVIP  AS I3 ON I1.ID=DEV.ID_IPADDR".
           " LEFT JOIN $TBDEVIP  AS I4 ON I2.ID=DEV.ID_REALIP".
           " LEFT JOIN $TBDEVMOD AS MD ON MD.ID=DEV.ID_MODEL".
           " WHERE DEV.ID_IOF=$SubDiv order by 
DEV.LGDEAD,DEV.TYPEDEV,I1.A,I1.B,I1.C,I1.D";


Корректный запрос после того как ошибка была исправлена

 $Query  = "SELECT SQL_SMALL_RESULT DEV.ID,I1.A as A1,I1.B as B1,I1.C as 
C1,I1.D as D1,I2.A as A2,I2.B as B2,I2.C as C2,I2.D as D2,DEV.ID_ROLE,".
           "I3.A as A3,I3.B as B3,I3.C as C3,I3.D as D3,I4.A as A4,I4.B as 
B4,I4.C as C4,I4.D as D4, DEV.SNMPCOMM_C, DEV.SNMPCOMM_M,DEV.LGSNMP,".
           
"DEV.LGSNMP2,DEV.SNMPPORT1,DEV.SNMPPORT2,DEV.LGSSH,MD.NAME_MODEL,DEV.LGDEAD,DEV.LGAUTOCH,DEV.TACACS_KEY_C,DEV.TYPEDEV
 FROM $TBDEV".
           " AS DEV FORCE INDEX (ID_IOF)".
           " LEFT JOIN $TBDEVIP  AS I1 ON I1.ID=DEV.ID_IPADDR".
           " LEFT JOIN $TBDEVIP  AS I2 ON I2.ID=DEV.ID_REALIP".
           " LEFT JOIN $TBDEVIP  AS I3 ON I3.ID=DEV.ID_IPTUN1".
           " LEFT JOIN $TBDEVIP  AS I4 ON I4.ID=DEV.ID_IPTUN2".
           " LEFT JOIN $TBDEVMOD AS MD ON MD.ID=DEV.ID_MODEL".
           " WHERE DEV.ID_IOF=$SubDiv order by 
DEV.LGDEAD,DEV.TYPEDEV,I1.A,I1.B,I1.C,I1.D";


Если сравнить эти два запроса, то легко можно увидеть, что это обычная
ошибка блочного копирования. MySQL должен был бы по идее выдать сообщение о
некорректном связывании таблиц, но вместо этого он выдал это:

MySQLi Error: (1030) Получена ошибка 28 от обработчика таблиц

тоесть системная ошибка нет места на диске. Разбор полетов показал, что при
выполнении такого запроса MySQL съедает всю отведенную ему настройками
память (смотрелось утилитой top), и очень сильно нагружает процессор.

Пояснение к запросу - связывалось три таблицы, в одной устройства, в
другой модели устройств, в третьей IP адреса. Поскольку к устройству
может быть привязано от одного до 4 IP адресов, таблица IP адресов
связывалась 4 раза под разными псевдонимами (и в этой части была
допущена ошибка)

структура таблиц:

$TBDEV

CREATE TABLE `all_dev` (
  `ID` int(10) unsigned NOT NULL auto_increment
  `ID_IPADDR` int(11) unsigned NOT NULL default '0',
  `ID_REALIP` int(11) unsigned NOT NULL default '0',
  `ID_IPTUN1` int(11) unsigned NOT NULL default '0',
  `ID_IPTUN2` int(11) unsigned NOT NULL default '0',
............
  
  PRIMARY KEY  (`ID`),
...........
) ENGINE=MyISAM AUTO_INCREMENT=2374;


$TBDEVIP

CREATE TABLE `dev_ipaddr` (
  `ID` int(10) unsigned NOT NULL auto_increment,
  `A` tinyint(3) unsigned NOT NULL default '0',
  `B` tinyint(3) unsigned NOT NULL default '0',
  `C` tinyint(3) unsigned NOT NULL default '0',
  `D` tinyint(3) unsigned NOT NULL default '0',
....
  PRIMARY KEY  (`ID`),
  KEY `IP` (`A`,`B`,`C`,`D`)
) ENGINE=MyISAM AUTO_INCREMENT=4660;



$TBDEVMOD

CREATE TABLE `dev_model` (
  `ID` int(10) unsigned NOT NULL auto_increment,
   `NAME_MODEL` varchar(40) NOT NULL default '',
.....
  PRIMARY KEY  (`ID`),
.....
) ENGINE=MyISAM AUTO_INCREMENT=22;



--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to