Skip to main content

Magento upgrade to 1.5.x or 1.6.x

UPDATED: 2012-02-07

As many magento users will know, Magento is no fun to work with-- mainly due to poor community support (the developers help paying customers; i.e. Magento Enterprise ... Only payed support there... Great for business but bad for the average or beginning user...)

Anyhow...

So here's how we do it.

MAKE A BACKUP!

You can skip this step all together, however, please make a backup of everything prior to beginning the upgrade.

Create a test environment somewhere on your server (preferably away from your production installation)

    1. I usually create a subdomain on another domain and put all the files there.
    2. Create a new database for this sub-domain.
    3. Make a backup of the current database in SSH via:
      $ mysqldump -u user -p DB_NAME > DB-NAME.sql
    4. Dump the backup you just made into your new database
      $ mysql -u user -p DB_NAME < DB-NAME.sql
    5. Change the database settings to point to new database
      $ vi app/etc/local.xml
    6. Change your magento URLs
      In phpmyadmin go to table 'core_config_data' and change 'web/unsecure/base_url' and 'web/secure/base_url' to new location
    7. REMEMBER to update steps 5-6 after the upgrade is done and upgraded files and database are transferred to the production environment.

Upgrade Magento from 1.4.x to 1.5.x
(Upgrade Magento from 1.3 to 1.6 or 1.4 to 1.6 or 1.5 to 1.6 should be the same process)

1. download the latest version of Magento

$ wget http://www.magentocommerce.com/downloads/assets/1.6.2.0/magento-1.6.2.0.tar.gz 
$ wget http://www.magentocommerce.com/downloads/assets/1.5.1.0/magento-1.5.1.0.tar.gz #magento 1.5

$ tar xvfz magento-1.6.2.0.tar.gz
$ tar xvfz magento-1.5.1.0.tar.gz  #magento 1.5

2. Disallow access to your site if doing the upgrade on a production environment (this is why you should do this on a test environment)

$ mv .htaccess .htaccess-bkp
$ cp magento/.htaccess .
$ cp .htaccess .htaccess-new

In your new .htaccess change the Order Allow to (at the bottom of file):

#Order allow,deny    
#Allow from all
Order deny,allow
Deny from all
Allow from YOUR IP ADDRESS

