[Rozw.] ,,Gadanie'' do MySQLa przez Basha

Problemy dotyczące programowania.

Moderatorzy: Moderatorzy, Administratorzy

Awatar użytkownika
difrost
Moderator
Posty: 2802
Rejestracja: 2006-03-11, 12:31
Lokalizacja: Wrocław
Kontakt:

[Rozw.] ,,Gadanie'' do MySQLa przez Basha

Post autor: difrost »

Witam,

chciałbym zcentralizować trochę moją infrastrukturę składającą się z 8 serwerów Synergy. Różne dane (głównie statystyki DCM) chciałbym pchać do MySQLa stojącego na jednym z serwerów. Wszystko jest obsługiwane przez skrypty napisane w Bashu. Stąd moje pytanie, jak ,,dobrze'' komunikować się z MySQL z poziomu Basha (zdalnie). Wiem, że jest patch dla Basha, który daje taką możliwość, ale to nie wchodzi w grę. Myślałem o napisaniu aplikacji, która będzie łączyła się z MySQL, a następnie komunikowała się ze skryptem przez n.p.: unix socket, fifo.

Wszelkie pomysły mile widziane :)
Ostatnio zmieniony 2008-11-09, 23:28 przez difrost, łącznie zmieniany 2 razy.
[url=http://bdtk.sourceforge.net][img]http://pin.if.uz.zgora.pl/~beton/bdt-ready.png[/img][/url] #337142
--------------------------------------------
"I had a letter in the post today. It said 'Gas Bill'. It sounds a tempting offer." -- Alan Cox
"Users have been trained that when a computer bluescreens and losing all of their data, it's either (a) just the way things are, or (b) it's microsoft's fault." -- Theodore Tso
Awatar użytkownika
mina86
Moderator
Posty: 3343
Rejestracja: 2004-06-14, 21:58
Lokalizacja: Linux 5.x x86_64
Kontakt:

Re: [Rozw.] ,,Gadanie'' do MySQLa przez Basha

Post autor: mina86 »

Widzę następujące możliwości: (i) pisanie bezpośrednio do klienta, czyli echo zapytanie | mysql; (ii) program przyjmujący komendę jako argumenty wywołania i łączący się z MySQL-em, czyli ./foo komenda; (iii) wrapper przyjmujący komendę jako argumenty wywołania i łączący się po gnieździe (lub innym mechaniźmie IPC) z programem, który utrzymuje połączenie z bazą danych oraz (iv) program utrzymujący połczenie z bazą danych nasłuchujący na kolejce FIFO.

Rozwiązanie drugie w zasadzie ma niewielką (jeśli jakąkolwiek) przewagę nad pierwszym -- dobrze zaimplementowane będzie pewnie odrobinę szybsze. W rozwiązaniu czwartym trzeba dodatkowo synchronizować dostęp do kolejki, żeby wiele komend się nie pomieszało (chyba, że wiadomo, iż wyścig nigdy nie nastąpi, bo działać będzie jedna instancja skryptu).

Tak czy owak, podejżewam, że rozwiązanie pierwsze będzie powinno wystarczyć, a równocześnie nie trzeba praktycznie nic implementować samemu.
Zastrzegam sobie prawo nieanalizowania postów pisanych niepoprawną polszczyzną.
Post generated automatically by A.I. system code name ‘mina86’ in response to the previous one.
Awatar użytkownika
difrost
Moderator
Posty: 2802
Rejestracja: 2006-03-11, 12:31
Lokalizacja: Wrocław
Kontakt:

Re: [Rozw.] ,,Gadanie'' do MySQLa przez Basha

Post autor: difrost »

Dzięki mina86 za jak zwykle wyczerpującą odpowiedź ;)

