Migrations are pretty powerful but problems can arise. As I've suggested elsewhere, best to develop against SQLite and then deploy as desired. In development, I change models frequently. If I run into a problem that I can't fix with migrations, I might delete the whole database folder and start over. That's simple with SQLite.
The sql.log is just a log. I think web2py compares the .table files to the database to figure out what needs to be migrated. I think fake_migrate rebuilds the .table files according to the model files without touching the DB. There's probably room for improvement in the documentation, especially around fixing broken migrations, what the files are in the database folder and what migrate/fake_migrate actually do.