Я создаю дамп MySQL 5 баз данных каждый час. 3 из этих баз данных очень редко меняются, поэтому создание дампа MySQL для этих 3 dbs - это пустая трата времени и ресурсов.
Есть ли способ получить секунды эпохи unix, когда в последний раз была изменена / обновлена конкретная база данных? Я бы сравнил его с последним файлом дампа и сбрасывал только другой, если есть изменения.
Итак, вопрос еще раз: как я могу получить дату и время эпохи unix последнего обновления / изменения конкретной базы данных?
Я использую:
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}'
С уважением!
это не совсем ответ на то, что вы ищете, но я думаю, что это то, что вам нужно: включить двоичное ведение журнала, резервное копирование бинарных журналов и создавайте полные дампы примерно раз в неделю.
Работает только для таблиц MyISAM
Вы можете выполнить запрос MySQL к таблице information_schema:
Пример (замените dbname на имя вашей базы данных):
SELECT UNIX_TIMESTAMP(MAX(UPDATE_TIME)) as last_update
FROM information_schema.tables
WHERE TABLE_SCHEMA='dbname'
GROUP BY TABLE_SCHEMA;
Есть инструмент от Maatkit, который может быстро вычислять контрольные суммы на столы. это mk-table-контрольная сумма
Вероятно, вы могли бы заблокировать таблицы, запустить mk-table-checkum и сохранить контрольные суммы, затем разблокировать таблицы, а затем посмотреть значения, чтобы узнать, нужно ли вам запускать mysqldump или нет.
Я нашел этот метод из http://mysqladministrators.blogspot.it/2012/02/get-database-size.html
Я не уверен, что это может вам помочь, так как я не так подготовлен в MySql
Получите размер базы данных, свободное место и последнее обновление
Чтобы получить текущий размер базы данных, просто запросив в браузере запросов или CLI из базы данных INFORMATION_SCHEMA в таблице 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 ;
Получите свободное место в базе данных
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;
Получите последнее обновление базы данных, упорядоченное по времени обновления, а затем по времени создания.
SELECT MAX(UPDATE_TIME), MAX(CREATE_TIME), TABLE_SCHEMA
FROM `TABLES`
GROUP BY TABLE_SCHEMA
ORDER BY 1, 2;
Этот вопрос возникает время от времени, и краткий ответ заключается в том, что эту информацию нельзя надежно получить каким-либо одним методом по той простой причине, что она не обязательно записывается.
Для таблиц MyISAM вы можете использовать запрос, опубликованный Филом. Я не знаю ни о каких других, но, по крайней мере, для InnoDB нет запроса, который вернет нужную информацию. В этом случае вы можете рассмотреть возможность использования триггеров для записи отметки времени в таблице всякий раз, когда данные изменяются, но на самом деле потеря производительности, скорее всего, будет больше, чем при простом дампе.
Из-за невозможности получить update_time для таблиц innodb я напрямую проверяю файлы db:
find /var/lib/mysql -name \*.frm | xargs ls -l --time-style="+%m-%d-%Y" | awk '{print $6,$7}'
Это дает мне дни, которые я использую для проверки того, что таблицы неактивны и могут быть заархивированы.
Вы ищете временную метку unix, которой просто нужно изменить стиль времени ls:
find /var/lib/mysql -name \*.frm | xargs ls -l --time-style="+%s" | awk '{print $6,$7}'
Предполагается, что ваши файлы базы данных находятся в / var / lib / mysql, но вы можете получить это местоположение, выполнив следующий запрос:
mysql -e "SHOW VARIABLES LIKE 'datadir';"