MySQL импорт большого файла - Форум успешных вебмастеров - GoFuckBiz.com
 
 
Форум успешных вебмастеров - GoFuckBiz.com

  Форум успешных вебмастеров - GoFuckBiz.com > Бизнес-решения > Скрипты, программы и технические решения
Дата
USD/RUB89.7026
BTC/USD69305.3095
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии.

Закрытая тема
Опции темы Опции просмотра
Старый 27.01.2012, 01:35   #1
Dumpty
Senior Member
 
Аватар для Dumpty
 
Регистрация: 08.05.2008
Сообщений: 834
Бабло: $258860
Отправить сообщение для Dumpty с помощью ICQ
По умолчанию MySQL импорт большого файла

Всем привет
Нужно импортировать в мускул файл порядка 5гб (более 100 миллионов строк).
1) Пробовал инсертами сначала 1 инсерт - 1 строка. Заняло неделю, и часть инсертов вылетала с ошибками mysql server gone away
2) Пробовал LOAD DATA INFILE, думает сутки, потом убиваю скрипт и добавляется 20-30кк только.
3) Пробовал LOAD DATA INFILE и разбить файл по 100мб, первые 3-4 файла влетают за 10 минут и далее с каждым последующим запросом времени уходит больше и больше. Когда размер таблицы стал более 300мб - то время увеличивается в геометрической прогрессии.
4) Пробовал через mysqlimport - тоже самое что и пункт 2
5) Пробовал LOAD DATA INFILE через временные таблицы - тоже херня, мускул принимает куски по 20мб, весь файл не берёт. Тупо пишет что нет места в темп таблице (The table 'temp_test' is full). Гуглил пол дня - не нашёл какие параметры отвечают за размер временной таблицы, кроме
max_heap_table_size = 300M
tmp_table_size = 300M
300МБ это уже я поставил настройки, и попробовал вогнать файл 100мб, таже самая ошибка "The table 'temp_test' is full".
Временную таблицу делал engine HEAP.
Точнее и так и так:
type=heap
engine=memory


Вобщем вот такие вот проблемы, как это реализовать?
Просто один раз вогнать данные фиг с ними можно подождать неделю. Но данные добавлятся в таблицу будут постоянно, и сколько времени будет это занимать - страшно подумать.
Dumpty вне форума  
Старый 27.01.2012, 01:40   #2
Юнга
white powder
 
Аватар для Юнга
 
Регистрация: 29.04.2007
Сообщений: 2,692
Бабло: $370670
По умолчанию

вот вроде бы аналог SqlBulkCopy (которым решал подобное на MSSQL) под мускул

http://www.devart.com/dotconnect/mys...SqlLoader.html

во еще, это наверное больше подойдет
http://dev.mysql.com/doc/refman/5.0/en/load-data.html
__________________
господин мойва любит вас 🙄https://t.me/musica_finale | у каждого есть история: https://anchor.fm/hibrokakbiz 🙉🎤🙊
Юнга вне форума  
Старый 27.01.2012, 01:45   #3
Ower
ё
 
Аватар для Ower
 
Регистрация: 26.10.2011
Сообщений: 1,520
Бабло: $311895
По умолчанию

http://sypex.net/
Ower вне форума  
Старый 27.01.2012, 01:45   #4
Dumpty
Senior Member
 
Аватар для Dumpty
 
Регистрация: 08.05.2008
Сообщений: 834
Бабло: $258860
ТС -->
Отправить сообщение для Dumpty с помощью ICQ
автор темы ТС По умолчанию

Цитата:
Сообщение от Юнга Посмотреть сообщение
вот вроде бы аналог SqlBulkCopy (которым решал подобное на MSSQL) под мускул

http://www.devart.com/dotconnect/mys...SqlLoader.html

во еще, это наверное больше подойдет
http://dev.mysql.com/doc/refman/5.0/en/load-data.html
http://dev.mysql.com/doc/refman/5.0/en/load-data.html это и есть LOAD DATA INFILE про который я написал
Dumpty вне форума  
Старый 27.01.2012, 01:45   #5
baadf00d
несъедобный
 
Аватар для baadf00d
 
Регистрация: 06.04.2007
Сообщений: 692
Бабло: $79495
По умолчанию

