25th August 2014
There are quite a lot of posts on how to do this, but my differs a tiny little bit, so I’m saving it for my own future reference, and also for the benefits of the wider audience.
I am updating a multisite Drupal 6 installation. To the best of my knowledge, the only difference for Drupal 7 is that instead of the site_offline D6 variable the maintenance_mode variable is used in D7.
On Debian stable and later, you can
sudo aptitude install drush and then just use it immediately after that.
Note: I recommend
su webuser (or
sudo -s followed by
sudo -s -u webuser) before you run any non-testing drush commands, where webuser is the user which owns your web-exposed files (e.g. Debian’s default is, I think, www-data). I’ve seen a lot of recommendations to run drush as a super-user, but that does not make sense, and may actually cause problems with file ownership.
One last thing before we start: if your drush seems to work fine but hangs when untarring modules – check this solution.
- Run some innocent command in drush to see if it produces any PHP warnings/errors you may want to fix before running actual update:
drush @sites core-status. In my case, all the sites had the CacheRouter module for in-RAM caching with a server daemon back-end, which was not initialized properly when drush bootstrapped Drupal from the command line. In my case, the only working solution was to edit
settings.phpfiles of every site to comment out the CacheRouter configuration for the period of update. If you get no warnings/errors, proceed to the next step. Note: I was running drush from the Drupal’s root (directory which has top-level
.htaccessfiles), but this should also work if you run from
- Here would be several more steps – copying your production website(s) to a dev-server (if you do not have one already), performing an update on the dev-server first to see if anything breaks and needs fixes, then migrating updated website(s) from the dev-server to production server. Drush actually has tools to simplify all of these procedures. However, the websites I was updating were not critical, and short downtime was not a problem, so I was updating live websites. Modify these steps as you see fit to make the process more reliable.
- Backup databases of all your sites. With drush:
drush @sites sql-dump --result-file --gzip. This puts backups somewhere into the home directory of your webuser. Backups are named with a human-readable timestamp. Of course, you can also create a manual Backup and Migrate backup, or use phpMyAdmin, or just
- Backup your site’s files. This step might be unnecessary, as drush seems to backup modules it is upgrading. I would still recommend making a backup, e.g. with
tar -acf multidrupal.tar.bz2 html, where html is the directory containing your multisite Drupal’s root
- Put the websites into maintenance mode and clear all caches; see the D7-specific note above:
drush @sites variable-set site_offline 1 ; drush @sites cache-clear all.
- The actual update! The easiest way would probably be to
drush @sites pm-update, but I haven’t tested that and used a process which I understand better, and which seems more reliable to me (if anything goes wrong). If in your drupal root you have sites/site1 and sites/site2, then run:
drush site1 pm-updatecode
drush @sites updatedb
drush site2 pm-updatecode
drush @sites updatedb
pm-updatecodecommand only updates files, and does not run database update. So with these commands I am first updating modules from site1, then running database update on all sites, then update modules of site2, and run database update on all sites again. Running
drush @sites updatedbmultiple times, even when there are no updates, should be safe. Take note of any warnings/errors reported, you will want to fix them later, for example:
WARNING: Updating core will discard any modifications made to Drupal core files, most noteworthy among these are .htaccess and robots.txt. If you have made any modifications to these files, please back them up before updating so that you can re-create your modifications in the updated version of the file.
- Disable maintenance mode. Cleaning the cache seems unnecessary, as
updatedbcommand does that.
drush @sites variable-set site_offline 0.
- Finalize: re-enable anything disabled before the updates, fix warnings/errors you noted during the update.
This worked well for me, and I hope it works well for you.