Following Baron Schwartz' post: How to calculate a good InnoDB log file size, which shows how to make an estimate for the InnoDB log file size, and based on SQL: querying for status difference over time, I've written a query to run on MySQL 5.1, which, upon sampling 60 seconds of status, estimates the InnoDB transaction log bytes that are expected to be written in the period of 1 hour.
Recap: this information can be useful if you're looking for a good innodb_log_file_size value, such that will not pose too much I/O (smaller values will make for more frequent flushes), not will make for a too long recovery time (larger values mean more transactions to recover upon crash).
It is assumed that the 60 seconds period represents an average system load, not some activity spike period. Edit the sleep time and factors as you will to sample longer or shorter periods.
SELECT
innodb_os_log_written_per_minute*60
AS estimated_innodb_os_log_written_per_hour,
CONCAT(ROUND(innodb_os_log_written_per_minute*60/1024/1024, 1), 'MB')
AS estimated_innodb_os_log_written_per_hour_mb
FROM
(SELECT SUM(value) AS innodb_os_log_written_per_minute FROM (
SELECT -VARIABLE_VALUE AS value
FROM INFORMATION_SCHEMA.GLOBAL_STATUS
WHERE VARIABLE_NAME = 'innodb_os_log_written'
UNION ALL
SELECT SLEEP(60)
FROM DUAL
UNION ALL
SELECT VARIABLE_VALUE
FROM INFORMATION_SCHEMA.GLOBAL_STATUS
WHERE VARIABLE_NAME = 'innodb_os_log_written'
) s1
) s2
;
Sample output:
+------------------------------------------+---------------------------------------------+ | estimated_innodb_os_log_written_per_hour | estimated_innodb_os_log_written_per_hour_mb | +------------------------------------------+---------------------------------------------+ | 584171520 | 557.1MB | +------------------------------------------+---------------------------------------------+
Very cool Shlomi!
Would be great to do this in 5.0 also, but that might be a shell thing since you can't get status within a query.
Link | October 21st, 2009 at 3:18 am
Hi Arjen,
Thanks. I have an awk 'pager' for that, but it's really ugly...
Link | October 21st, 2009 at 6:19 am
GLOBAL_STATUS table is not exist in INFORMATION_SCHEMA database. using 5.1. Am I mising something...
Pls help.
Link | January 4th, 2011 at 11:13 pm
My best guess is that you're NOT using 5.1. Perhaps just the 5.1 client.
Try:
mysql> SELECT VERSION();
Link | January 5th, 2011 at 7:24 am
Thanks for the snippet. Very handy.
What would you do if you got this result though? Seems a 36G log file might be a bad thing to have.
+------------------------------------------+---------------------------------------------+
| estimated_innodb_os_log_written_per_hour | estimated_innodb_os_log_written_per_hour_mb |
+------------------------------------------+---------------------------------------------+
| 38325872640 | 36550.4MB |
+------------------------------------------+---------------------------------------------+
Link | December 1st, 2011 at 5:40 pm
@George,
I suppose I would have to live with it
Seriously, Percona Server supports > 4G worth of transaction log files.
Perhaps you can tune you app so as to produce less transactions; i.e. group more statements into transactions (may not reduce overall size, but will help out with flushes), work out smarter queries, take out logging from the database...
Link | December 2nd, 2011 at 8:11 am