The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Раздел полезных советов: Быстрй перенос лог-файлов в MySQL"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Разговоры, обсуждение новостей (Public)
Изначальное сообщение [ Отслеживать ]

"Раздел полезных советов: Быстрй перенос лог-файлов в MySQL"  
Сообщение от auto_tips (??) on 18-Мрт-08, 09:11 
Наверняка, каждый сталкивался с задачей переноса лог-файлов из текстовых файлов в различные БД.
И, наверняка, каждый столкнувшийся начинал писать собственные скрипты под это дело.
Причем большинство виденных мной скриптов основывались на построчном чтении/переносе данных.
Данный способ, конечно, хорош и имеет право на существование, но, к сожалению не очень быстр.
Но в MySQL существует способ перенести данные из обычных текстовых файлов в БД
очень и очень быстро при помощи директивы LOAD DATA INFILE

Пример такого скрипта:

#!/bin/bash
nld='/var/log/squid3'    # Путь к лог-файлам
nbd='/opt/backup/squid3' # Путь к папке резервного хранения лог-файлов
nrc=`squid3 -k rotate`   # Команда ротации лог-файлов для данного сервиса
nlf='/var/log/logs2mysql/squid.log' # На всякий случай пишем что и когда делали

mh='localhost' # Mysql host
mu='root'      # Пользователь mysql
mp='secret'    # Его пароль
mb='logs'      # База данных
mt='squid'     # Таблица

echo `date +"%F %T"` "Начало выгрузки" >> $nlf && \

$nrc && \
for i in `ls $nld | grep access.log.`;
do
    year=`date +"%Y"`
    month=`date +"%m"`
    day=`date +"%d"`
    prefix=`date +"%F-%H"`
    test -d $nbd/$year/$month/$day || mkdir -p $nbd/$year/$month/$day && \
    cat $nld/$i | sed -e 's/\"/\\\"/g' | sed -e "s/\'/\\\'/g" | \
      awk ' {print strftime("%F",$1),strftime("%T",$1),$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11} ' | \
      sed -e "s/ /\t/g" > $nld/prepare.log && \
    chmod 0777 $nld/prepare.log && \
    mysql -h $mh -u $mu -p$mp -e "LOAD DATA INFILE \"$nld/prepare.log\" REPLACE INTO TABLE $mb.$mt;" && \
    cat $nld/$i >> $nbd/$year/$month/$day/$prefix.log && rm $nld/$i && rm $nld/prepare.log
done
echo `date +"%F %T"` "Конец выгрузки" >> $nlf

Поля для таблицы ('Поле'-тип)

'date'-date
'time'-time
'timestamp'-varchar(16)(разные сервисы пишут по разному.Кто-то с милисекундами, кто-то без)
'elapsed'-int(20)
'ip'-varchar(15)
'code'-varchar(20)
'size'-int(20)
'method'-varchar(10)
'url'-varchar(255)
'user'-varchar(255)
'direct'-varchar(25)
'mime'-varchar(25)
'hash'-varchar(255)unique

C небольшими изменениями данный скрипт можно приспособить для обработки
лог-файлов не только squid, но и других сервисов. Необходимое условие:
четкое разграничение полей (можно, поиграться с указанием разграничителей полей
в директиве LOAD DATA INFILE).
К преимуществам данного скрипта можно отнести огромное быстродействие
(п4-3,2 1024Мб ОЗУ 4млн. строк за 10-12 сек.).Также по последнему полю "hash" мы можем уникальным
образом идентифицировать строку (при анализе логов за год по squid и net-acct я не обнаружил
одинаковых строк).А также гарантированное попадание всех строк в БД
(т.к. данные не удаляются при сбое mysql).

URL:
Обсуждается: https://www.opennet.ru/tips/info/1610.shtml

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Быстрй перенос лог-файлов в MySQL"  
Сообщение от angra (??) on 18-Мрт-08, 09:11 
Почитать доку по mysql это теперь очень тяжело для админов? И даже те, кто до нее дошел не могут дочитать до конца и бросаются шаманить с sed/awk. Печально.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Быстрй перенос лог-файлов в MySQL"  
Сообщение от Mihail (??) on 20-Мрт-08, 07:58 
А подробней ? Сисадмин - он же не DBA и не программер
А то просто сказать можно все, но это слова
Насчет LOAD DATA идея хорошая, я делал INSERT записей по 500, но перед этим уникальность строки проверять при помощи SELECT, а это уже тормоза при большом числе строк
Надо попробовать будет
Вот только с hash не понятно, это просто контрольная сумма строки лога ?
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Быстрй перенос лог-файлов в MySQL"  
Сообщение от ToSHiC (??) on 21-Мрт-08, 19:00 
для этого есть primary key
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "Быстрй перенос лог-файлов в MySQL"  
Сообщение от coroner email(ok) on 26-Мрт-08, 13:46 
> Вот только с hash не понятно, это просто контрольная сумма строки лога ?

ага.она самая. признак уникальности проверяется именно по оному.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "Быстрй перенос лог-файлов в MySQL"  
Сообщение от max (??) on 25-Мрт-08, 15:25 
пример встудию!
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "Быстрй перенос лог-файлов в MySQL"  
Сообщение от coroner email(ok) on 26-Мрт-08, 13:50 
>Почитать доку по mysql это теперь очень тяжело для админов? И даже
>те, кто до нее дошел не могут дочитать до конца и
>бросаются шаманить с sed/awk. Печально.

Ваше предложение по этому поводу?
ТЗ: необходимо перенести большое количество данных из текстовых файлов в БД. При этом необходимо обеспечить неповторение данных в БД, гарантированное занесение данных в БД, обеспечить резервное копирование исходных текстовых файлов, обеспечить очень быстрый перенос данных.
ждем Вашего ответа.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "Быстрй перенос лог-файлов в MySQL"  
Сообщение от coroner email(ok) on 26-Мрт-08, 13:56 
забыл добавить в ТЗ про экранирование кавычек, обработку дат (LOAD DATA INFILE этого не делает), обработку файлов по шаблону


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Спонсоры:
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2022 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру