I always keep track of all changes on two fronts:
I keep an empty version of the database and update the structure every time
I take care to write small scripts for every little change done. These are mostly DDL scripts (alter table add column etc), and are always kept in a well defined structure, with comments linking the statements to the tasks from Bugzilla/Jira whatever is used.
Most of the time I make sure that these scripts are safe to be executed several times without errors.
Even if for some tasks I'm not the only one making changes, it's not difficult to synchronise our work, using svn.
Everything must be tested on at least one copy of the production environment.
Another way would be to use some database diff tools, these would compare the live database to your development database and generate scripts for changes to be done. I think Navicat has this feature. Some see this as a lot safer, well I think this is more chaotic. If you want a well done job, you do it yourself.