sql >> Database teknologi >  >> RDS >> Mysql

Sådan repareres MySQL-databaser og tabeller

Denne artikel beskriver, hvordan du reparerer MySQL-tabeller og -databaser. Efterhånden som en databases tabeller vokser, kan der opstå fejl fra tid til anden. Når de gør det, indeholder MySQL flere værktøjer, som du kan bruge til at kontrollere og reparere databasetabeller. For at gøre dette skal du følge procedurerne nedenfor i den rækkefølge, de vises.

Denne artikel gælder kun for produkter, der er angivet i Artikeldetaljer sidebjælke. Du skal have root-adgang til serveren for at følge disse procedurer.

Trin 1:Sikkerhedskopiering af databaserne

Før du forsøger at reparere en database, bør du først sikkerhedskopiere den. Følg disse trin for at sikkerhedskopiere alle filerne fra alle dine databaser:

  1. Log ind på din server ved hjælp af SSH.
  2. Stop MySQL-serveren ved at bruge den passende kommando til din Linux-distribution:
    • For CentOS og Fedora, skriv:
      service mysqld stop
    • For Debian og Ubuntu skal du skrive:

      service mysql stop
  3. Skriv følgende kommando:

    cp -rfv /var/lib/mysql /var/lib/mysql$(date +%s)
    Denne kommando kopierer alle filerne fra alle dine databaser til et mappenavn baseret på det aktuelle klokkeslæt (mere præcist antallet af sekunder, der er gået siden 1. januar 1970). Dette sikrer, at hver database backup er gemt i en mappe, der har et unikt navn. For yderligere beskyttelse kan (og bør) du sikkerhedskopiere databasefilerne til en fjernplacering, der ikke er på serveren.
  4. Genstart MySQL-serveren ved at bruge den passende kommando til din Linux-distribution:

    • For CentOS og Fedora, skriv:
      service mysqld start
    • For Debian og Ubuntu skal du skrive:

      service mysql start

Trin 2:Kørsel af mysqlcheck

Når du har sikkerhedskopieret dine databaser, er du klar til at begynde fejlfinding. mysqlcheck programmet giver dig mulighed for at kontrollere og reparere databaser, mens MySQL kører. Denne funktion er nyttig, når du vil arbejde på en database uden at stoppe hele MySQL-tjenesten.

Derudover mysqlcheck virker på tabeller, der bruger MyISAM- eller InnoDB-databasemotorerne.

Se denne artikel for at få oplysninger om, hvordan du bestemmer, hvilken lagermotor en databasetabel bruger.

For at bruge mysqlcheck , følg disse trin:

  1. Som root-bruger skal du skrive følgende kommando:
    cd /var/lib/mysql
  2. Skriv følgende kommando, og erstat databasen med navnet på den database, du vil kontrollere:

    mysqlcheck database

    Den forrige kommando kontrollerer alle tabellerne i den angivne database. Alternativt, for at kontrollere en specifik tabel i en database, skriv følgende kommando. Erstat databasen med navnet på databasen, og erstat tabellen med navnet på den tabel, du vil kontrollere:

    mysqlcheck database table
  3. Mysqlcheck kontrollerer den angivne database og tabeller. Hvis en tabel består kontrollen, mysqlcheck viser OK til bordet. Men hvis mysqlcheck rapporterer en fejl for en tabel, skal du skrive følgende kommando for at prøve at reparere den. Erstat databasen med databasenavnet og tabel med tabelnavnet:

    mysqlcheck -r database table
  4. Hvis mysqlcheck ikke kan reparere bordet eller tabellerne, skal du gå til følgende procedure.

Trin 3:Kørsel af motorspecifik diagnostik

Hvis du kører mysqlcheck ikke løser problemet, er næste trin at køre diagnostik, der er specifik for den motor, der bruges af databasetabellen eller -tabellerne. Følg den relevante procedure nedenfor for din tabels databaselagermaskine.

Se denne artikel for at få oplysninger om, hvordan du bestemmer, hvilken lagermaskine dine databasetabeller bruger.
Reparation af MyISAM-tabeller med myisamchk

Hvis du bruger MyISAM-lagringsmaskinen til en tabel, kan du køre myisamchk program til at reparere det. For at gøre dette skal du følge disse trin:

