2017-12-29 14 views
0

Im Moment habe ich in der Lage gewesen, mit diesem zu kommen:Abfrage num_rows, Größe, num_tables, default_charset, default_collation für alle Datenbanken

SELECT 
    table_schema AS 'name_db', 
    sum(table_rows) AS 'num_rows_db', 
    SUM(data_length + index_length)/1024/1024 AS 'size_db(MB)', 
    count(*) as 'num_tables_db' 
FROM 
    information_schema.TABLES 
GROUP BY table_schema; 

Und nun, um herauszufinden, ich versuche, wie die charset hinzufügen und Kollation für alle Datenbanken, aber ich bin mir nicht sicher, wie es geht.

Ich habe herausgefunden, information_schema.SCHEMATA Tabelle hat DEFAULT_CHARACTER_SET_NAME und DEFAULT_COLLATION_NAME Spalten und ich möchte diese zu meiner obigen Abfrage hinzufügen. Außerdem würde ich gerne wissen, ob es eine einfache Möglichkeit gibt, die db-Größe abhängig von der Größe in Kb oder MB anzuzeigen (zB: wie die HeidiSQL-Zusammenfassung).

Raten müssen ich die Verbindung zwischen diesen zwei Tabellen, eine Art machen mit SCHEMA_NAME aber der Gruppe von meiner ersten Abfrage verwirrt mich:/

+1

Der Zeichensatz und die Sortierung einer Datenbank steuert die Einstellungen für die Tabelle außer _by default_ nicht. Dito für Tabelleneinstellungen versus Spalteneinstellungen. Also, ich frage die Nützlichkeit von dem, was Sie gefragt haben. Ein anderer Ansatz ist es, zu tun ... GROUP_CONCAT (DISTINCT character_set) ... VON COLUMNS ... 'Dies würde zeigen alle Zeichensatz _ aktuell in use_ für jede Datenbank. Bitte klären Sie, ob Sie den Standard wirklich wollen oder was gerade verwendet wird. (Ja, ein "JOIN" wird wahrscheinlich benötigt.) –

+0

@RickJames Eigentlich ist das ein guter Punkt, was ich eigentlich hier erreichen möchte, ist die maximale relevante Information aller Datenbanken meiner Server zu zeigen - ~ 20db pro Box passend in wenig Platz (1 oder 2 cmd fordert Seiten, so dass ich alle Informationen auf einmal sehen kann). Was Sie vorschlagen, alle Zeichensätze zu zeigen, die derzeit für jede Datenbank verwendet werden, klingt nach einer noch besseren Idee, wäre es zu schwierig, meine Abfrage hinzuzufügen? Wie Sie sehen können, sind meine SQL-Fähigkeiten ziemlich rostige, müssen sie schließlich einholen: D – BPL

Antwort

2

Es stellt sich heraus, dass es am besten ist es, die Aggregate und GROUP BY separat für jeden zu tun von den zwei Tabellen benötigt.

SELECT * 
    FROM 
    (
     SELECT table_schema AS 'name_db', 
       sum(table_rows) AS 'num_rows_db', 
       IF(SUM(data_length + index_length) > 1048576, 
        CONCAT(ROUND(SUM(data_length + index_length)/1024/1024), ' MB'), 
        CONCAT(ROUND(SUM(data_length + index_length)/1024), ' KB')) AS 'size_db', 
       count(*) as 'num_tables_db' 
      FROM information_schema.TABLES AS t 
      GROUP BY TABLE_SCHEMA 
    ) AS t 
    JOIN 
    (
     SELECT table_schema AS 'name_db', 
       GROUP_CONCAT(DISTINCT CHARACTER_SET_NAME) AS charsets, 
       GROUP_CONCAT(DISTINCT COLLATION_NAME) AS collations 
      FROM information_schema.COLUMNS 
      GROUP BY TABLE_SCHEMA 
    ) AS c USING (name_db); 

(Es gibt einige Potenzial für die Nutzer von table_schema vs name_db verwechselt werden. Da eine der Alias ​​für die anderen ist, die zwei in einigen Fällen austauschbar sind.)

Sie wünschen können Tack ORDER BY name_db am Ende. Sie können sagen, WHERE TABLE_SCHEMA NICHT IN ('mysql', 'information_schema', 'performance_schema'), um die Systemtabellen zu vermeiden.

Beachten Sie, dass table_rows nur angenähert ist im Fall von InnoDB.

+0

Wow, diese Abfrage ist großartig! Es ist ein gutes Kopfgeld und eine Menge Upvotes wert. Es scheint mir, Sie sind ziemlich Experte mit SQL, ich hätte mir so etwas nicht einfallen lassen. Hoffentlich werden mehr Leute Ihre Antwort aufwerten, da es sich um qualitativ hochwertigen Inhalt handelt. Tyvm. – BPL

+0

Danke für das Lob. Ich habe eine Weile gebraucht. Als Bonus habe ich ein paar Notizen hinzugefügt. –

Verwandte Themen