- Mantenha seu código em um local separado da configuração e de outros arquivos variáveis (imagens enviadas, arquivos de cache etc.)
- Mantenha os módulos separados do código principal também.
- Certifique-se de que seu código tenha permissões de sistema de arquivos para se alterar (use SuPHP, por exemplo).
Se você fizer isso, o mais simples seria baixar completamente a nova versão (sem patches incrementais) e descompactá-la em um diretório adjacente ao que contém a versão atual. Como não haverá arquivos variáveis dentro do diretório de código, você pode simplesmente remover ou renomear o antigo e renomear o novo para substituí-lo.
Você pode manter o número da versão em uma constante global no código.
Quanto ao MySQL, não há outra maneira de fazer um script de atualização para cada versão que altera o layout do banco de dados. Mesmo as soluções automáticas para alterar a definição da tabela não sabem como atualizar os dados existentes.