não é exatamente a resposta para o que você está procurando, mas eu acho que é o que você precisa: habilite o log binário, copie o log de backups e crie despejos completos uma vez por semana.
Estou criando o MySQL dump de 5 bancos de dados a cada hora. 3 desses bancos de dados raramente mudam, então criar um dump MySQL para esses 3 dbs é praticamente um desperdício de tempo e recursos.
Existe uma maneira de recuperar segundos de unix epoch de quando um db específico foi alterado / atualizado pela última vez? Eu o compararia com o arquivo de despejo mais recente e só despejaria outro se houver alterações.
Então, questione novamente: Como posso obter o datetime unix epoch da última atualização / alteração de um banco de dados específico?
não é exatamente a resposta para o que você está procurando, mas eu acho que é o que você precisa: habilite o log binário, copie o log de backups e crie despejos completos uma vez por semana.
Eu uso:
mysql -e "use <NAMEOFTHEDATABASE>;SELECT MAX(UPDATE_TIME) FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() ;" | grep -v "\----" | grep -v "MAX(UPDATE_TIME)" | awk '{print $1}'
Atenciosamente!
Existe uma ferramenta do Maatkit que pode fazer checksums rápidos em tabelas . É mk-table-checksum
Você provavelmente poderia travar as tabelas, executar o mk-table-checksum e armazenar as somas de verificação, depois desbloquear as tabelas e então olhar os valores para ver se você precisa executar o mysqldump ou não.
Funciona apenas para tabelas MyISAM
Você pode executar uma consulta MySQL na tabela information_schema:
Exemplo (substitua dbname pelo seu nome de banco de dados):
SELECT UNIX_TIMESTAMP(MAX(UPDATE_TIME)) as last_update
FROM information_schema.tables
WHERE TABLE_SCHEMA='dbname'
GROUP BY TABLE_SCHEMA;
Essa questão surge de tempos em tempos e a resposta curta é que essas informações não podem ser obtidas de forma confiável por qualquer método pela simples razão de que não são necessariamente registradas.
Para tabelas MyISAM, você pode usar a consulta que Phil postou. Eu não sei sobre nenhum dos outros, mas para o InnoDB, pelo menos, não há nenhuma consulta que retornará as informações desejadas. Nesse caso, você pode considerar o uso de gatilhos para registrar o registro de data e hora em uma tabela sempre que os dados forem alterados, mas, realisticamente, a perda de desempenho provavelmente será maior do que a continuação do despejo.
Eu encontrei este método, do link
Não tenho certeza se isso poderia ajudar, já que não estou tão preparado no MySql
Obtenha o tamanho do banco de dados, o espaço livre e a última atualização
Para obter o tamanho atual do banco de dados apenas consultando o seu navegador de consulta ou CLI a partir do banco de dados INFORMATION_SCHEMA na tabela TABLES.
SELECT table_schema "Data Base Name",
sum( data_length + index_length ) / 1024 / 1024 "Data Base Size in MB"
FROM information_schema.TABLES
GROUP BY table_schema ;
Obtenha o espaço livre do banco de dados
SELECT table_schema "Data Base Name",
sum( data_length + index_length ) / 1024 / 1024 "Data Base Size in MB",
sum( data_free )/ 1024 / 1024 "Free Space in MB"
FROM information_schema.TABLES
GROUP BY table_schema;
Obtenha a última atualização do banco de dados ordenada pelo tempo de atualização e, em seguida, pelo tempo de criação.
SELECT MAX(UPDATE_TIME), MAX(CREATE_TIME), TABLE_SCHEMA
FROM 'TABLES'
GROUP BY TABLE_SCHEMA
ORDER BY 1, 2;
Devido a não poder obter update_time para tabelas innodb, eu verifico os arquivos db diretamente:
find /var/lib/mysql -name \*.frm | xargs ls -l --time-style="+%m-%d-%Y" | awk '{print $6,$7}'
Isso me dá dias que eu uso para verificar se as tabelas estão inativas e podem ser arquivadas.
Você está procurando por timestamp unix que precisa apenas de uma mudança no estilo de tempo de ls:
find /var/lib/mysql -name \*.frm | xargs ls -l --time-style="+%s" | awk '{print $6,$7}'
Isto assume que seus arquivos de banco de dados estão em / var / lib / mysql, mas você pode obter esse local executando a seguinte consulta:
mysql -e "SHOW VARIABLES LIKE 'datadir';"
Tags mysql