Support column analysis with produre analyse
This commit is contained in:
parent
21860fe395
commit
29fb53694e
1 changed files with 87 additions and 12 deletions
|
@ -988,6 +988,35 @@ sub select_one {
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# MySQL Request one
|
||||||
|
sub select_one_g {
|
||||||
|
my $pattern = shift;
|
||||||
|
|
||||||
|
my $req = shift;
|
||||||
|
debugprint "PERFORM: $req ";
|
||||||
|
my @result = `$mysqlcmd $mysqllogin -re "\\w$req\\G" 2>>/dev/null`;
|
||||||
|
if ( $? != 0 ) {
|
||||||
|
badprint "failed to execute: $req";
|
||||||
|
badprint "FAIL Execute SQL / return code: $?";
|
||||||
|
debugprint "CMD : $mysqlcmd";
|
||||||
|
debugprint "OPTIONS: $mysqllogin";
|
||||||
|
debugprint `$mysqlcmd $mysqllogin -Bse "$req" 2>&1`;
|
||||||
|
|
||||||
|
#exit $?;
|
||||||
|
}
|
||||||
|
debugprint "select_array: return code : $?";
|
||||||
|
chomp(@result);
|
||||||
|
return (grep { /$pattern/ } @result)[0];
|
||||||
|
}
|
||||||
|
sub select_str_g {
|
||||||
|
my $pattern = shift;
|
||||||
|
|
||||||
|
my $req = shift;
|
||||||
|
my $str=select_one_g $pattern, $req;
|
||||||
|
my @val=split /:/, $str;
|
||||||
|
shift @val;
|
||||||
|
return trim(@val);
|
||||||
|
}
|
||||||
sub get_tuning_info {
|
sub get_tuning_info {
|
||||||
my @infoconn = select_array "\\s";
|
my @infoconn = select_array "\\s";
|
||||||
my ( $tkey, $tval );
|
my ( $tkey, $tval );
|
||||||
|
@ -5577,13 +5606,13 @@ sub mysql_databases {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
my @dblist = select_array("SHOW DATABASES;");
|
my @dblist = select_array("SELECT DISTINCT TABLE_SCHEMA FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT IN ( 'mysql', 'performance_schema', 'information_schema', 'sys' );");
|
||||||
infoprint "There is " . scalar(@dblist) . " Database(s).";
|
infoprint "There is " . scalar(@dblist) . " Database(s).";
|
||||||
my @totaldbinfo = split /\s/,
|
my @totaldbinfo = split /\s/,
|
||||||
select_one(
|
select_one(
|
||||||
"SELECT SUM(TABLE_ROWS), SUM(DATA_LENGTH), SUM(INDEX_LENGTH) , SUM(DATA_LENGTH+INDEX_LENGTH), COUNT(TABLE_NAME),COUNT(DISTINCT(TABLE_COLLATION)),COUNT(DISTINCT(ENGINE)) FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT IN ( 'mysql' );"
|
"SELECT SUM(TABLE_ROWS), SUM(DATA_LENGTH), SUM(INDEX_LENGTH) , SUM(DATA_LENGTH+INDEX_LENGTH), COUNT(TABLE_NAME),COUNT(DISTINCT(TABLE_COLLATION)),COUNT(DISTINCT(ENGINE)) FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT IN ( 'mysql', 'performance_schema', 'information_schema', 'sys' );"
|
||||||
);
|
);
|
||||||
infoprint "All Databases:";
|
infoprint "All User Databases:";
|
||||||
infoprint " +-- TABLE : "
|
infoprint " +-- TABLE : "
|
||||||
. ( $totaldbinfo[4] eq 'NULL' ? 0 : $totaldbinfo[4] ) . "";
|
. ( $totaldbinfo[4] eq 'NULL' ? 0 : $totaldbinfo[4] ) . "";
|
||||||
infoprint " +-- ROWS : "
|
infoprint " +-- ROWS : "
|
||||||
|
@ -5621,15 +5650,6 @@ sub mysql_databases {
|
||||||
print "\n" unless ( $opt{'silent'} or $opt{'json'} );
|
print "\n" unless ( $opt{'silent'} or $opt{'json'} );
|
||||||
|
|
||||||
foreach (@dblist) {
|
foreach (@dblist) {
|
||||||
chomp($_);
|
|
||||||
if ( $_ eq "information_schema"
|
|
||||||
or $_ eq "performance_schema"
|
|
||||||
or $_ eq "mysql"
|
|
||||||
or $_ eq "" )
|
|
||||||
{
|
|
||||||
next;
|
|
||||||
}
|
|
||||||
|
|
||||||
my @dbinfo = split /\s/,
|
my @dbinfo = split /\s/,
|
||||||
select_one(
|
select_one(
|
||||||
"SELECT TABLE_SCHEMA, SUM(TABLE_ROWS), SUM(DATA_LENGTH), SUM(INDEX_LENGTH) , SUM(DATA_LENGTH+INDEX_LENGTH), COUNT(DISTINCT ENGINE),COUNT(TABLE_NAME),COUNT(DISTINCT(TABLE_COLLATION)),COUNT(DISTINCT(ENGINE)) FROM information_schema.TABLES WHERE TABLE_SCHEMA='$_' GROUP BY TABLE_SCHEMA ORDER BY TABLE_SCHEMA"
|
"SELECT TABLE_SCHEMA, SUM(TABLE_ROWS), SUM(DATA_LENGTH), SUM(INDEX_LENGTH) , SUM(DATA_LENGTH+INDEX_LENGTH), COUNT(DISTINCT ENGINE),COUNT(TABLE_NAME),COUNT(DISTINCT(TABLE_COLLATION)),COUNT(DISTINCT(ENGINE)) FROM information_schema.TABLES WHERE TABLE_SCHEMA='$_' GROUP BY TABLE_SCHEMA ORDER BY TABLE_SCHEMA"
|
||||||
|
@ -5749,6 +5769,58 @@ sub mysql_databases {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Recommendations for database columns
|
||||||
|
sub mysql_tables {
|
||||||
|
return if ( $opt{dbstat} == 0 );
|
||||||
|
|
||||||
|
subheaderprint "Table Column Metrics";
|
||||||
|
unless ( mysql_version_ge( 5, 5 ) ) {
|
||||||
|
infoprint
|
||||||
|
"Skip Database metrics from information schema missing in this version";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
my @dblist = select_array("SELECT DISTINCT TABLE_SCHEMA FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT IN ( 'mysql', 'performance_schema', 'information_schema', 'sys' );");
|
||||||
|
foreach (@dblist) {
|
||||||
|
my $dbname=$_;
|
||||||
|
next unless defined $_;
|
||||||
|
infoprint "Database: " . $_ . "";
|
||||||
|
my @dbtable = select_array(
|
||||||
|
"SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA='$dbname' AND TABLE_TYPE='BASE TABLE' ORDER BY TABLE_NAME"
|
||||||
|
);
|
||||||
|
foreach(@dbtable) {
|
||||||
|
my $tbname=$_;
|
||||||
|
infoprint " +-- TABLE: $tbname";
|
||||||
|
my @tbcol=select_array(
|
||||||
|
"SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='$dbname' AND TABLE_NAME='$tbname'" );
|
||||||
|
foreach(@tbcol) {
|
||||||
|
my $ctype=select_one(
|
||||||
|
"SELECT COLUMN_TYPE FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='$dbname' AND TABLE_NAME='$tbname' AND COLUMN_NAME='$_' " );
|
||||||
|
my $isnull=select_one(
|
||||||
|
"SELECT IS_NULLABLE FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='$dbname' AND TABLE_NAME='$tbname' AND COLUMN_NAME='$_' " );
|
||||||
|
infoprint " +-- Column $tbname.$_:" ;
|
||||||
|
my $current_type=uc($ctype). ($isnull eq 'NO'?" NOT NULL":"");
|
||||||
|
my $optimal_type=select_str_g("Optimal_fieldtype", "SELECT $_ FROM $dbname.$tbname PROCEDURE ANALYSE(100000)");
|
||||||
|
|
||||||
|
if ( $current_type ne $optimal_type )
|
||||||
|
{
|
||||||
|
infoprint " Current Fieldtype: $current_type";
|
||||||
|
infoprint " Optimal Fieldtype: $optimal_type";
|
||||||
|
badprint
|
||||||
|
"Consider changing type for column $_ in table $dbname.$tbname";
|
||||||
|
push( @generalrec,
|
||||||
|
"ALTER TABLE $dbname.$tbname MODIFY $_ $optimal_type;" );
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
goodprint "$dbname.$tbname ($_) type: $current_type";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# Recommendations for Indexes metrics
|
# Recommendations for Indexes metrics
|
||||||
sub mysql_indexes {
|
sub mysql_indexes {
|
||||||
return if ( $opt{idxstat} == 0 );
|
return if ( $opt{idxstat} == 0 );
|
||||||
|
@ -5998,6 +6070,7 @@ sub which {
|
||||||
# BEGIN 'MAIN'
|
# BEGIN 'MAIN'
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
headerprint; # Header Print
|
headerprint; # Header Print
|
||||||
|
|
||||||
validate_tuner_version; # Check last version
|
validate_tuner_version; # Check last version
|
||||||
mysql_setup; # Gotta login first
|
mysql_setup; # Gotta login first
|
||||||
os_setup; # Set up some OS variables
|
os_setup; # Set up some OS variables
|
||||||
|
@ -6010,6 +6083,8 @@ system_recommendations; # avoid to many service on the same host
|
||||||
log_file_recommandations; # check log file content
|
log_file_recommandations; # check log file content
|
||||||
check_storage_engines; # Show enabled storage engines
|
check_storage_engines; # Show enabled storage engines
|
||||||
mysql_databases; # Show informations about databases
|
mysql_databases; # Show informations about databases
|
||||||
|
mysql_tables; # Show informations about table column
|
||||||
|
|
||||||
mysql_indexes; # Show informations about indexes
|
mysql_indexes; # Show informations about indexes
|
||||||
security_recommendations; # Display some security recommendations
|
security_recommendations; # Display some security recommendations
|
||||||
cve_recommendations; # Display related CVE
|
cve_recommendations; # Display related CVE
|
||||||
|
|
Loading…
Reference in a new issue