There may be times when you need to move your Moodle site from one server to another. For example, moving a Moodle site from shared hosting service's server to a dedicated server.
- Tip: One common migration mistake is to forget to update the details in the migrated Moodle's config.php file.
Migrating a complete Moodle site - method 1
This involves moving a whole site from one server to another. If you are changing the domain/IP address to the new server you need to do these steps:
- Maintenance mode. Place your current Moodle site into Maintenance mode Site Administration>Server>Maintenance Mode to prevent any further additions to the Moodle database. Don't let administrators login during the migration as they are not affected by the maintenance mode setting.
- Backup your current Moodle database. The right way to back up your database depends on which database system you are using. The instructions below are one way to back up a MySQL database. Another option would be to use a tool like phpMyAdmin to manually make a backup. The documentation for your database will give more options. There are many ways to do such backups. Here is an outline of a little script you can run from command line on Unix to backup the database:
cd /my/backup/directory mv moodle-database.sql.gz moodle-database-old.sql.gz mysqldump -h example.com -u myusername --password=mypassword -C -Q -e --create-options mydatabasename > moodle-database.sql
- Change your Moodle URL. If you have a new URL, you'll need to change this in the Moodle database to the new server. This is needed as links to pictures, files, etc are stored as absolute links and will reference the old
$CFG->wwwrootvalue. So when loading a mysql backup dump of the Moodle server into mysql on another server the absolute referenced links will be broken. There are two methods of doing this:
- (a) The first method changes the Moodle URL using the Moodle script replace.php while your site is currently running just before you backup the Moodle database. Point your browser to yourserver.com/admin/tool/replace/index.php or in older versions http://yourserver.com/admin/replace.php
- Enter the url for your old server (http://oldserver.com/) and new server (http://newserver.com/) and it will fix the mysql tables. You will also need to clear out any cached links by restarting your webserver. Now, take another backup of the Moodle database - this one will have the correct URLs.
- (b) The second method is to backup the Moodle database first, then use the search and replace feature of your text editor (or use a unix tool like sed) to replace the old URL with the new one in the mysql backup file. Here is an example sed command:
#sed -e 's/oldserver.com/newserver.com/g' oldmysqldump.sql > newmysqldump.sql
- NOTE: This second method will not replace text in blocks because they are stored base64 encoded in the database, so any links in blocks will not be fixed. Therefore you should consider using the replace tool after you migrate if you use this second method.
- TIP: You may want to check the mysqldump file to see how the old server was referenced.
- After changing the URL, restore the mysql database
- Copy the database back up files to the new server and restore into the new database server.
- Once you have created the new database on the new server:
mysql -p new_database < moodle-database.sql
- For other databases, follow their instructions for restoring a backup.
- Copy the Moodle software. You will need to copy the Moodle code itself to the new server (this is the Moodle folder found in your webroot folder e.g. /var/www or public_html). If you want you can upgrade the code to the latest version at this point by downloading the latest code from the Moodle site, copying over your config.php file and any plugins that you might have installed. See Upgrading.
- If you are changing the url or the new server has a different ip address, you will need to change
$CFG->wwwroot. In your (possibly new) Moodle directory, change the
$CFG->wwwrootvariable in the config.php file for the new server.
- Copy data directory contents (moodledata). Copy the contents of your data directory (check for the value in
$CFG->dataroot) to the new server. If you'll use an FTP client, the transfer of the
filedirfolder must be in BINARY mode or the files will get corrupted in the process.
- Review moodledata permissions and ownership. Check also that ownership and permissions remain the same on the new dataroot folder and change the value if you have changed its location on the new server. Do the same for the new moodle code folder.
- Test the migration. To test the new install, access Moodle using your browser and the new server's URL. When you have tested that a number of links in the courses work, take the new Moodle site out of maintenance mode. If you have upgraded the Moodle code, you will go through the upgrade process when you first access the site.
See also: Forum discussion on migrating Moodle's data directory on a Windows system.
Migrating a complete Moodle site - method 2
Do you have shell access on both servers? If so, the following method is a very quick and efficient method to migrate a Unix based site.
It is also useful for creating snapshots or test sites.
- Set up a new empty database on the new server.
- Place your existing Moodle site into maintenance mode.
- Login to shell on the old existing server.
- Use rsync to copy moodledata and public_html or moodle folders (or whatever directory your Moodle install is in) to the new server - execute (replacing caps with your details; SOURCE = the directory you want to copy) for each directory:
rsync -av -e ssh SOURCE/ USERNAME@NEW_SERVER.COM:/PATH/TO/DESTINATION/
- Dump existing database and move and import into database on new server by executing:
mysqldump --allow-keywords --opt -uMySQL_USERNAME -pPASSWORD DATABASE | ssh USER@DOMAIN "mysql -uMySQL_USERNAME -pPASSWORD DATABASE"
- On the new server, update config.php with relevant details where applicable (e.g. database name and user details, the wwwroot and the dataroot).
- Check ownership and permissions are correct on both moodle code and moodledata directories.
- To fix any internal Moodle links, login to your "new" Moodle install on your new server and use the Search and replace admin tool to search and replace the old url for the new one in the database.
- Make sure everything is working.
Takes about 15 minutes for a small site. However, transferring several Gigabytes of data for a larger site can take hours depending on your network connection and hard drive read/write speed.
When you are happy all has gone well, set up redirects/make DNS changes if required, take new site out of maintenance mode and "switch off" old site.
- If you are switching the ip address from the old server to the new one, you will need to turn off the old server before firing up the new one to avoid ip addressing conflicts and confusion!
Other points to consider
So you built your Moodle Server with a http//192.168.0.1/Moodle address. Then you changed the URL for your site to http://OurMoodle.org/Moodle. You changed the Moodle config file so the CFGs point to the new paths, but your images still point to the old url.
One simple, quick solution is to use the Replace script in Moodle to fix this. Login as admin and enter http://OurMoodle.org/admin/tool/replace/index.php in your browser address bar (or http://OurMoodle.com/admin/replace.php in older versions). Use the two form boxes to change http://192.168.0.1/ to http://OurMoodle.org/.
When migrating Moodle it is often a good idea to take the opportunity to upgrade Moodle to the latest version. If you manage your own server, follow the instructions in upgrading moodle, otherwise check if your host can upgrade for you.
Restoring a single course across servers
You may need to restore a single course from an old site to a new one, especially if you are testing the migration. When restoring a Moodle backup file to Moodle on a different server than the one used to create the backup, the absolute referenced links to files maybe broken. To fix this problem open the backup-coursename.zip file and edit the moodle.xml file replacing links with
For example, replace http://yourserver.com/file.php/243/ with
When the file is restored it will use the correct file path for the new course.
DNS & Masquerading changes
You may have had to change the DNS entries for the new Moodle site. If you have done so, it will take some time for the changes to replicate, so be patient. If your server is located behind a firewall, you may also have to change your firewall rules to allow access to the new server. See the masquerading docs.
Internal and external access
If you have a set up where your Moodle site can be accessed via a network and via the internet, ensure you check that the new site can be accessed internally and externally.
- Site backup
- Site restore
- Backup and restore FAQ
- Moving Moodle to a new server video
- Convert hidden search/replace script into a proper core admin tool Tracker issue
Using Moodle forum discussions: