I would suggest you try to do something along the line of:
SELECT count(*) FROM mytable WHERE my_primary_key < value ; ... and find at which point it fails. [This may be tedious, but you can just cut in half repeatedly, until you find the value that first fails.]
You will most probably need to alter the different settings that affect index usage, because you actually want to force the database to use the index, even if it actually must scan 99% of the table. You want it not to scan the page that booms.
If you can get SELECT to give you most of the data, you can then do something such as:
CREATE TABLE my_table_2 AS SELECT * FROM my_table WHERE my_primary_key < value; and later on:
ALTER TABLE my_table RENAME TO my_table_old ; ALTER TABLE my_table_2 RENAME TO my_table ; ... and you'll have all the data that could be retrieved. I wouldn't drop the old table, in case someone finds later on a better method of retrieving the missing info.
Best of luck.