Schreiben Sie ein Skript, das ein Skript erstellt
MYSQL_CONN="-hAmazonRDSDNSName -u... -p..."
SQL="SELECT CONCAT('OPTIMIZE TABLE ',table_schema,'.',table_name,';')"
SQL="${SQL} OptimizeTableSQL FROM information_schema.tables WHERE table_schema = 'signs'"
SQL="${SQL} ORDER BY (data_length+index_length)"
mysql ${MYSQL_CONN} -AN -e"${SQL}" > /root/OptimizeAllTables.sql
less /root/OptimizeAllTables.sql
Wenn Sie zufrieden sind, dass das Skript die Aufgabe übernimmt, gehen Sie wie folgt vor:
mysql ${MYSQL_CONN} < /root/OptimizeAllTables.sql
Versuche es !!!
VORBEHALT
Da der Standardwert für innodb_file_per_table ON ist, wird die .ibd
Datei jeder zu optimierenden InnoDB-Tabelle tatsächlich verkleinert. Bei allen MyISAM-Tabellen (von denen ich hoffe, dass Sie sie nicht haben) werden auch ihre .MYD
und .MYI
Dateien verkleinert.
UPDATE 18.09.2012 18:19 EDT
Ich habe gerade Folgendes versucht:
- Instanz1 mit 5G-Festplatte erstellt
- Geänderte Instanz1 auf 10G-Festplatte
- Modifizierte Instance1 bis 5G Datenträger (Fehlermeldung:
Requested storage size (5) cannot be less then the current storage size (10)
)
- Erstellen Sie Instanz2 mit 5G
- Geladene Instanz1 mit 2 MB Daten
- Schnappschuss von Instanz1 erstellt (gleiche Größe: 10G)
Wenn ich den Snapshot wiederherstelle, wird eine dritte Instanz erstellt. DB Snapshot muss die gesamte Serverinstanz sein, kein Dump.
Sie müssen das folgende unordentliche Verfahren ausführen:
- mysqldump die Daten von der 20 GB Instanz
- Erstellen Sie eine neue 10G-Instanz
- Laden Sie den mysqldump in die neue 10-GB-Instanz
- Überprüfen Sie, ob alle gewünschten Daten vorhanden sind
- zerstöre die alten 20GB
Führen Sie in Schritt 4 diese Big Storage Engine-Speicherabfrage sowohl für die 20-GB- als auch für die 10-GB-Instanz aus
SELECT IFNULL(B.engine,'Total') "Storage Engine",
CONCAT(LPAD(REPLACE(FORMAT(B.DSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Data Size", CONCAT(LPAD(REPLACE(
FORMAT(B.ISize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Index Size", CONCAT(LPAD(REPLACE(
FORMAT(B.TSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Table Size" FROM
(SELECT engine,SUM(data_length) DSize,SUM(index_length) ISize,
SUM(data_length+index_length) TSize FROM
information_schema.tables WHERE table_schema NOT IN
('mysql','information_schema','performance_schema') AND
engine IS NOT NULL GROUP BY engine WITH ROLLUP) B,
(SELECT 3 pw) A ORDER BY TSize;
Sie werden sehen, wie viel verschwendeter Speicherplatz bei der Migration von mysqldump auf die neue 10-GB-Instanz verschwunden ist. Dies wird definitiv alle InnoDB-Tabellen defragmentieren. Möglicherweise müssen Sie das obige Skript ( /root/OptimizeAllTables.sql
) ausführen, das ich Ihnen oben gegeben habe, um OPTIMIZE TABLE
alle Tabellen in der signs
Datenbank einmal pro Woche auszuführen , um das .ibd
so klein wie möglich zu halten . Sie können auch die zu überwachende Big Storage Engine-Speicherabfrage ausführen, wenn sie sich 10 GB nähert.
Requested storage size (5) cannot be less then the current storage size (10)
.