Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / MySQLdump медленное восстановление одной конкретной таблицы, остальные-быстро / 19 сообщений из 19, страница 1 из 1
25.09.2013, 16:07:38
    #38407460
Aliced
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQLdump медленное восстановление одной конкретной таблицы, остальные-быстро
Есть восьмигиговый дамп базы.
Код: sql
1.
mysqldump -u root -p --single-transaction  --flush-logs    --ignore-table=...


Дополнительно перед заливкой делаю
Код: sql
1.
SET autocommit=0; SET unique_checks=0; SET foreign_key_checks=0;



Заливка начинается резво, за первый час заливается порядка 10Г, а затем на одной и той же таблице процесс залипает. Причем в процессах видно, что вставка идет, данные в инсерте меняются, дата изменения файла ibdata1 меняется каждую минуту. А на деле файл растет очень медленно, несколько килобайт в час. За ночь файл вырос на 1,5г, и процесс продолжается уже почти сутки. Хотя аналогичные дампы с других баз (с такой же структурой, хотя могут быть и изменения) с таким размером дампа на этом же стенде заливались за 2-3 часа.
Триггеры на инсерт в таблице есть, но в дампе, как и положено, они заводятся только после заливки данных.

В чем могут быть грабли?
...
Рейтинг: 0 / 0
25.09.2013, 16:12:28
    #38407474
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQLdump медленное восстановление одной конкретной таблицы, остальные-быстро
А FK и индексы на таблице есть?
...
Рейтинг: 0 / 0
25.09.2013, 16:35:27
    #38407506
Aliced
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQLdump медленное восстановление одной конкретной таблицы, остальные-быстро
При заливки в пустую базу только этой одной таблицы та же картина.
Вот начало дампа:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
SET autocommit=0; SET unique_checks=0; SET foreign_key_checks=0; 
-- MySQL dump 10.13  Distrib 5.1.61, for Win64 (unknown)
--
-- Host: localhost    Database: ukmserver
-- ------------------------------------------------------
-- Server version	5.1.61-community

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `local_auth_account_journal`
--