myisamchk programmet virker kun for tabeller, der bruger MyISAM-lagringsmotoren. Det virker ikke for InnoDB-motoren.
  1. Stop MySQL-serveren ved at bruge den passende kommando til din Linux-distribution:
    • For CentOS og Fedora, skriv:
      service mysqld stop
    • For Debian og Ubuntu skal du skrive:

      service mysql stop
  2. Skriv følgende kommando:

    cd /var/lib/mysql
  3. Skift til den mappe, hvor databasen er placeret. For eksempel hvis databasen hedder kunder , skriv cd-kunder.
  4. Skriv følgende kommando, og erstat tabellen med navnet på den tabel, du vil kontrollere:

    myisamchk table

    For at kontrollere alle tabellerne i en database skal du skrive følgende kommando:

    myisamchk *.MYI

    Hvis den forrige kommando ikke virker, kan du prøve at slette midlertidige filer, der muligvis forhindrer myisamchk fra at køre korrekt. For at gøre dette, skift tilbage til /var/lib/mysql mappe, og skriv derefter følgende kommando:

    ls */*.TMD
    

    Hvis der er nogle .TMD-filer på listen, skal du skrive følgende kommando for at slette dem:

    rm */*.TMD

    Prøv derefter at køre myisamchk igen.

  5. For at prøve at reparere en tabel skal du skrive følgende kommando og erstatte tabel med navnet på den tabel, du vil reparere:

    myisamchk --recover table
  6. Genstart MySQL-serveren ved at bruge den passende kommando til din Linux-distribution:

    • For CentOS og Fedora, skriv:
      service mysqld start
    • For Debian og Ubuntu skal du skrive:

      service mysql start
  7. Test den eller de reparerede tabeller.
Kørsel af InnoDB-gendannelsesprocessen

Hvis du bruger InnoDB-lagringsmotoren til en databasetabel, kan du køre InnoDB-gendannelsesprocessen. For at gøre dette skal du følge disse trin:

  1. Brug din foretrukne teksteditor til at åbne my.cnf fil på din server. Placeringen af ​​my.cnf fil afhænger af din Linux-distribution:
    • På CentOS og Fedora er my.cnf filen er placeret i /etc bibliotek.
    • På Debian og Ubuntu er my.cnf filen er placeret i /etc/mysql bibliotek.
  2. I my.cnf fil, skal du finde [mysqld] sektion.
  3. Tilføj følgende linje til [mysqld] afsnit:

    innodb_force_recovery=4
  4. Gem ændringerne i my.cnf fil, og genstart derefter MySQL-serveren ved at bruge den passende kommando til din Linux-distribution:

    • For CentOS og Fedora, skriv:
      service mysqld restart
    • For Debian og Ubuntu skal du skrive:

      service mysql restart
  5. Indtast følgende kommando for at eksportere alle databaserne til databases.sql fil:

    mysqldump --all-databases --add-drop-database --add-drop-table --routines > databases.sql
  6. Start mysql program, og prøv derefter at droppe den eller de berørte databaser ved hjælp af DROP DATABASE kommando.

    Hvis MySQL ikke er i stand til at slette en database, kan du slette den manuelt i trin 8 nedenfor, efter du har stoppet MySQL-serveren.
  7. Stop MySQL-serveren ved at bruge den passende kommando til din Linux-distribution:

    • For CentOS og Fedora, skriv:
      service mysqld stop
    • For Debian og Ubuntu skal du skrive:

      service mysql stop
  8. Hvis du ikke var i stand til at slette en database i trin 6, skal du indtaste følgende kommandoer for at slette den manuelt. Erstat databasen med navnet på den database, du vil slette:

    cd /var/lib/mysql
    rm -rf database
    Sørg for, at du ikke sletter mysql eller performance_schema mapper!
  9. Brug din foretrukne teksteditor til at åbne my.cnf fil på din server, og kommenter derefter følgende linje i [mysqld] afsnit som vist:

    #innodb_force_recovery=4
    Dette deaktiverer InnoDB-gendannelsestilstand.
  10. Gem ændringerne i my.cnf fil, og start derefter MySQL-serveren ved at bruge den passende kommando til din Linux-distribution:

    • For CentOS og Fedora, skriv:
      service mysqld start
    • For Debian og Ubuntu skal du skrive:

      service mysql start
  11. Indtast følgende kommando for at gendanne databaserne fra den sikkerhedskopifil, du oprettede i trin 5:

    mysql < databases.sql
  12. Test den gendannede database.

Flere oplysninger

  • For mere information om mysqlcheck , besøg venligst https://dev.mysql.com/doc/refman/5.5/en/mysqlcheck.html.
  • For mere information om myisamchk , besøg venligst https://dev.mysql.com/doc/refman/5.5/en/myisamchk.html.

  1. Dynamisk pivot i oracle sql - Procedure

  2. En præ-udfyldt database virker ikke ved API 28, og der er ingen sådan tabelundtagelse

  3. DATEDIFF() Returnerer forkerte resultater i SQL Server? Læs dette.

  4. EF5:Kan ikke vedhæfte filen '{0}' som databasen '{1}'