OK, eventually I ended up removing the blocks and chainstate directories, and recovering from a backup I made in April. Re-syncing from there took a while, but it worked. Apparently, the issue was a rare kind of glitch on my system; I'll be making more frequent block chain back-ups in the future.