Пожалуйста, помогите, я создал хранимую процедуру со следующим содержимым:
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)
Как восстановить эту таблицу без использования ранее сохраненных данных?