I Linux-operativsystemet finns ett antal kraftfulla kommandon för att hantera filer, processer och systemresurser. Genom att förstå syntaxen och tillämpningen av dessa kommandon kan användaren effektivt administrera och felsöka systemet. Här följer en översikt över några av de vanligaste kommandona som används för att skapa, ta bort, och manipulera filer och processer i Linux, samt hur man kontrollerar systemets hälsa och prestanda.
För att skapa en ny fil i Linux används kommandot touch, följt av filnamnet. Syntaxen ser ut så här:
Exempelvis:
Kommandot skapar en tom fil med namnet "träningsmaterial". Om filen redan existerar, uppdateras tidsstämpeln för filens senaste åtkomst eller ändring.
För att byta namn på en fil används kommandot mv. Syntaxen är:
Exempel:
Detta kommando ändrar filens namn från "träningsmaterial" till "file4".
För att ta bort filer används rm-kommandot. Syntaxen för att ta bort en enskild fil är enkel:
Exempelvis:
För att ta bort flera filer samtidigt används kommandot på följande sätt:
Detta tar bort både "fil2" och "fil3". Det är viktigt att notera att kommandot rm är permanent; det finns ingen papperskorg i Linux där filer kan återställas efter borttagning.
För att lägga till innehåll i en fil används kommandot echo. Här kan man välja att använda en enkel eller dubbel omdirigering. En enkel omdirigering (>) ersätter filens innehåll, medan en dubbel omdirigering (>>) lägger till innehåll utan att ta bort det befintliga. Exempel:
Kommandot ovan skriver in texten "Det här är den bästa PostgreSQL träningskursen" i filen "file4". Om filen inte existerar, skapas den. För att läsa innehållet i en fil används cat-kommandot:
Detta visar innehållet i "file4" på skärmen.
För att kontrollera systemets diskstatus används kommandot df. Om man vill visa resultatet i ett mer lättläst format, kan man använda alternativet -h:
Detta kommando visar information om använd och ledig diskutrymme på alla monterade filsystem.
En annan användbar funktion i Linux är möjligheten att inspektera och hantera processer. Kommandot ps ger en översikt över de aktiva processerna. Man kan specificera alternativ för att visa mer detaljerad information eller filtrera på specifika användare och processer. Exempel:
Kommandot ovan visar alla processer på systemet. För att stoppa en process används kommandot kill, följt av processens PID (Process ID). Exempel:
Detta stoppar processen med PID 1234. För att få en översikt över alla aktuella processer kan man använda kommandot top, som visar en dynamisk lista över processer i realtid.
För att hantera filer och kataloger är det också viktigt att känna till kommandon som mkdir (för att skapa kataloger) och rmdir (för att ta bort tomma kataloger). Exempel:
Om man vill undersöka användarna på systemet, kan man använda kommandot cat /etc/passwd, vilket visar alla användare och deras information.
För att skapa användare på systemet används kommandot useradd. Detta kräver vanligtvis superanvändarbehörighet:
För att lista filerna i en katalog används kommandot ls, och för att visa ytterligare information om filerna (t.ex. ägare och behörigheter) används alternativet -l:
Linux är ett fleranvändarsystem, och filbehörigheter spelar en viktig roll för att skydda systemet och data. Varje fil och katalog har en uppsättning behörigheter som definierar vem som får läsa, skriva eller köra filerna. Behörigheterna representeras som en serie tecken som t.ex. rwxr-xr--, där r betyder läsrättigheter, w betyder skrivrättigheter och x betyder exekveringsrättigheter.
För att skapa flera versioner av samma fil kan man använda touch med en så kallad sekvensnotation. Exempelvis:
Detta skapar nio filer, alla med prefixet "abc" och suffixet "-xyz.txt".
Utöver dessa grundläggande kommandon finns det även mer avancerade verktyg för att söka och extrahera specifikt innehåll från filer. Kommandot grep används för att söka efter specifika ord eller mönster i filer. Exempel:
Detta kommando söker efter ordet "daemon" i filen "file4", oavsett om det är skrivet med stora eller små bokstäver.
För att kombinera kommandon och skicka resultatet från ett kommando som indata till ett annat, används pipen (|). Till exempel kan man kombinera cat och wc för att räkna antalet rader i en fil:
Detta skickar utdata från cat-kommandot till wc -l, som räknar antalet rader i "file4".
För att sammanställa information om systemets prestanda och användning kan man använda kommandon som uname och uptime. Dessa ger information om operativsystemet och systemets drifttid. Exempel:
Det är också bra att känna till kommandot man, som ger tillgång till manualer för alla kommandon. Om man vill läsa manualen för df, kan man använda:
Dessa grundläggande kommandon och tekniker är avgörande för att effektivt navigera i Linux-systemet, förstå dess processer och hantera filer och resurser.
Hur man utför en säkerhetskopiering och återställning av PostgreSQL med PITR (Point-in-Time Recovery)
Vid hantering av PostgreSQL-databaser är en av de mest kritiska processerna att förstå hur man säkerhetskopierar och återställer en databas korrekt, särskilt när det gäller att använda funktioner som kontinuerlig arkivering och återställning till en specifik tidpunkt (Point-in-Time Recovery, PITR). Det är viktigt att förstå de olika stegen involverade i en sådan process och hur varje kommandon och inställning spelar en avgörande roll i att säkerställa databasens konsistens och tillgänglighet.
Först och främst måste vi säkerställa att PostgreSQL-loggar är korrekt arkiverade. Om det inte finns några WAL-filer i arkivkatalogen, kan den senaste loggen ge en ledtråd om vad som kan vara fel. Vid felsökning är det också viktigt att kontrollera att arkivkatalogen är ägd av användaren postgres, att arkiveringskommandot är korrekt konfigurerat och att servern har startats om efter att konfigurationen av postgresql.conf har modifierats.
När WAL-filerna har arkiverats korrekt och finns tillgängliga, kan vi börja med att skapa en basbackup. För att göra detta måste vi först skapa två tablespaces som kommer att underlätta processen att verifiera om säkerhetskopieringen är framgångsrik. Detta görs genom att använda kommandot CREATE TABLESPACE för att skapa nödvändiga tabellutrymmen.
För att utföra själva säkerhetskopieringen används kommandot pg_basebackup, vilket kräver några specifika parametrar:
-
-Ft: Anger att formatet ska vara tar.
-
-p5432: Pekar på den aktuella porten för PostgreSQL-servern.
-
-v: Aktiverar detaljerad utskrift av processen.
-
-D /pgbackup/basebackup: Anger katalogen där säkerhetskopian ska lagras.
Efter att säkerhetskopian är tagen och de olika tar-filerna har skapats, som till exempel base.tar och pg_wal.tar, är vi nu redo att återställa den fysiska säkerhetskopian. För att göra detta måste vi skapa en ny katalog för återställningen och sedan använda kommandon som tar xvf för att extrahera alla filer från säkerhetskopian.
När alla filer är återställda är nästa steg att genomföra en Point-in-Time Recovery. För att göra detta måste vi först stoppa PostgreSQL-klustret. Detta görs med kommandon som sudo systemctl stop postgresql@16-main. Efter att ha stoppat servern och säkerställt att alla filer har återställts korrekt, flyttar vi WAL-filerna till rätt plats och ser till att de arkiverade filerna är korrekt återställda.
Den kritiska aspekten av Point-in-Time Recovery är att säkerställa att de återställda WAL-filerna exakt matchar den punkt i tiden som vi vill återställa till. För att detta ska ske korrekt behöver vi modifiera inställningarna i konfigurationsfilen postgresql.conf och se till att vi har rätt restore_command som pekar på den katalog där de arkiverade WAL-filerna finns. Vi måste också säkerställa att recovery_target_time är korrekt inställd, vilket anger den exakta tidpunkt till vilken återställningen ska göras.
PITR tillåter oss att återställa en databas till en specifik tidpunkt, vilket är avgörande för att hantera katastrofer som kan uppstå i en produktionsmiljö. För att PITR ska fungera korrekt krävs två huvudsakliga komponenter: en fullständig basbackup och tillgång till alla relevanta WAL-filer. Inställningarna för återställningen och återspelningsprocessen måste göras noggrant för att undvika inkonsekvenser eller dataloss.
För att säkerställa en korrekt återställning av en PostgreSQL-databas vid en katastrofsituation är det också viktigt att förstå koncept som återställning från inkrementella säkerhetskopior eller arkiverade WAL-filer. En bra backupstrategi innebär att man inte bara säkerhetskopierar själva databasens innehåll utan också att man tar hänsyn till de arkiverade loggfilerna, vilket gör det möjligt att återställa databasen till vilken punkt som helst i tiden. När återställningen är klar, och alla WAL-filer har korrekt återspelats, kommer databasen att vara i ett konsistent tillstånd, som om inget fel alls hade inträffat.
Det är också viktigt att notera att en riktig säkerhetskopieringsstrategi för PostgreSQL inte bara involverar att göra en basbackup. Det handlar också om att säkerställa att WAL-filer hanteras korrekt och att de kontinuerligt arkiveras för att möjliggöra en fullständig återställning till vilken tidpunkt som helst. Därför krävs både teknisk noggrannhet och en strikt process för att hantera säkerhetskopiering och återställning på ett effektivt sätt.
Hur Index och Reindexering Påverkar Prestanda i PostgreSQL och Hur Man Optimerar Förfrågningar
När man arbetar med PostgreSQL är förståelsen för hur data distribueras och hur förfrågningar optimeras avgörande för att uppnå bästa prestanda. Datadistributionen är en viktig faktor för att bestämma de mest effektiva metoderna för att hämta data. Om en kolumn i en tabell har många olika värden kan query-planeraren välja att använda ett index för snabbare dataåtkomst. Däremot, om en kolumn består av många null-värden, kan en sekventiell skanning vara mer fördelaktig för att uppnå bättre prestanda. Den statistik som erhålls genom kommandot ANALYZE är särskilt värdefull i miljöer där datadistributionen förändras över tid, exempelvis i tabeller som ofta uppdateras eller har hög datagenomströmning. Statistiken gör det möjligt för query-planeraren att justera exekveringsplanen för en förfrågan i enlighet med den aktuella datadistributionen.
För att samla denna statistik i PostgreSQL kan man använda följande kommando:
Verktyget VERBOSE ger detaljerade uppgifter om den insamlade statistiken.
Indexeringens Betydelse för Prestanda
Index är en central komponent i PostgreSQL för att förbättra hastigheten på dataåtkomst. Genom att skapa index kan man effektivisera sökningar, sammanfogningar (joins) och filteroperationer. PostgreSQL erbjuder flera typer av index, bland annat B-tree, GIN (Generalized Inverted Index), GiST (Generalized Search Tree), BRIN (Block Range Indexes) och Hash-index. Standardindexstrukturen i PostgreSQL är B-tree, som är särskilt effektiv för exakta sökningar, intervallfrågor och sortering.
För komplexa datatyper som JSONB, arrayer eller fulltextssökning används GIN-index. GiST-index är användbara för geometriska data och nätverksadresser, medan BRIN-index lämpar sig för stora och naturligt ordnade dataset. Hash-index används framför allt för likhetssökningar, men stöder inte intervallfrågor, vilket gör dem mindre populära än B-tree-index.
När index skapas på en kolumn i en tabell, byggs en sorterad databasstruktur som gör det möjligt för PostgreSQL att snabbt hitta specifika värden. Utan index måste hela tabellen skannas för att hitta de relevanta raderna, vilket kan vara mycket långsamt för stora tabeller. Med ett index kan PostgreSQL istället direkt peka på relevanta rader, vilket dramatiskt förbättrar prestanda. Här är ett exempel på hur man skapar ett index:
Indexens Påverkan på Skrivoperationer
Även om index är användbara för att förbättra läshastigheten på förfrågningar, kan de ha en negativ effekt på skrivoperationer som insättningar, uppdateringar och raderingar. När en skrivoperation utförs måste PostgreSQL inte bara uppdatera tabellen utan även indexet, vilket innebär en extra belastning på systemet. Därför är det viktigt att ha en balans i användningen av index för att undvika överdriven overhead. För att visa alla index på en tabell kan följande fråga användas:
Om ett index inte längre används kan det tas bort med:
Reindexering: Förbättra Prestanda Genom Att Återbygga Index
Kommandot REINDEX är ett värdefullt verktyg för att bygga om ett eller flera index i PostgreSQL. Om ett index blir korrupt eller innehåller för många tomma sidor kan det påverka prestanda negativt. Genom att återbygga indexet kan man eliminera dessa problem och förbättra databasens prestanda.
En vanlig situation som kräver reindexering är när ett index innehåller många tomma sidor, vilket leder till ökade disk-I/O och långsammare frågaexekvering. Reindexering kan då slå samman dessa tomma sidor och förbättra effektiviteten. Reindexering kan också vara nödvändig om man ändrar lagringsparametrar för ett index, till exempel för att minska fragmenteringen genom att justera fyllnadsfaktorn.
Reindexering kan vara en tidskrävande process, särskilt för stora index, och det rekommenderas att detta görs under lågt belastade perioder. Här är några exempel på hur man använder kommandot REINDEX:
Verktyg för Att Identifiera och Åtgärda Prestandaproblem
Det finns flera verktyg och tillägg i PostgreSQL som kan hjälpa till att identifiera och åtgärda prestandaproblem. pgAdmin och DBeaver är populära grafiska verktyg för hantering och optimering av PostgreSQL-databaser. pg_stat_statements är ett tillägg som ger detaljerad statistik om frågaexekvering, inklusive hur ofta en fråga körts och den totala exekveringstiden. pg_top är ett kommandoradsverktyg som ger realtidsstatistik om serverns prestanda, inklusive information om de mest aktiva frågorna.
Underhållsarbete för Att Bibehålla Prestanda
För att upprätthålla databasens integritet och prestanda är det viktigt att regelbundet utföra underhållsarbete. I PostgreSQL innebär detta bland annat att köra kommandona VACUUM, ANALYZE och REINDEX.
Processen VACUUM tar bort gamla eller raderade data (s.k. döda tupler) som inte längre är nödvändiga. Det frigör utrymme i tabeller som kan ha blivit uppblåsta över tid, vilket är vanligt när man använder PostgreSQL:s Multi-version Concurrency Control (MVCC). När man kombinerar VACUUM med ANALYZE, hålls databasens statistik uppdaterad, vilket gör förfrågningar snabbare. Att regelbundet köra VACUUM förhindrar att databasen blir för stor och svårhanterlig.
Att förstå balansen mellan att skapa index och hantera skrivoperationer, samt att veta när och hur man genomför reindexering och underhåll, är avgörande för att säkerställa att en PostgreSQL-databas fungerar optimalt över tid.
Hur lås påverkar PostgreSQL-prestanda och hur man undviker problem
Låsning i PostgreSQL är en central mekanism för att säkerställa datakonsistens och möjliggöra samtidig åtkomst till databasen. Men när lås inte hanteras effektivt kan de orsaka prestandaproblem, såsom dödlås och blockering av tabeller, vilket direkt påverkar effektiviteten i databasen.
PostgreSQL använder flera typer av lås för att kontrollera åtkomst till tabeller, rader och andra databasobjekt, och dessa spelar en avgörande roll för hur databasen fungerar vid flera samtidiga transaktioner. De olika typerna av lås ger olika nivåer av åtkomst och kan användas för att styra hur och när en viss resurs får användas.
Radspecifika lås (Row-Level Locks) är lätta att använda och begränsas till enskilda rader i en tabell. Dessa lås är särskilt användbara för att säkerställa att endast specifika rader påverkas under samtidiga transaktioner, vilket minimerar konflikt på andra rader. Exempel på sådana lås är SELECT FOR UPDATE och SELECT FOR SHARE. Med SELECT FOR UPDATE låses de valda raderna för uppdateringar, vilket hindrar andra transaktioner från att modifiera eller låsa dessa rader tills den aktuella transaktionen är slutförd. Å andra sidan tillåter SELECT FOR SHARE andra transaktioner att läsa raderna men hindrar dem från att låsa dem exklusivt (t.ex. för uppdatering eller borttagning). Dessa radspecifika lås ger ett mer finjusterat kontrollsystem och säkerställer bättre samtidighet än tabellbaserade lås.
Tabellbaserade lås (Table Locks) appliceras på hela tabeller och används oftast för operationer som schemaändringar (t.ex. ALTER TABLE) eller underhållsuppgifter (t.ex. VACUUM FULL). Dessa lås är mer restriktiva och kan orsaka blockering om de hålls av långvariga frågningar, då andra transaktioner inte kan få åtkomst till tabellen förrän låset frigörs. PostgreSQL erbjuder flera typer av tabellåterlåsningar, där ACCESS EXCLUSIVE är den mest restriktiva och används för operationer som att radera tabeller (DROP TABLE), medan ACCESS SHARE tillåter andra transaktioner att läsa tabellen men hindrar schemaändringar.
En annan typ av lås är de delade och exklusiva låsen. Delade lås tillåter flera transaktioner att samtidigt hålla samma lås på en resurs så länge de utför icke-konflikterande operationer (t.ex. att läsa data). Dessa lås blockerar skrivoperationer men tillåter samtidiga läsningar. Exklusiva lås, å andra sidan, ger exklusiv åtkomst till en resurs och blockerar alla andra transaktioner från att läsa eller skriva till den. Exklusiva lås används för operationer som ändrar data eller tabellens struktur, som vid INSERT, UPDATE eller DELETE.
I PostgreSQL finns det också olika låslägen som ger ännu mer finjusterad kontroll över åtkomsten. Row Share-lås till exempel används av SELECT FOR UPDATE och SELECT FOR SHARE och tillåter samtidiga transaktioner att få åtkomst till raderna, så länge de inte utför modifieringar. Access Exclusive-låset är det mest restriktiva och används för operationer som ALTER TABLE eller DROP TABLE, vilket blockerar alla andra operationer på tabellen under hela låsets livslängd.
Ett av de största problemen med låsning i PostgreSQL är dödlås (deadlocks). Dödlås uppstår när två eller flera transaktioner väntar på att frigöra de lås de behöver för att fortsätta sina operationer, vilket skapar ett cykliskt beroende som gör att transaktionerna inte kan fortsätta. PostgreSQL har en mekanism för att upptäcka dödlås, som identifierar situationer där transaktioner blockerar varandra och avbryter en av transaktionerna för att lösa problemet. Även om denna mekanism hjälper till att hålla databasen funktionell, kan en avbruten transaktion leda till ofullständiga operationer och skapa extra arbete för att hantera eller återköra den misslyckade transaktionen.
För att förebygga dödlås och minimera risken för prestandaproblem är det viktigt att följa några grundläggande strategier. En av de viktigaste metoderna är att följa en konsekvent låsordning över alla transaktioner. Om flera transaktioner behöver låsa resurs 1 först och sedan resurs 2, ska denna ordning hållas konsekvent för att förhindra cykliska beroenden. En annan metod är att hålla transaktioner så korta som möjligt för att minska den tid låsen hålls. Ju längre en transaktion håller ett lås, desto större blir risken för konflikt med andra transaktioner, vilket ökar sannolikheten för dödlås.
Ett annat sätt att minska risken för dödlås är att undvika att använda explicita lås om det inte är absolut nödvändigt. PostgreSQL:s interna mekanismer för samtidighetshantering är ofta tillräckliga för att hantera resurser effektivt utan att behöva explicit använda SELECT FOR UPDATE eller andra explicita lås. Förlitar man sig för mycket på explicita lås, kan detta snarare öka risken för dödlås.
Optimering av index är också en viktig aspekt för att förbättra prestanda och minska den tid under vilken lås hålls. Genom att optimera index kan frågor köras snabbare, vilket gör att lås hålls under kortare tid och därmed minskar risken för konflikter och dödlås.
För att ytterligare optimera databasens prestanda och minska låsrelaterade problem är det också avgörande att regelbundet övervaka och analysera aktiva lås och transaktioner. PostgreSQL:s verktyg som pg_stat_activity och pg_locks kan ge insikter om vilka transaktioner som är aktiva och om det finns några mönster eller specifika frågor som ofta orsakar dödlås.
Förutom hantering av lås är det viktigt att förstå begreppen "table bloat" och "Transaction ID (XID) wraparound", som är ytterligare faktorer som påverkar PostgreSQL:s prestanda. Table bloat uppstår när databasen fylls med döda tupplar, vilket gör att lagringsutrymmet utnyttjas ineffektivt. För att förebygga detta bör man regelbundet köra VACUUM och VACUUM FULL, samt optimera autovacuum-inställningarna. Vidare är det viktigt att förstå hur PostgreSQL hanterar XID-wraparound, vilket kan leda till problem om transaktions-ID:t når sitt 32-bitars tak. Genom att köra VACUUM regelbundet och övervaka transaktionsåldern kan man förhindra att detta problem påverkar databasen.
Hur kan man skapa och hantera databaser i Amazon RDS och S3?
Amazon RDS (Relational Database Service) erbjuder en rad funktioner som underlättar hanteringen av databaser genom att automatisera många av de vanliga uppgifterna som provisioning, patching, säkerhetskopiering och återställning. Den stöder populära databaser som PostgreSQL, MySQL, MariaDB, Oracle, SQL Server och Amazon Aurora, vilket gör den flexibel för användning inom olika tekniska miljöer.
RDS gör det också möjligt att enkelt skala både beräknings- och lagringsresurser utan driftstopp, vilket gör det möjligt att snabbt anpassa infrastrukturen efter applikationens behov. Den automatiserade säkerhetskopieringen och point-in-time återställning gör att databaser kan återställas till en specifik tidpunkt, vilket är en avgörande funktion för att upprätthålla dataintegritet och säkerhet. Multi-AZ (Availability Zones) implementationer säkerställer hög tillgänglighet, och failover stöd gör att tjänster kan fortsätta utan avbrott även om en instans går ner.
Säkerheten är också en prioritet för RDS, med funktioner som nätverksisolering via Amazon VPC, kryptering både vid vila och under överföring, samt integrering med AWS IAM (Identity and Access Management) för att hantera åtkomst. Detta ger en stark säkerhetsmodell för databashantering, som kan skräddarsys efter de specifika behoven i en organisation.
En annan viktig aspekt av RDS är dess kostnadseffektivitet. Med betalsystemet för endast de resurser som används och möjligheten att köpa reserverade instanser, ger tjänsten företag en flexibel kostnadsstruktur. Dessutom sköter AWS all underhåll och uppdateringar, vilket innebär att användaren alltid arbetar med den senaste och mest säkra versionen av databasen utan att behöva oroa sig för patchning och uppgraderingar.
För att skapa en RDS-instans för PostgreSQL är processen relativt enkel och kan göras genom några steg i AWS Management Console. Först måste man logga in på AWS och navigera till RDS Dashboard. Där kan man skapa en ny databasinstans genom att välja “Create Database”-knappen. När du väljer PostgreSQL som databasmotor, måste du sedan konfigurera instansens specifikationer såsom identifierare, master-användarnamn och lösenord, samt välja lämplig instansklass och lagringstyp. Efter att ha konfigurerat säkerhetsgrupper och andra avancerade inställningar, kan instansen skapas och anslutas till en PostgreSQL-klient för att börja användas.
Vid anslutning till en RDS-instans är det viktigt att säkerställa att rätt säkerhetsgruppsregler är på plats för att tillåta inkommande trafik via rätt port (standard är 5432 för PostgreSQL). När instansen är tillgänglig, kan man enkelt ansluta till den via en klient som psql eller pgAdmin.
AWS S3 Bucket är en annan grundläggande tjänst inom AWS som används för att lagra och organisera data i molnet. S3-buckets fungerar som digitala behållare för filer och kan hantera obegränsade mängder data, från små filer till stora datamängder. S3 garanterar en hållbarhet på 99.999999999% och en tillgänglighet på 99.99%, vilket gör det till en pålitlig lösning för säker datalagring. Dessutom kan granulara behörigheter ställas in för att kontrollera åtkomst till data, vilket gör det möjligt att hantera säkerhet och åtkomst på ett effektivt sätt.
För att skapa en S3-bucket och ladda upp filer till den är processen enkel. Genom att logga in på AWS Management Console och öppna Amazon S3 Console, kan användaren snabbt skapa en ny bucket och börja ladda upp filer. Det är också möjligt att använda S3 för att skapa datalager eller för att säkerhetskopiera applikationer och andra data till molnet.
Det är viktigt att förstå att både RDS och S3 erbjuder kraftfulla funktioner för att effektivisera drift och hantering av databaser och data. För att optimera användningen av dessa tjänster bör man överväga faktorer som säkerhetsinställningar, skalbarhet och kostnadseffektivitet i sitt val av instans och lagringstyp. Både RDS och S3 gör det möjligt för företag att fokusera på utveckling och applikationer utan att behöva oroa sig för infrastrukturhantering, vilket är en stor fördel i dagens snabbväxande teknologimiljöer.

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский