Ошибка 2013: потеря соединения с сервером MySQL во время запроса при выводе таблицы - PullRequest
0 голосов
/ 17 февраля 2020

Пожалуйста, помогите, я создал хранимую процедуру со следующим содержимым:

delimiter $$
CREATE PROCEDURE inst_para_select(IN n int)
BEGIN    
    DECLARE i INT DEFAULT 1;
    WHILE i <= n  DO
        INSERT INTO `para_select` VALUES(i,CONCAT(i,'_test'),NOW());
        SET i = i+1;
    END WHILE;
END $$
delimiter;

Выполните процедуру:

mysql> call inst_para_select(50000000);

После выполнения в течение примерно 3 часов я обнаружил, что выполнение процедуры не удалось, запросив:

mysql> call inst_para_select(50000000);
 ERROR 2013 (HY000): Lost connection to MySQL server during query

Подключите таблицу и состояние базы данных снова и найдите следующую ошибку:

mysql> select count(1) from para_rel;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    8
Current database: music

ERROR 2013 (HY000): Lost connection to MySQL server during query

После запроса журналов было обнаружено, что база данных была выключен и перезапущен:

mysql>  show global status like 'uptime';
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    8
Current database: music

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Uptime        | 42    |
+---------------+-------+
1 row in set (0.03 sec)

Запуск команды проверки таблицы также завершается неудачей:

mysql> use music;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> check table para_rel;
ERROR 2013 (HY000): Lost connection to MySQL server during query

Таблица вставляет данные в обычном режиме, но по-прежнему не может выбрать:

mysql> insert into para_rel values(999999,test);
ERROR 1054 (42S22): Unknown column 'test' in 'field list'
mysql> insert into para_rel(id,name) values(999999,'test');
Query OK, 1 row affected (0.00 sec)

mysql> select * from para_rel where id = 999999;
ERROR 2013 (HY000): Lost connection to MySQL server during query

Создание Индекс в таблице также сообщает об ошибке и дает сбой:

mysql> CREATE INDEX idx_para_rel_id ON para_rel(id);
ERROR 2013 (HY000): Lost connection to MySQL server during query

Как правило, вставка данных возможна, но выбор, создание индекса и проверка таблицы para_select недопустимы. После сообщения об ошибке подождите некоторое время, чтобы снова подключиться к базе данных, прежде чем продолжать использовать базу данных.

Позже было обнаружено, что как только запрашивалась таблица para_rel, произошла вышеуказанная ошибка потери соединения и время работы вернулся к нулю. Установлено, что явление увеличения буферного пула одинаково. От 128М до 2G. После выполнения описанных выше операций ничего не улучшилось.

mysql> show variables like 'innodb_buffer_pool_size';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-----------+
1 row in set (0.01 sec)


mysql> SET GLOBAL innodb_buffer_pool_size = 2147483648;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'innodb_buffer_pool_size';
+-------------------------+------------+
| Variable_name           | Value      |
+-------------------------+------------+
| innodb_buffer_pool_size | 2147483648 |
+-------------------------+------------+
1 row in set (0.00 sec)

mysql> select count(1) from para_rel;
ERROR 2013 (HY000): Lost connection to MySQL server during query

Проверка другой таблицы, созданной таким же образом для операции выбора, подходит:

mysql> check table para_select;
+-------------------+-------+----------+----------+
| Table             | Op    | Msg_type | Msg_text |
+-------------------+-------+----------+----------+
| music.para_select | check | status   | OK       |
+-------------------+-------+----------+----------+
1 row in set (6.35 sec)

И обнаружил, что размер файла другая выбранная таблица больше, чем para_rel:

[root@freelab music]# ls -lrt
total 1204232
-rw-r----- 1 mysql mysql 696254464 Feb 16 02:32 para_select.ibd
-rw-r----- 1 mysql mysql 536870912 Feb 16 03:05 para_rel.ibd
[root@freelab music]# pwd
/mysqldata/music

Я хочу попробовать экспортировать таблицу и импортировать ее, чтобы таблица вернулась в нормальное состояние, но я все еще получаю ошибку:

-bash-4.2$ mysqldump -uroot -p music para_rel > /tmp/music_rel.sql
Enter password:
mysqldump: Error 2013: Lost connection to MySQL server during query when dumping table `para_rel` at row: 7790674

Каждый раз, когда возникает подобная ошибка, журнал ошибок содержит информацию, подобную следующей:

2020-02-16T08:36:09.259538Z mysqld_safe Number of processes running now: 0
2020-02-16T08:36:09.268539Z mysqld_safe mysqld restarted

Была использована команда восстановления таблицы, предполагая, что этот тип таблицы не поддерживается.

mysql> repair table para_rel;
+----------------+--------+----------+---------------------------------------------------------+
| Table          | Op     | Msg_type | Msg_text                                                |
+----------------+--------+----------+---------------------------------------------------------+
| music.para_rel | repair | note     | The storage engine for the table doesn't support repair |
+----------------+--------+----------+---------------------------------------------------------+
1 row in set (0.00 sec)

mysql> insert into para_rel(id,name) values(999999,'test');
Query OK, 1 row affected (0.00 sec)

mysql> select * from para_rel where id = 999999;
ERROR 2013 (HY000): Lost connection to MySQL server during query

mysql> show create table para_rel;
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table    | Create Table                                                                                                                                            |
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------+
| para_rel | CREATE TABLE `para_rel` (
  `id` int DEFAULT NULL,
  `name` varchar(32) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)



Как восстановить эту таблицу без использования ранее сохраненных данных?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...