sql >> Database >  >> RDS >> Mysql

Hoe ibdata1-bestand in MySQL te verkleinen / opschonen?

Dat ibdata1 niet krimpt is een bijzonder vervelende eigenschap van MySQL. De ibdata1 bestand kan niet worden verkleind, tenzij u alle databases verwijdert, de bestanden verwijdert en een dump opnieuw laadt.

Maar u kunt MySQL zo configureren dat elke tabel, inclusief de indexen, als een apart bestand wordt opgeslagen. Op die manier ibdata1 zal niet zo groot worden. Volgens de opmerking van Bill Karwin dit is standaard ingeschakeld vanaf versie 5.6.6 van MySQL.

Het is alweer een tijdje geleden dat ik dit deed. Als u uw server echter wilt instellen om voor elke tabel afzonderlijke bestanden te gebruiken, moet u my.cnf wijzigen om dit in te schakelen:

[mysqld]
innodb_file_per_table=1

https://dev.mysql .com/doc/refman/5.6/en/innodb-file-per-table-tablespaces.html

Omdat u de ruimte van ibdata1 . wilt terugwinnen je moet het bestand eigenlijk verwijderen:

  1. Doe een mysqldump van alle databases, procedures, triggers etc behalve de mysql en performance_schema databases
  2. Alle databases verwijderen behalve de bovenstaande 2 databases
  3. Stop mysql
  4. Verwijder ibdata1 en ib_log bestanden
  5. Start mysql
  6. Herstellen vanaf dump

Wanneer u MySQL start in stap 5, wordt de ibdata1 en ib_log bestanden worden opnieuw gemaakt.

Nu ben je fit om te gaan. Wanneer u een nieuwe database voor analyse aanmaakt, worden de tabellen in aparte ibd* geplaatst bestanden, niet in ibdata1 . Omdat u de database gewoonlijk kort daarna laat vallen, wordt de ibd* bestanden worden verwijderd.

http://dev.mysql.com/doc/refman /5.1/nl/drop-database.html

Je hebt waarschijnlijk dit gezien:
http://bugs.mysql.com /bug.php?id=1341

Met behulp van het commando ALTER TABLE <tablename> ENGINE=innodb of OPTIMIZE TABLE <tablename> men kan gegevens en indexpagina's uit ibdata1 extraheren om bestanden te scheiden. ibdata1 zal echter niet krimpen tenzij u de bovenstaande stappen uitvoert.

Over het information_schema , dat is niet nodig en ook niet mogelijk om te laten vallen. Het zijn in feite gewoon een aantal alleen-lezen weergaven, geen tabellen. En er zijn geen bestanden aan gekoppeld, zelfs geen databasedirectory. Het informations_schema gebruikt de geheugen-db-engine en wordt verwijderd en opnieuw gegenereerd bij het stoppen/herstarten van mysqld. Zie https://dev.mysql.com/doc/ refman/5.7/en/information-schema.html .



  1. Is er een postgres CLOSEST-operator?

  2. Hoe een enkele rij te vergrendelen

  3. SQL DROP-index, DROP-tabel en DROP-databaseverklaringen uitgelegd met voorbeelden

  4. Hoe Pi() werkt in PostgreSQL