MySQL for puppet dashboard gets BIG. You can make this smaller by deleting old records. Source for this article is here.
To get the size in GB of the dashboard:
# mysql -uroot -ppassword > SELECT CONCAT ( ROUND( ( ( SUM(DATA_LENGTH)+SUM(INDEX_LENGTH) ) / 1024 / 1024 / 1024 ) ,2 ), " GB") as Size FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='dashboard_production' ; +---------+ | Size_GB | +---------+ | 9.31 | +---------+
Before we start, let’s backup the db:
/usr/bin/mysqldump --extended-insert --all-databases --add-drop-database --disable-keys --flush-privileges --quick --routines --triggers | gzip > /tmp/all-databases.sql.gz
This took 10min at my server.
You now want to delete old records. There is a puppet purge script at the end, but this fails with too big databases ( lock problem). For the initial cleanup, find the ID of the report you want to keep (ergo: delete older ones):
# mysql -uroot -ppassword SELECT id FROM `reports` WHERE (time > '2013-10-14 07:56:08') LIMIT 0,1; +-------+ | id | +-------+ | 90565 | +-------+
So we want to delete about 90000 records. We should do this in batch because of the locks problem:
for i in {1..90}; do echo "Deleting reports until${i}000"; time echo "DELETE FROM reports WHERE (id < ${i}000 )" | mysql -uroot -ppassword dashboard_production ; done
Every 1000 entries took me about a minute (virtual server).
If this is done: you are probably interested in the size, so run the first query again ;)
Now run the prune script at the bottom of this page. And backup the pruned database.
Edit the mysql settings:
add in file /etc/my.conf: [mysqld] innodb_buffer_pool_size=512M innodb_file_per_table = 1 innodb_data_file_path = ibdata:10M:autoextend:max:10G
Stop the mysql server:
# service mysqld stop
Delete old mysql data:
# mv /var/lib/mysql{,.original}
Start the mysql server:
# service mysqld stop
Restore the database:
zcat /tmp/all-databases.sql.gz | mysql -uroot -ppassword
Now restart puppet-dashboard.
===
Prune script:
#!/bin/bash DBOARD_DIR=/usr/share/puppet-dashboard cd ${DBOARD_DIR} rake RAILS_ENV=production reports:prune upto=1 unit=mon rake RAILS_ENV=production db:raw:optimize
You might want to schedule this in a crontab ;).