16 Jan 2008

Linux - system troubleshooting

Pracując zdalnie na systemach komputerowych, nie sposób jest uniknąć awarii. Awaria może być typowo hardwarowa - z tym nie za bardzo możemy cos zrobić zdalnie, trzeba wpakować sie do jakiegoś środku lokomocji i zając sie tym osobiście.

Inaczej sprawa się ma z awaria softwarowa, taka jakiś czas temu mi sie przytrafiła ... system plików na / uległ uszkodzeniu. Niewiele mogłem wtedy zrobić, wiec tez musiałem sie zając tym nie zdalnie, teraz bogatszy o doświadczenia tamtych dni mogę sobie napisać parę rad.

No to rady sa juz tu:

  • Mieć obraz systemu na dysku hdd, z możliwością zamontowania go przez gruba / lilo. Cos jak płytka startowa, tylko ze z hdd.
  • Zostawić niewielka pusta(!!) partycję na korą możemy wypakować powyższy obraz, lub ściągnąć któraś z wielu maleńkich dystrybucji Linuxa. Rozmiar partycji to max 700MB najlepiej jakby była na partycji podstawowej. Od biedy jeśli mamy sporo ramu można na chwilkę zamazać SWAP.
  • Jeśli spodziewamy sie ze uszkodzeniu uległ system plików, a używamy Linuxa opartego o Debiana (np Ubuntu) możemy sprobować go naprawić podczas startu. Tworząc plik /forcefsck. touch /forcefsck && shutdown -rF now

    Hint

    (wypada tu jeszcze sprawdzić wpisy w /etc/fstab) - partycja / powinna być zamontowana z: "0 1" na końcu.
  • Stworzenie live cd z większością oprogramowania i ustawionymi ipkami (Google: live cd specified for machine using Gentoo Instalation CD)
  • Jeśli mamy pare maszyn to można skorzystać z jakiegoś KVMa lub uruchomić system z init=/bin/bash (Single user mode) i przekierować w jakiś sposób wyjście konsoli na port szeregowy (do rozpatrzenia).
W sumie to na tyle więcej pomysłów chwilowo juz nie mam. Najrozsądniejszym wydaje sie stworzenie nowego systemu (odpowiednie skonfigurowanego) na dysku z którego w razie awarii moglibyśmy wybootowac i chrootowac sie do naszego właściwego systemu i wykonać odpowiednie kroki naprawcze. Uważam, ze jednym z lepszych pomysłów jest tez zostawienie livecd przy serwerze z bootowalnym i w pełni skonfigurowanym środowiskiem pracy (Gentoo nie źle sie do takich rzeczy nadaje) do którego jest możliwość połączenia sie przez ssh.

Mysql - Fast index creation

Pisząc nawet niewielkie aplikacje webowe w miarę wypełniania ich danymi zachodzi potrzeba dodania nowych indeksów to tablic w bazie MySQL, zadanie to nie jest szybkie jeśli nasza tablica ma juz w okolicach miliona rekordów, ponieważ zwyczajne:
 ALTER TABLE tbl_name ADD KEY col_name;
 ALTER TABLE tbl_name ADD KEY key_name ( tbl_name, tbl_name,
 ... );
Trwa bardzo długo, trzeba było wymyślić inny sposób zrobienia takiego zadania. Okazało sie, ze jeden z moich znajomych miał również taki problem, wiec polecił mi (wymagany jest dostęp do zapisu do plików bazy danych), domyślnie na serwerach wirtualnych czegoś takiego sie nie udostępnia, natomiast jeśli mamy serwer dedykowany i konto roota to jesteśmy w stanie bez problemu to przeprowadzić:

UWAGA: Ten sposób został sprawdzony wyłącznie na tabelach typu MyISAM!!!

  1. Tworzymy tabele o takim samym schemacie, ale o nowej nazwie czyli, mamy tablice x stworzymy sobie:
    CREATE TABLE x_new ( ... ) ; -- odpowiednio to uzupełniając
  2. Modyfikujemy odpowiednio strukturę danych (dodajemy indexy)
  3. Wyłączamy serwer MySQL
  4. Kopiujemy plik .MYD starej tabeli do nowej
    cp x.MYD x_new.MYD
    (w tej chwili baza danych jest niespójna, wiec ... )
  5. Uruchamiamy:
    mysqlcheck --repair --use-frm nazwa_bd nazwa_nowej_tabeli
    mysqlcheck --repair --use-frm test x_new
    
  6. No to indeksy są właśnie tworzone, jakimś szybszym sposobem – zapewne wynika to z tego, że dane nie muszą być ciągle dostępne.
  7. Cieszymy sie indeksami
Dlaczego tak sie dzieje, wygląda na to ze robiąc zapytanie ALTER TABLE jest tworzona tymczasowa tablica wg której jest liczony nowy index.

Hints:

CREATE TABLE new_aa ( SHOW CREATE TABLE aa );

Hints2:

INSERT INTO ... SELECT * FROM table