I migrated from RH (CentOS) to Ubuntu x64. I followed the instructions here:
HOWTO: Ubuntu 64bit Install
Except that I loaded Zimbra 4.5.9 on Ubuntu and Zimbra 4.5.4 was running on CentOS.
After installing 4.5.9, this is what I did (as opposed to the suggested 'upgrade' routine) :
First install 4.5.9 on the new server.
Then stop all the services (zmcontrol stop)
Copy backup/mysql.sql from the old server to the new server into the backup/ directory
Copy all the mysql psws (there are a few of them) from conf/localconfig.xml on the old server into conf/localconfig.xml on the new server (cut and paste the psw strings without touching the other XML tags)
Start mysql server on the new server (bin/mysql.server start)
Import the mysql.sql file into the new database server (running on port 7306):
mysql --port=7306 --socket=/opt/zimbra/db/mysql.sock -u root -p (use mysql_root_password from localconfig.xml file)
at the prompt inside mysql do this commmand to import the database:
source /opt/zimbra/backup/mysql.sql
Export the ldap data on the old server:
su - zimbra
openldap/sbin/slapcat -f /opt/zimbra/conf/slapd.conf -l /opt/zimbra/backup/ldap.ldif
Copy the /opt/zimbra/backup/ldap.ldif file to the new server into the /opt/zimbra/backup directory
Import the ldap data into the new server
rm -f openldap-data/*
su - zimbra
openldap/sbin/slapadd -f /opt/zimbra/conf/slapd.conf -l /opt/zimbra/backup/ldap.ldif
Copy /opt/zimbra/store/* from the old server into the new server
delete the logger db (rm /opt/zimbra/logger/db/*)
reinit the logger db (/opt/zimbra/libexec/zmloggerinit)
stop zimbra services (zmcontrol stop)
make sure none are left running
ps ax | grep zim
ps ax | grep mysql
ps ax | grep ldap
kill any running services.
restart services (zmcontrol start)
That's what worked for me. Pretty simple compared to all the other problems I encountered with the usual upgrade path - which repeatedly failed.