Also, up the memory usage (especially if your database backup is over 500MB--hopefully you're running magento on a dedicated server.)

php_value memory_limit 1024M
php_value max_execution_time 45000

3. Flush all caches

$ rm -rf var/cache/*
$ rm -rf downloader/pearlib/cache/* downloader/pearlib/download/*

4. Remove the 'downloader' and 'app/design/frontend/base' directory

$ rm -rf downloader
$ rm -rf app/design/frontend/base

This is the safest bet so mage/pear doesn't upgrade the wrong installation; trust me this happened to me a couple of times, EVEN after doing ' mage-setup'.

As for the 'base' directory, we remove that because deprecated files exist in there that may cause problems. E.g. One page checkout would not work for anon users, but would work for registered users--and this happened even when all the files were overwritten with magento 1.5.1; meaning magento was picking up deperectated files.

You may also want to clear out redundant theme files in
app/design/frontend/default/YOURTHEME/ AND app/design/frontend/default/default/

The following are the only custom template files I use--it's better to use the least amount possible to avoid future upgrade headaches

  • app/design/frontend/default/YOURTHEME/layout/catalog.xml
  • app/design/frontend/default/YOURTHEME/template/callouts/left_col.phtml
  • app/design/frontend/default/YOURTHEME/template/catalog/product/view.phtml
  • app/design/frontend/default/YOURTHEME/template/checkout/success.phtml
  • app/design/frontend/default/YOURTHEME/template/page/1column.phtml
  • app/design/frontend/default/YOURTHEME/template/page/2columns-left.phtml
  • app/design/frontend/default/YOURTHEME/template/page/2columns-right.phtml
  • app/design/frontend/default/YOURTHEME/template/page/3columns.phtml
  • app/design/frontend/default/YOURTHEME/template/page/html/footer.phtml
  • app/design/frontend/default/YOURTHEME/template/page/html/head.phtml
  • app/design/frontend/default/YOURTHEME/template/page/html/header.phtml

Same goes for app/design/frontend/default/default/. You want to remove any redundant theme files in there as well. Basically, you'll ONLY want to keep any installed modules you may be using; get rid of the rest.

e.g. I only have the following in app/design/frontend/default/default/:

  • app/design/frontend/default/default/etc/widget.xml # I probably don't even need this
  • app/design/frontend/default/default/layout/vertnav.xml
  • app/design/frontend/default/default/template/vertnav/left.phtml

5. Copy 'downloader' and 'app/design/frontend/base' folder from magento-1.5.1.0

$ cp -a magento/downloader .
$ cp -a magento/app/design/frontend/base/ app/design/frontend/

6. Install/get 'mage'.

$ cp magento/mage .
$ chmod 550 ./mage

or
$ chmod 750 ./mage

We do this because the 'pear' method doesn't work anymore--it only does an upgrade up to magento 1.4.2; it won't work upgrading any higher than that.

7. Do the upgrade

$ ./mage mage-setup .
$ ./mage sync --force
$ ./mage install http://connect20.magentocommerce.com/community Mage_All_Latest --force
$ rm -rf var/cache/* var/session/*
$ rm -rf downloader/pearlib/cache/* downloader/pearlib/download/* 
$ chmod 755 mage
$ php shell/indexer.php reindexall
$ ./mage upgrade-all --force
( NOTE: you may skip this 'upgrade-all' step if you just went ahead and did the following:
<code>
$ yes | cp -Rf magento/* .  #this copies over all the magento files you extracted over your current installation

8. Visit the home page of your upgraded site. This will trigger the magento upgrade process.

This can take anywhere from 2-30minutes, so be patient. You'll also likely get a browser error before the upgrade is done--don't worry about it, it's normal, and keep waiting...

Do the following and watch mysql process until it stops using up high cpu usage--once it does, you'll know the database upgrade is done.

$ top

9. Login to the /admin section of your site and mage sure the version number reflects the version you just upgraded to.

10. Change back your .htaccess to original value

$ cp .htaccess-new .htaccess

11. Set the proper file permissions

$ find . -type f -exec chmod 644 {} \;
$ find . -type d -exec chmod 777 {} \;
 
$ chmod -R 777 downloader
$ chmod 550 mage
$ chmod o+w var var/.htaccess app/etc
$ chmod -R o+w media

 

11. You'll probably want to use a file comparison program to see the difference in template files

  • download the latest version from magento connect if possible
  • if not possible and you made your own template, then the best thing to do is to DELETE all the unecessary custom template files from your custom template directory, and only keep the crucial ones.
  • Following use something like Beyond Compare and file compare between the /base/default
    app/design/frontend/base/default
    and
    /app/design/frontend/default/CUSTOM

12. Fix magento URLs

In the admin interface admin/system_config/edit/section/catalog/ set the following under Search Engine Optimization:

  • Autogenerated Site Map: enable
  • Popular Search Terms: enable
  • Product URL Suffix: blank
  • Category URL Suffix: blank
  • Use Categories Path for Product URLs: yes # or no depends on who you ask
  • Create Permanent Redirect for old URLs if Url key changed: yes
  • Page Title Separator: -
  • Use Canonical Link Meta Tag For Categories : yes
  • Use Canonical Link Meta Tag For Products: yes

Now re-index your url rewrite data in admin/process/list/: Catalog URL Rewrites

Or in SSH:

php shell/indexer.php reindexall

 

Troubleshooting

Now...

If something went wrong (and it probably did) you have several options.

If a newer version 1.6.x-RC is showing then mage installer grabbed the release candidate stuff instead.

The fix:

$ yes | cp -Rf magento/* .

This will copy the proper version of magento overwriting your current installation

The site just hangs after upgrade (keeps loading for minutes on end):

Be patient, use top in SSH and wait for mysql high CPU usage to go down

PHP Fatal error: Call to a member function toHtml()

edit app/design/frontend/default/YOURTHEME/layout/page.xml

or edit app/design/frontend/default/default/layout/page.xml

Change from

<block type="core/profiler" output="toHtml"/>

to:

<block type="core/profiler" output="toHtml" name="core_profiler"/>

Cannot login to magento

edit app/code/core/Mage/Core/Model/Session/Abstract/Varien.php and comment out the following:

/*
$cookieParams = array(
\’lifetime\’ => $cookie->getLifetime(),
\’path\’ => $cookie->getPath(),
\’domain\’ => $cookie->getConfigDomain(),
\’secure\’ => $cookie->isSecure(),
\’httponly\’ => $cookie->getHttponly()
);
if (!$cookieParams[\’httponly\’]) {
unset($cookieParams[\’httponly\’]);
if (!$cookieParams[\’secure\’]) {
unset($cookieParams[\’secure\’]);
if (!$cookieParams[\’domain\’]) {
unset($cookieParams[\’domain\’]);
}
}
}

if (isset($cookieParams[\’domain\’])) {
$cookieParams[\’domain\’] = $cookie->getDomain();
}

call_user_func_array(\’session_set_cookie_params\’, $cookieParams);

if (!empty($sessionName)) {
$this->setSessionName($sessionName);
}
*/

Cannot add or update a child row: a foreign key constraint fails: googleshopping_setup

The only remedy I was able to find for my case when upgrading from magento 1.3.2 to 1.6.0 was i needed to do upgrade to magento 1.6.1-rc1.

./mage upgrade-all --force

Fresh start: in case something went terribly wrong

Go into phpmyadmin and drop all the tables so your database is empty (you'll get errors in phpmyadmin about foreign keys; that's normal, just repeat till all tables are gone) (i prefer this over the SSH method, cause it's too easy to drop the wrong database by accident)

Now re-dump your database backup

$ mysql -u user -p DB_NAME &lt; DB-NAME.sql

and copy over a fresh version of magento over your current install

$ yes | cp -Rf magento/* .   
$ rm -rf var/cache/*
$ rm -rf downloader/pearlib/cache/* downloader/pearlib/download/*

Visit your site again...

Bonus:
Install Google Base (shopping) vis SSH

$ ./mage install http://connect20.magentocommerce.com/community Mage_GoogleShopping --force

To uninstall an extension:
$ ./mage uninstall http://connect20.magentocommerce.com/community Mage_GoogleShopping --force

Look here for a complete listing of required Google Base attributes for different product categories: http://www.google.com/support/merchants/bin/answer.py?answer=1344057

Comments

To do this via a hosting

To do this via a hosting service would I just ftp and overwrite the files over?

Huzzah! 1.6 is finally out,

Huzzah! 1.6 is finally out, can't wait to see what new bugs are awaiting me this time around. It's always a fun scavenger hunt, like an evil Wheres Waldo!

how are you handling the

how are you handling the app/etc/local.xml file that has references back to the old database. Would you want to edit that file to reflect the new database you are about to use/upgrade/?

Joel, I think he already said

Joel, I think he already said that above (step e). You do have to update that file at that step.

it was the best magento

it was the best magento upgrade article so far

This was such a life saver I

This was such a life saver I had to post a big THANK YOU! I had a client that was ready to leave me and you saved me thanks. This upgrade protocol worked perfectly for me. Did I say - thanks?

Thank you for posting this.

Thank you for posting this. What a big help.

would the following strategy

would the following strategy work?

1. leave the live site running
2. do the upgrade on a staging site, take as long as you need
3. once you are ready, disable access to the live site and move the orders data to the staging site
4. convert staging to live?

Very nice and helpful

Very nice and helpful article. Great jobs!

Regards,
Creare site

Thanks for the great

Thanks for the great tutorial, I followed it up, but unfortunately my shop is stuck - all database installation processes seem to be finished, but when I try to access any page on my shop the following error appears:

Fatal error: Call to undefined method Mage_Core_Helper_Data::useDbCompatibleMode() in /Applications/XAMPP/xamppfiles/htdocs/shop/app/code/core/Mage/Core/Model/Resource/Setup.php on line 309

The Core_Helper_Data class is in its right place, and it contains the mentioned method.

Do you have any idea what could've gone wrong and how to fix this?

Thanks.

This is exactly what I do.

This is exactly what I do. And so far it tis the best strategy, because if something does now work, all I have to do is
# mv store store-new
# mv store-old store

and the site is working accordingly. You will need 2 MySQL databases to do this on a production environment.

This is a great, great

This is a great, great article on Upgrading Magento to the latest version. Thank you.

This worked for me perfectly.

Thanks a lot for this

Thanks a lot for this article! Really good.
Just one question: I want to upgrade to 1.6.1 (not the latest 1.6.2 – some 3rd party extension seems not to work with 1.6.2). How to do that?

I downloaded the full zip of 1.6.1 and followed your instructions. Checking in admin, the version is 1.6.2. I then run the command

yes | cp -Rf magento/* .

Now, in admin, the version is 1.6.1. But in Magento Connect "Mage_All_latest" showing 1.6.2 installed ??

Regards, Magnus

Followed this one for a

Followed this one for a Magento update, as a reference, and it worked flawlessly. Thanks.

Getting "An error occurred while saving the URL rewrite" in Index Management, everything else great.

I did a "TRUNCATE" on the

I did a "TRUNCATE" on the table core_url_rewrite – that solved that problem for me. Manage to do a reindex in admin after that.

thanx for this article man. I

thanx for this article man. I hope I will find my gutts to do an upgrade soon. Im now having 1.4.1 and I m afraid I will mess everything up so these kind of articles are nice!

What is the best way to make a backup?

I am trying to update my

I am trying to update my Magento store from version v1.4.0.1 to v 1.6.2, but I got stuck on Step 8. When I went to the URL in the browser and after a long time loading I got this error…

Error in file: "/Applications/XAMPP/xamppfiles/htdocs/mysite.local/app/code/core/Mage/Customer/sql/customer_setup/mysql4-upgrade-1.5.9.9-1.6.0.0.php" - SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '0-147' for key 'UNQ_BY_CUSTOMER'

I tried accessing the site again and it took another chunk of time loading and now all I get is this error…

Error in file: "/Applications/XAMPP/xamppfiles/htdocs/mysite.local/app/code/core/Mage/Catalog/sql/catalog_setup/upgrade-1.6.0.0.1-1.6.0.0.2.php" - SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '27-General' for key 'UNQ_MAG_EAV_ATTR_GROUP_ATTR_SET_ID_ATTR_GROUP_NAME'

Any ideas?

To answer my own question...

To answer my own question... I tracked this down to the fact that several of my attributes groups with the name "General" were set with a default id of "0". Apparently Magento doesn't like that. I ran the SQL statement below and refreshed the browser and the upgrade continued without a hitch. Thanks for this fantastic walk-through! It was very helpful.

UPDATE `mag_eav_attribute_group`
SET `default_id` = 1
WHERE `attribute_group_name` = "General" AND `default_id` = 0

Excellent article saved us

Excellent article saved us from customer wrath! Hit a frustrating problem, though: the mage install script kept hitting a 33MB memory limit part-way through and aborting. After much tweaking of PHP memory limits in php.ini and .htaccess, which made absolutely no difference, I solved the problem by editing the mage script to change the PHP memory limit on the command line PHP call: the last-but one line of "mage" changes from:

-d auto_prepend_file="" -d auto_append_file="" \

to:

-d auto_prepend_file="" -d auto_append_file="" -d memory_limit=512M \

Obviously, change the memory limit value to whatever makes sense for you. I guess this might not work if your hosting configuration prevents the memory limit being over-ridden, but it might be worth a try.

Post new comment

The content of this field is kept private and will not be shown publicly.