I use phing and generally have a staging directory on the server where I can verify the changes. Then I run 'phing deploy' when it's ready to go. This handles changing the .htaccess file to point at a "website is down" page, runs the db migration script and pushes out the new code.
Definitely going to have to remember the symlink trick though.