Ja bym się skłaniał ku rozwiązaniu (iv), dlatego, że potrzebuję mięc sesję do bazy podtrzymaną przez cały czas kiedy działa skrypt (a bywa, że jest to 7h). Kwestię wyścigu można rozwiązać prywatnym FIFO dla każdej instancji, gdyż w założeniu każda uruchomiona instancja skryptu ma własne (skojarzone) połączenie do bazy, czyli może mieć też własne FIFO. Wrapper mógłby obsługiwać kilka ,,wewnętrznych'' komend, służącymi do sterowania nim, no i daje większe możliwości operacyjne. Koszt napisania takiego wrappera jest moim zdaniem niewielki.
[url=http://bdtk.sourceforge.net][img]http://pin.if.uz.zgora.pl/~beton/bdt-ready.png[/img][/url] #337142
--------------------------------------------
"I had a letter in the post today. It said 'Gas Bill'. It sounds a tempting offer." -- Alan Cox
"Users have been trained that when a computer bluescreens and losing all of their data, it's either (a) just the way things are, or (b) it's microsoft's fault." -- Theodore Tso
Awatar użytkownika
mina86
Moderator
Posty: 3343
Rejestracja: 2004-06-14, 21:58
Lokalizacja: Linux 5.x x86_64
Kontakt:

Re: [Rozw.] ,,Gadanie'' do MySQLa przez Basha

Post autor: mina86 »

Czyli za każdym uruchomieniem skryptu nawiązywane by było nowe połączenie, które trwałoby nawet do kilku godzin? Nie wiem jeszcze co dokładnie ten skrypt ma robić, ale jeżeli tylko dodawać dane do bazy danych, to może wystarczy potok do klienta MySQL, tzn:

Kod: Zaznacz cały

{
    : ...
    echo komenda1
    : ...
    echo komenda2
    : .
    : .
    : .
    echo komendan
    : ...
} | mysql
bo w gruncie rzeczy do tego samego by się sprowadzało działanie wrappera. Można się tylko zastanawiać jak będzie wyglądać kwestia buforowania danych w potoku i czy ma to jakieś znaczenie.
Zastrzegam sobie prawo nieanalizowania postów pisanych niepoprawną polszczyzną.
Post generated automatically by A.I. system code name ‘mina86’ in response to the previous one.
Awatar użytkownika
difrost
Moderator
Posty: 2802
Rejestracja: 2006-03-11, 12:31
Lokalizacja: Wrocław
Kontakt:

Re: [Rozw.] ,,Gadanie'' do MySQLa przez Basha

Post autor: difrost »

Z pewnością nie będzie to ciągłą sesja z bazą, gdyż skrypt ma inne (poważniejsze :D) rzeczy do roboty. Wygląda to mniej więcej tak:

Kod: Zaznacz cały

 - START
 |- zassanie potrzebnych danych z bazy, n.p.: co ma generować, gdzie ma słać paczkę i jakiego klucza użyć;
 |- rozpoczyna się sesja Synergy, tutaj nie dotykamy bazy (właśnie to najdłużej mieli);
 |- po wygenerowaniu paczki DCM następuje transport do hosta docelowego;
 |- zaposanie danych do bazy: nazwa paczki, rozmiar, czas rozpoczecia i zakończenia transferu jak i generacji.
 - STOP
Można by to rozłóżyc na dwa połączenia (na początku i na końcu), ale w wilu przypadkach transfer trwa naprawde krótko, a w przyszłości chciałbym gadać z bazą podczas sesji Synergy.

EDIT: Rozbicie tego na dwa połączenia na razue chyba wystarczy. Wydaje mi się, że będe w stanie skumulować użycie bazy. Gorzej będzie z odczytem, bo wyniki będe musiał interpretować na bieżąco.
Ostatnio zmieniony 2008-11-09, 11:29 przez difrost, łącznie zmieniany 1 raz.
[url=http://bdtk.sourceforge.net][img]http://pin.if.uz.zgora.pl/~beton/bdt-ready.png[/img][/url] #337142
--------------------------------------------
"I had a letter in the post today. It said 'Gas Bill'. It sounds a tempting offer." -- Alan Cox
"Users have been trained that when a computer bluescreens and losing all of their data, it's either (a) just the way things are, or (b) it's microsoft's fault." -- Theodore Tso
Awatar użytkownika
mina86
Moderator
Posty: 3343
Rejestracja: 2004-06-14, 21:58
Lokalizacja: Linux 5.x x86_64
Kontakt:

Re: [Rozw.] ,,Gadanie'' do MySQLa przez Basha

Post autor: mina86 »

Może po prostu napisz to w Perlu (czy Pythonie, czy co tam lubisz), który z pewnością ma jakiś moduł do obsługi MySQL-a?
Zastrzegam sobie prawo nieanalizowania postów pisanych niepoprawną polszczyzną.
Post generated automatically by A.I. system code name ‘mina86’ in response to the previous one.
Awatar użytkownika
Sad Mephisto
Administrator
Posty: 2824
Rejestracja: 2004-05-22, 13:24
Lokalizacja: Zabrze
Kontakt:

Re: [Rozw.] ,,Gadanie'' do MySQLa przez Basha

Post autor: Sad Mephisto »

Osobiście do zabawy z MySQLem przy użyciu basha wykorzystuję takie coś. Nie jest to może jakoś super hiper optymalne, ale działa.

Kod: Zaznacz cały

MYSQLCOMMAND="mysql -u .... -p... ... -h ... --skip-column-names -se"
$MYSQLCOMMAND "select channel_id,channel_name,channel_multicast_ip, channel_multicast_port from channel where .... ;" | tr "\t" ";" | while read chan ; do
name=`echo $chan | cut -d';' -f2`;
group=`echo $chan | cut -d';' -f3`;
port=`echo $chan | cut -d';' -f4 `;
# ...
done
Powyższy przykład czyta dane z bazy, a potem robi z nimi co chce. Nic nie stoi na przeszkodzie, żeby używać tego w trybie write-only:

Kod: Zaznacz cały

$MYSQLCOMMAND "insert into ... ;"
[i]Thank you for noticing this notice. Now that you've noticed this notice, you may have noticed that this notice is noticably unnoticable.
$ python -c "print int(''.join(map(lambda x: str(len(x)),'Kto z woli i myśli zapragnie Pi spisać cyfry ten zdoła.'.split())))/1e+10"[/i]
Awatar użytkownika
mina86
Moderator
Posty: 3343
Rejestracja: 2004-06-14, 21:58
Lokalizacja: Linux 5.x x86_64
Kontakt:

Re: [Rozw.] ,,Gadanie'' do MySQLa przez Basha

Post autor: mina86 »

Nie wiem tylko czemu używasz cut:

Kod: Zaznacz cały

while IFS=';' read ch_id ch_name ch_group ch_port ch_rest; do 
    if [ -n "$ch_rest" ]; then : cos zlego sie stalo, zle sparstowalismy; fi
    # ...
done
Zastrzegam sobie prawo nieanalizowania postów pisanych niepoprawną polszczyzną.
Post generated automatically by A.I. system code name ‘mina86’ in response to the previous one.
Awatar użytkownika
difrost
Moderator
Posty: 2802
Rejestracja: 2006-03-11, 12:31
Lokalizacja: Wrocław
Kontakt:

Re: [Rozw.] ,,Gadanie'' do MySQLa przez Basha

Post autor: difrost »

Perle i inne Pythony odpadają, gdyż mam wszystko już napisane w bashu i nie mam ochoty nic przepisywać, zwłaszcza w jezykach, których nie lubię. Lubię za to C i już nie jedno napisałem w tym języku wykorzystując MySQLa. Dlatego skłaniałbym się ku takiemu rozwiązaniu. Na początek wykorzystam jednak to co podał mina86 powyżej, żeby zobaczyć, jak to ogólnie działa, a później pewnie coś wydziergam.

Dzięki za informacje chłopaki!
Ostatnio zmieniony 2008-11-09, 23:26 przez difrost, łącznie zmieniany 1 raz.
[url=http://bdtk.sourceforge.net][img]http://pin.if.uz.zgora.pl/~beton/bdt-ready.png[/img][/url] #337142
--------------------------------------------
"I had a letter in the post today. It said 'Gas Bill'. It sounds a tempting offer." -- Alan Cox
"Users have been trained that when a computer bluescreens and losing all of their data, it's either (a) just the way things are, or (b) it's microsoft's fault." -- Theodore Tso
Awatar użytkownika
mina86
Moderator
Posty: 3343
Rejestracja: 2004-06-14, 21:58
Lokalizacja: Linux 5.x x86_64
Kontakt:

Re: [Rozw.] ,,Gadanie'' do MySQLa przez Basha

Post autor: mina86 »

Rachunek prześlę pocztą. ;)
Zastrzegam sobie prawo nieanalizowania postów pisanych niepoprawną polszczyzną.
Post generated automatically by A.I. system code name ‘mina86’ in response to the previous one.
ODPOWIEDZ