Data recovery is a tricky thing, and more suited to a few books than a USE answer. There are lots of myths, legends and voodoo recipes out there. :)
If the disk appears to be talking on the bus, perhaps you can get some of the data. Look up GNU ddrescue. It does block-level rescue of a disk or individual partitions. There's also ‘plain’
ddrescue, which is nearly identical. I've used both.
ddrescue, the dying disk and another disk of equal or larger size. If you want to rescue disk-to-disk, the disk should probably be identical in size. If not, you can do a disk-to-image copy and then use
mount (with the
-o loop option) to get file-level access to the partitions.
ddrescue works a bit like
dd (hence the name), but is designed to work around bad sections of a disk. First it copies large chunks, leaving holes (sparse files, if you're saving to a filesystem) where the errors are. It then divides and conquers, copying progressively smaller areas of the problem parts of the disk, until only the failed bad sectors are left uncopied. It can also retry its operations if the disk is behaving erratically.
Also, you can stop it and restart it whenever you feel like, provided you give it a logfile (which is human readable and tells you what disk blocks are damaged). Here's a sample invocation:
ddrescue /dev/sdg /mnt/sdg.img /mnt/sdg-ddrescue.log
You can interrupt it with
Ctrl-C and restart it whenever you want. Check the manpage for additional options if the rescue operation isn't going well.