How often: Daily
How: have a script that runs via a CRON job
How/Where: 7 day rolling full backup stored on the server, on 2 separate VPS's (rsync) at opposite sides of the US, on my home desktop and on my home NAS.
Have ever used: Yes, when moving to a new VPS instance I will run my backup routine for that day and then use that archive to move over to the new VPS. As for needing it for recover, only twice when doing a XenForo upgrade.
For those that run a VPS and would like a script to use it via a CRON job (it does depend on the VPS/server having ZIP installed). It also assumes you are using UTF8MB4 character set, which both Invision and XenForo require and Wordpress can use. I am not sure about other scripts. This has been working for me for the last several years.
Bash:
#!/bin/bash
####################################
#
# Backup to local directory 7 day rolling.
#
####################################
mysqldump_location="/path/to/your/website/root/directory"
/usr/bin/mysqldump --opt YOURDBNAME --single-transaction --default-character-set=utf8mb4 > $mysqldump_location/yourSQLdumpfile.SQL
# What to backup.
backup_files="/path/to/your/website/root/directory"
# Where to backup to.
dest="/path/to/store/locally"
# Create archive filename.
day=$(date +%A)
hostname=$(hostname -s)
archive_file="yourdomain.ext-$day.zip"
# Backup the files using ZIP.
zip -r $dest/$archive_file $backup_files
rm -f $mysqldump_location/yourSQLdumpfile.SQL