DROP TABLE IF EXISTS `local_auth_account_journal`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `local_auth_account_journal` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `account_id` int(11) NOT NULL DEFAULT '0',
  `amount` decimal(20,2) DEFAULT NULL,
  `date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `source_type` smallint(6) unsigned NOT NULL DEFAULT '0',
  `source_id` varchar(40) NOT NULL DEFAULT '0',
  `cash_id` int(11) NOT NULL DEFAULT '0',
  `comment` text,
  `balance` decimal(20,2) DEFAULT NULL,
  `action_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`),
  UNIQUE KEY `date` (`date`,`id`),
  KEY `local_auth_account_journal_FK1` (`account_id`),
  KEY `account_id_date` (`account_id`,`date`),
  KEY `source_type` (`account_id`,`source_type`),
  KEY `source_type_date` (`account_id`,`source_type`,`date`),
  KEY `account_id_id` (`account_id`,`id`),
  CONSTRAINT `local_auth_account_journal_fk` FOREIGN KEY (`account_id`) REFERENCES `local_auth_account` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=24605683 DEFAULT CHARSET=utf8 COMMENT='Проводки по счетам';
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `local_auth_account_journal`
--

LOCK TABLES `local_auth_account_journal` WRITE;
/*!40000 ALTER TABLE `local_auth_account_journal` DISABLE KEYS */;
INSERT INTO `local_auth_account_journal` VALUES (



т.е. внешние ключи есть, но оно отключены на момент заливки
...
Рейтинг: 0 / 0
25.09.2013, 16:40:15
    #38407514
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQLdump медленное восстановление одной конкретной таблицы, остальные-быстро
Aliced,

а autocommit=0; зачем? убрать/переключить пробовали?
...
Рейтинг: 0 / 0
25.09.2013, 17:01:36
    #38407545
Aliced
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQLdump медленное восстановление одной конкретной таблицы, остальные-быстро
Сравнение дампа этой таблицы, сделанного из другой базы (которая заливалась быстро), дало отличие
Код: sql
1.
CREATE TABLE `local_auth_account_journal` (...) ENGINE=InnoDB AUTO_INCREMENT=24605683 DEFAULT CHARSET=utf8 COMMENT=...


AUTO_INCREMENT=24605683-может дать такие тормоза?

Код: sql
1.
SET autocommit=0;



Сейчас попробую убрать, но обычно эта опция значительно ускоряет процесс заливки, а не наоборот.
...
Рейтинг: 0 / 0
25.09.2013, 17:44:33
    #38407608
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQLdump медленное восстановление одной конкретной таблицы, остальные-быстро
AlicedAUTO_INCREMENT=24605683-может дать такие тормоза?
Нет. Это значение вообще не учитывается при заливке данных.
К тому же int(11) - максимально 2147483647, на 2 порядка больше.
...
Рейтинг: 0 / 0
25.09.2013, 17:59:33
    #38407621
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQLdump медленное восстановление одной конкретной таблицы, остальные-быстро
Код: sql
1.
  UNIQUE KEY `date` (`date`,`id`),

индекс уникален изначально (содержит уникальный `id`), зачем тормозить вставку лишней проверкой уникальности?
...
Рейтинг: 0 / 0
25.09.2013, 18:39:23
    #38407659
Aliced
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQLdump медленное восстановление одной конкретной таблицы, остальные-быстро
Cygapb-007,

К сожалению, структуру базы разрабатывала не я, и почему ключи описаны именно так, не скажу.
Для отключения проверки ключей (и ускорения, т.о.) используется
Код: sql
1.
SET unique_checks=0;

, смотрите самую первую строку дампа.
...
Рейтинг: 0 / 0
26.09.2013, 06:56:01
    #38407962
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQLdump медленное восстановление одной конкретной таблицы, остальные-быстро
Aliced, а вот этот дамп, он у вас в граните отлит или пересоздать его можно? если попробовать создать и залить его без поля comment, быстрее не будет?
...
Рейтинг: 0 / 0
26.09.2013, 15:33:30
    #38408588
Aliced
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQLdump медленное восстановление одной конкретной таблицы, остальные-быстро
убрала строчку с
Код: sql
1.
SET autocommit=0;


не помогло.

Убрала строчку
Код: sql
1.
  UNIQUE KEY `date` (`date`,`id`),


прямо из create table. Тоже не помогло.
...
Рейтинг: 0 / 0
26.09.2013, 15:35:31
    #38408590
Aliced
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQLdump медленное восстановление одной конкретной таблицы, остальные-быстро
tanglirAliced, а вот этот дамп, он у вас в граните отлит или пересоздать его можно? если попробовать создать и залить его без поля comment, быстрее не будет?

Да нет, можно сколько угодно, вот только что-то я не могу придумать, как мне дамп без одного столбца сделать, кроме как создать еще одну таблицу, только без этого столбца, скопировать туда данные и потом сделать дамп этой таблицы. Есть вариант попроще?
...
Рейтинг: 0 / 0
26.09.2013, 18:36:07
    #38408877
Aliced
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQLdump медленное восстановление одной конкретной таблицы, остальные-быстро
Удаление из таблицы текстового поля тоже не помогло.
...
Рейтинг: 0 / 0
26.09.2013, 18:52:43
    #38408904
Aliced
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQLdump медленное восстановление одной конкретной таблицы, остальные-быстро
Убрала из запроса create table.. все ключи, кроме первичного.
Помогло!

Какие есть варианты быстрой заливки таблицы (более 3млн строк) с кучей индексов?

Создавать таблицу без индексов, заливать данные, а потом добавлять индексы?
...
Рейтинг: 0 / 0
26.09.2013, 19:04:41
    #38408914
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQLdump медленное восстановление одной конкретной таблицы, остальные-быстро
AlicedСоздавать таблицу без индексов, заливать данные, а потом добавлять индексы?Это как бы best practice.
...
Рейтинг: 0 / 0
27.09.2013, 01:13:06
    #38409145
Aliced
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQLdump медленное восстановление одной конкретной таблицы, остальные-быстро
Этот best practice в mysqldump как-то реализован? --disable-keys для InnoDB не работает ведь.
А вручную править описания 500 таблиц...
...
Рейтинг: 0 / 0
01.10.2013, 11:25:35
    #38412748
Aliced
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQLdump медленное восстановление одной конкретной таблицы, остальные-быстро
Все равно плохо получается. Создаю таблицу, где есть только primary и foreign ключи, заливаю данные, включаю триггеры, (на все про все меньше 40минут) и выполяю
Код: sql
1.
2.
3.
4.
5.
6.
alter table local_auth_account_journal add UNIQUE KEY `date` (`date`,`id`),
 add  KEY `account_id_date` (`account_id`,`date`),
 add  KEY `account_id_id` (`account_id`,`id`),
 add  KEY `local_auth_account_journal_FK1` (`account_id`),
 add  KEY `source_type` (`account_id`,`source_type`),
 add  KEY `source_type_date` (`account_id`,`source_type`,`date`)


В общем, 12 часов уже индексируется.
Если делать не одним оператором, а несколькими, должно получаться еще больше (для создания каждого индекса таблица копируется заново).

Как процесс ускорить?
В параллели запустить не получится, таблица при индекации лочится.
Перевести в MyIsam, проиндексировать и вернуть в InnoDB? Будет ли быстрее?
Тут еще есть вроде InnoDB-plugin, но у меня версия БД 5.1.6, а тут вроде другая версия выходит, и неизвестно, как местный софт на ней будет работать.
...
Рейтинг: 0 / 0
01.10.2013, 20:46:21
    #38413604
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQLdump медленное восстановление одной конкретной таблицы, остальные-быстро
Aliced,

Предлагаю попробовать следуюшее:

1. содать таблицу ВООБШЕ без ключей и залить туда данные.

1.5 как нибудь убедится что данные чистые и не заглючат на создание
инукальных и форенд ключей

2. СОдать все нужные ключи потом, включая примари и форенд.

3. раобратся с индексами и убрать ненужные.
например если есть индекс (А,Б,Ц), то индекс (А, Б)
скорее всего не нужем.
...
Рейтинг: 0 / 0
04.10.2013, 15:07:37
    #38416926
kestrel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQLdump медленное восстановление одной конкретной таблицы, остальные-быстро
Что показывает SHOW FULL PROCESSLIST во время создания индексов?
...
Рейтинг: 0 / 0
04.10.2013, 15:09:55
    #38416931
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQLdump медленное восстановление одной конкретной таблицы, остальные-быстро
автордля создания каждого индекса таблица копируется заново
чего чего делается?
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / MySQLdump медленное восстановление одной конкретной таблицы, остальные-быстро / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]