попробуй выключить индексы перед началом инсерта и убедись, что key_buffer_size (вроде так пишется, это если майисам движок) достаточного размера
загружать надо через load data infile, это ты в правильном направлении мыслишь
самая жопа при инсерте - это индексы
еще разбивка таблицы по партициям сильно помогает при инсерте, но работать становится неудобно и косяки мерзкие вылезают
__________________
миром правит не тайная ложа, а явная лажа
baadf00d вне форума  
Старый 27.01.2012, 01:46   #6
Юнга
white powder
 
Аватар для Юнга
 
Регистрация: 29.04.2007
Сообщений: 2,692
Бабло: $370670
По умолчанию

индексы да, надо отключать.
__________________
господин мойва любит вас 🙄https://t.me/musica_finale | у каждого есть история: https://anchor.fm/hibrokakbiz 🙉🎤🙊
Юнга вне форума  
Старый 27.01.2012, 01:46   #7
Dumpty
Senior Member
 
Аватар для Dumpty
 
Регистрация: 08.05.2008
Сообщений: 834
Бабло: $258860
ТС -->
Отправить сообщение для Dumpty с помощью ICQ
автор темы ТС По умолчанию

Цитата:
Сообщение от Ower Посмотреть сообщение
Это немного не то, мне надо своими скриптами вгонять данные
Dumpty вне форума  
Старый 27.01.2012, 01:47   #8
Dumpty
Senior Member
 
Аватар для Dumpty
 
Регистрация: 08.05.2008
Сообщений: 834
Бабло: $258860
ТС -->
Отправить сообщение для Dumpty с помощью ICQ
автор темы ТС По умолчанию

Цитата:
Сообщение от baadf00d Посмотреть сообщение
попробуй выключить индексы перед началом инсерта и убедись, что key_buffer_size (вроде так пишется, это если майисам движок) достаточного размера
загружать надо через load data infile, это ты в правильном направлении мыслишь
самая жопа при инсерте - это индексы
еще разбивка таблицы по партициям сильно помогает при инсерте, но работать становится неудобно и косяки мерзкие вылезают
key_buffer_size поставить 5гб если файл входной 5гб тоже?
А у меня рам всего 4гб на сервере, это не положит серв?)
Dumpty вне форума  
Старый 27.01.2012, 03:38   #9
imgreen
Senior Member
 
Аватар для imgreen
 
Регистрация: 15.11.2008
Сообщений: 13,239
Бабло: $247847001
По умолчанию

за 1 инсерт можно сразу множество записей добавлять, кури синтаксис, делай по 1к (можно и больше) записей за инсерт и будет быстро
imgreen вне форума  
Старый 27.01.2012, 05:06   #10
chesser
автоматизирую интернеты
 
Аватар для chesser
 
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,362
Бабло: $470735
По умолчанию

Цитата:
Сообщение от Dumpty Посмотреть сообщение
max_heap_table_size = 300M
tmp_table_size = 300M
300МБ это уже я поставил настройки, и попробовал вогнать файл 100мб, таже самая ошибка "The table 'temp_test' is full".
Временную таблицу делал engine HEAP.
Точнее и так и так:
type=heap
engine=memory
engine memory или heap тут не причем

Цитата:
Сообщение от baadf00d
попробуй выключить индексы перед началом инсерта и убедись, что key_buffer_size (вроде так пишется, это если майисам движок) достаточного размера
призываешь выключить индексы - это ок, но зачем тогда увеличивать key_buffer_size?

а в целом да, вырубить индексы, использовать bulk insert'ы, если есть какая-то математика, можно prepared statements делать

если нужно поле типа автоинкремента - перед импортом его удаляешь, делаешь импорт, потом вставляешь это поле.

Цитата:
key_buffer_size поставить 5гб если файл входной 5гб тоже?
А у меня рам всего 4гб на сервере, это не положит серв?)
хуйней не занимайся

кстати, иногда надо импортить через промежуточные таблицы, обычно это связано как раз с индексами, например, вместо insert нужно делать что-то типа replace или insert...on duplicate update. engine memory пошустрее справится, но тут размер таблицы всегда ограничен и точно фиксирован, поэтому нужно программно организовывать "пачки", если рамы не хватает
__________________
USA и NL серверы и VPS | wiki | блог | Drupal | NginxТДС
Ave, Google, morituri te salutant! © chesser
chesser вне форума