mostre o nome da tabela + número de registros para cada tabela em um banco de dados mysql innodb

10

Como listar todas as tabelas no banco de dados atual, junto o número de linhas da tabela.

Em outras palavras, você pode pensar em uma consulta para criar algo assim no mysql?

+------------------------++------------------------+
| Tables_in_database     |  Number of rows         |
+------------------------++------------------------+
| database 1             |   1000                  |
| database 2             |   1500                  |
+------------------------++------------------------+

Diferentes abordagens são bem-vindas.

sjdh
fonte
Você está usando MyISAM ou InnoDB? Você já olhou para esta pergunta ?
Aaron Bertrand
@AaronBertrand Obrigado, essa pergunta é interessante. Eu uso innodb
sjdh

Respostas:

8

Eu tenho uma abordagem muito agressiva usando força bruta Dynamic SQL

SET group_concat_max_len = 1024 * 1024 * 100;
SELECT CONCAT('SELECT * FROM (',GROUP_CONCAT(CONCAT('SELECT ',QUOTE(tb),' Tables_in_database,
COUNT(1) "Number of Rows" FROM ',db,'.',tb) SEPARATOR ' UNION '),') A;')
INTO @sql FROM (SELECT table_schema db,table_name tb
FROM information_schema.tables WHERE table_schema = DATABASE()) A;
PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;

Exemplo: No meu banco de dados de teste, recebo este

mysql> use test
Database changed
mysql> SET group_concat_max_len = 1024 * 1024 * 100;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT CONCAT('SELECT * FROM (',GROUP_CONCAT(CONCAT('SELECT ',QUOTE(tb),' Tables_in_database,
    '> COUNT(1) "Number of Rows" FROM ',db,'.',tb) SEPARATOR ' UNION '),') A;')
    -> INTO @sql FROM (SELECT table_schema db,table_name tb
    -> FROM information_schema.tables WHERE table_schema = DATABASE()) A;
Query OK, 1 row affected (0.00 sec)

mysql> PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;
Query OK, 0 rows affected (0.00 sec)
Statement prepared

+--------------------+----------------+
| Tables_in_database | Number of Rows |
+--------------------+----------------+
| biblio             |              3 |
| biblio_old         |              7 |
| dep                |              5 |
| e                  |             14 |
| emp                |              4 |
| fruit              |             12 |
| fruit_outoforder   |             12 |
| nums_composite     |              0 |
| nuoji              |              4 |
| prod               |              3 |
| prodcat            |              6 |
| test2              |              9 |
| worktable          |              5 |
| yoshi_scores       |             24 |
+--------------------+----------------+
14 rows in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql>

DE UMA CHANCE !!!

CAVEAT: Se todas as tabelas forem MyISAM, isso acontecerá muito rápido. Se todas as tabelas forem InnoDB, cada tabela será contada. Isso pode ser brutal e implacável para tabelas InnoDB muito grandes.

RolandoMySQLDBA
fonte
Este é um ótimo exemplo de SQL dinâmico. Obrigado!
sjdh
Eu tentei substituir FROM information_schema.tablespor FROM show tables. Você pode explicar por que isso não funciona?
Sjdh
Uau, isso é extremamente útil!
Tommy
Eu adoraria ver uma versão disso que itera sobre todos os bancos de dados. Tentei executar, SELECT DISTINCT table_schema FROM information_schema.tablesmas não consegui descobrir como agrupar sua consulta para executar esses resultados. Se algum dia eu descobrir a resposta, postarei em dba.stackexchange.com/q/201880/18098
Ryan
Na verdade, descobri que você já respondeu em dba.stackexchange.com/a/102284/18098, mas há pelo menos um erro de digitação. Mesmo depois de corrigir "DEALLCOATE", não consigo executar a versão do All Databases. Não estou familiarizado comSELECT @CountSQL\G
Ryan
6

Experimente a consulta abaixo sem consulta dinâmica

SELECT Table_name AS TablesInDatabase ,table_rows AS NumberOfRows 
FROM information_schema.tables 
WHERE Table_schema=DATABASE(); 
Pydi Raju
fonte
11
Este método é confiável apenas com um banco de dados all-MyISAM. O InnoDB não armazena contagens de linhas em nenhuma parte de sua arquitetura, nem no arquivo Information_SCHEMA. (Veja minha postagem dba.stackexchange.com/questions/17926/… ). A abordagem dinâmica em relação ao INFORMATION_SCHEMA é a única maneira para as tabelas do InnoDB.
RolandoMySQLDBA 02/09
Obrigado por compartilhar este método. Posso confirmar que esse método fornece contagens ligeiramente diferentes para algumas das minhas tabelas. Todas as minhas tabelas são armazenadas no mecanismo de armazenamento do InnoDB.
Sjdh
melhor resposta, funciona como charme.
Pablo Pazos
1

Talvez essa consulta possa ser útil. Mostra o tamanho dos dados e o número de registros.

SET @table=(SELECT DATABASE());
select @table;
SELECT 
     table_schema as `Database`, 
     table_name AS `Table`, 
     round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB`,
     table_rows as 'Rows'
FROM information_schema.TABLES 
WHERE table_schema = @table
ORDER BY (data_length + index_length) DESC;
RikW
fonte
1

Obtenha contagens de linha exatas para todas as tabelas no MySQL usando o shell script.

defina o parâmetro no arquivo parameter.config como

# Server Details
host_server=10.109.25.37

# Mysql credentials
mysql_user=root
mysql_pass=root
mysql_port=3306

O script a contar é:

#!/bin/bash
# This Script is used to take rows count of mysql all user database

# Read Parameter
source parameter.config

# Find path
MY_PATH="`dirname \"$0\"`"
#echo "$MY_PATH"

start=`date +%s`
echo -e "\n\n"
echo MySQL script start runing at Date and Time is: `date +"%D %T"`
echo -e "@@@ Start of rows Count of MySQL on Old Ficus Release $host_server @@@"

echo -e "\n***** MySQL Rows Count Start *****"

#Make directory to save rows count
NOW="$(date +%Y%m%dT%H%M%S)"
dir_name="mysqlRows_$host_server"
if [ ! -d "$MY_PATH/$dir_name" ]; then
    mkdir "$MY_PATH/$dir_name"
fi
echo -e "\n..... Directory $dir_name is Created for mysql....."

echo -e "\n..... Check MySQL Connection ....."
# Verifying mysql connections on new release machine
MYSQL_CONN="-u$mysql_user -p$mysql_pass -h$host_server"
mysql ${MYSQL_CONN} -e "exit"
if [ $? -eq 0 ];
then
    echo -e "\n..... MySQL Database Connection Successful on server $host_server ....."
else
    echo -e "\n..... MySQL Database Connection Fail. Please verify $host_server credential ....."
    exit
fi

echo -e "\nReading MySQL database names..."
mysql ${MYSQL_CONN} -ANe "SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('mysql','information_schema','performance_schema')" > $MY_PATH/$dir_name/dbs_$NOW.txt
DBS="$(cat $MY_PATH/$dir_name/dbs_$NOW.txt)"
# echo -e "\nList of databases:\t" ${DBS}

echo -e "\n..... Running for row count of tables of all user databases ....."

# All User databases
for db in ${DBS[@]}
do
    # echo $db , ${db[@]} 
    # Find list of database
    echo -e "\n\t... Running for ${db[@]} database tables list ..."
    mysql ${MYSQL_CONN} -ANe "SELECT  TABLE_NAME FROM information_schema.TABLES WHERE  TABLE_SCHEMA IN ('${db[@]}')" > $MY_PATH/$dir_name/${db[@]}_tables_$NOW.txt
    TBL="$(cat $MY_PATH/$dir_name/${db[@]}_tables_$NOW.txt)"
    # echo "Table in $db are:" ${TBL[@]}, $MY_PATH/$dir_name/${db[@]}_tables.txt

    echo -e "\n\t... Running for ${db[@]} database tables rows count ..."
    for tbs in ${TBL[@]}
    do
        # echo $tbs , ${tbs[@]}
        count=$(mysql -u$mysql_user -p$mysql_pass -h$host_server ${db[@]} -N -e "select count(*) from ${tbs[@]}")
        # count="$(cat /tmp/$db_rows_$NOW.txt)"
        # echo "Row in $tb Table of $db database are:" ${count[@]}
        echo -e "${db[@]},${tbs[@]},$count" >> $MY_PATH/$dir_name/${db[@]}_rows_$NOW.csv
        echo -e "${db[@]},${tbs[@]},$count" >> $MY_PATH/$dir_name/alldbs_rows_$NOW.csv
    done
done
echo -e "\n..... End of rows count of tables of all databases ....."

echo -e "\n===== MySQL Rows Count End ====="

# Display script execution time.
echo -e "@@@ Completion of Rows Count of MySQL on old Release $host_server @@@"
echo Script ended at Date and Time is: `date +"%D %T"`
end=`date +%s`
runtime=$((end-start))
echo -e "Time(in second) taken for running MySQL row count script:" $runtime "Sec."

salve isso no arquivo "mysqlrowscount.sh", execute este script usando o comando:

bash mysqlrowscount.sh
Sarita
fonte