Skip to main content

April: Hidden migrations

The only consistently effective way to restore runs of migratory fishes is to remove the dams that block them.

Photo by USFWS

david strayer
Freshwater Ecologist

Error message

  • Deprecated function: strlen(): Passing null to parameter #1 ($string) of type string is deprecated in Drupal\Component\Utility\Unicode::validateUtf8() (line 395 of core/lib/Drupal/Component/Utility/Unicode.php).
    Drupal\Component\Utility\Unicode::validateUtf8() (Line: 65)
    Drupal\Component\Utility\Xss::filter() (Line: 351)
    _colorbox_formatter_get_caption() (Line: 140)
    template_preprocess_colorbox_formatter()
    call_user_func_array() (Line: 261)
    Drupal\Core\Theme\ThemeManager->render() (Line: 491)
    Drupal\Core\Render\Renderer->doRender() (Line: 248)
    Drupal\Core\Render\Renderer->render() (Line: 476)
    Drupal\Core\Template\TwigExtension->escapeFilter() (Line: 254)
    __TwigTemplate_e68b79b8ded550481c188f9d99549233->{closure}() (Line: 2058)
    Twig\Extension\CoreExtension::captureOutput() (Line: 44)
    __TwigTemplate_e68b79b8ded550481c188f9d99549233->doDisplay() (Line: 387)
    Twig\Template->yield() (Line: 343)
    Twig\Template->display() (Line: 358)
    Twig\Template->render() (Line: 35)
    Twig\TemplateWrapper->render() (Line: 33)
    twig_render_template() (Line: 348)
    Drupal\Core\Theme\ThemeManager->render() (Line: 491)
    Drupal\Core\Render\Renderer->doRender() (Line: 504)
    Drupal\Core\Render\Renderer->doRender() (Line: 248)
    Drupal\Core\Render\Renderer->render() (Line: 476)
    Drupal\Core\Template\TwigExtension->escapeFilter() (Line: 45)
    __TwigTemplate_1c086714c718e741ecd343a31c9086e1->doDisplay() (Line: 387)
    Twig\Template->yield() (Line: 343)
    Twig\Template->display() (Line: 358)
    Twig\Template->render() (Line: 35)
    Twig\TemplateWrapper->render() (Line: 33)
    twig_render_template() (Line: 348)
    Drupal\Core\Theme\ThemeManager->render() (Line: 491)
    Drupal\Core\Render\Renderer->doRender() (Line: 504)
    Drupal\Core\Render\Renderer->doRender() (Line: 248)
    Drupal\Core\Render\Renderer->render() (Line: 224)
    Drupal\entity_embed\Plugin\Filter\EntityEmbedFilter->Drupal\entity_embed\Plugin\Filter\{closure}() (Line: 638)
    Drupal\Core\Render\Renderer->executeInRenderContext() (Line: 223)
    Drupal\entity_embed\Plugin\Filter\EntityEmbedFilter->process() (Line: 118)
    Drupal\filter\Element\ProcessedText::preRenderText()
    call_user_func_array() (Line: 113)
    Drupal\Core\Render\Renderer->doTrustedCallback() (Line: 870)
    Drupal\Core\Render\Renderer->doCallback() (Line: 432)
    Drupal\Core\Render\Renderer->doRender() (Line: 248)
    Drupal\Core\Render\Renderer->render() (Line: 476)
    Drupal\Core\Template\TwigExtension->escapeFilter() (Line: 254)
    __TwigTemplate_e68b79b8ded550481c188f9d99549233->{closure}() (Line: 2058)
    Twig\Extension\CoreExtension::captureOutput() (Line: 44)
    __TwigTemplate_e68b79b8ded550481c188f9d99549233->doDisplay() (Line: 387)
    Twig\Template->yield() (Line: 343)
    Twig\Template->display() (Line: 358)
    Twig\Template->render() (Line: 35)
    Twig\TemplateWrapper->render() (Line: 33)
    twig_render_template() (Line: 348)
    Drupal\Core\Theme\ThemeManager->render() (Line: 491)
    Drupal\Core\Render\Renderer->doRender() (Line: 248)
    Drupal\Core\Render\Renderer->render() (Line: 476)
    Drupal\Core\Template\TwigExtension->escapeFilter() (Line: 423)
    __TwigTemplate_e9c454f5097960fcbad400867a054bcd->doDisplay() (Line: 387)
    Twig\Template->yield() (Line: 343)
    Twig\Template->display() (Line: 358)
    Twig\Template->render() (Line: 35)
    Twig\TemplateWrapper->render() (Line: 33)
    twig_render_template() (Line: 348)
    Drupal\Core\Theme\ThemeManager->render() (Line: 491)
    Drupal\Core\Render\Renderer->doRender() (Line: 248)
    Drupal\Core\Render\Renderer->render() (Line: 238)
    Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 638)
    Drupal\Core\Render\Renderer->executeInRenderContext() (Line: 231)
    Drupal\Core\Render\MainContent\HtmlRenderer->prepare() (Line: 128)
    Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse() (Line: 90)
    Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray()
    call_user_func() (Line: 111)
    Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch() (Line: 186)
    Symfony\Component\HttpKernel\HttpKernel->handleRaw() (Line: 76)
    Symfony\Component\HttpKernel\HttpKernel->handle() (Line: 53)
    Drupal\Core\StackMiddleware\Session->handle() (Line: 48)
    Drupal\Core\StackMiddleware\KernelPreHandle->handle() (Line: 28)
    Drupal\Core\StackMiddleware\ContentLength->handle() (Line: 32)
    Drupal\big_pipe\StackMiddleware\ContentLength->handle() (Line: 191)
    Drupal\page_cache\StackMiddleware\PageCache->fetch() (Line: 128)
    Drupal\page_cache\StackMiddleware\PageCache->lookup() (Line: 82)
    Drupal\page_cache\StackMiddleware\PageCache->handle() (Line: 50)
    Drupal\ban\BanMiddleware->handle() (Line: 48)
    Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle() (Line: 51)
    Drupal\Core\StackMiddleware\NegotiationMiddleware->handle() (Line: 36)
    Drupal\Core\StackMiddleware\AjaxPageState->handle() (Line: 51)
    Drupal\Core\StackMiddleware\StackedHttpKernel->handle() (Line: 741)
    Drupal\Core\DrupalKernel->handle() (Line: 19)
    
  • Deprecated function: str_replace(): Passing null to parameter #3 ($subject) of type array|string is deprecated in Drupal\Component\Utility\Xss::filter() (line 69 of core/lib/Drupal/Component/Utility/Xss.php).
    Drupal\Component\Utility\Xss::filter() (Line: 351)
    _colorbox_formatter_get_caption() (Line: 140)
    template_preprocess_colorbox_formatter()
    call_user_func_array() (Line: 261)
    Drupal\Core\Theme\ThemeManager->render() (Line: 491)
    Drupal\Core\Render\Renderer->doRender() (Line: 248)
    Drupal\Core\Render\Renderer->render() (Line: 476)
    Drupal\Core\Template\TwigExtension->escapeFilter() (Line: 254)
    __TwigTemplate_e68b79b8ded550481c188f9d99549233->{closure}() (Line: 2058)
    Twig\Extension\CoreExtension::captureOutput() (Line: 44)
    __TwigTemplate_e68b79b8ded550481c188f9d99549233->doDisplay() (Line: 387)
    Twig\Template->yield() (Line: 343)
    Twig\Template->display() (Line: 358)
    Twig\Template->render() (Line: 35)
    Twig\TemplateWrapper->render() (Line: 33)
    twig_render_template() (Line: 348)
    Drupal\Core\Theme\ThemeManager->render() (Line: 491)
    Drupal\Core\Render\Renderer->doRender() (Line: 504)
    Drupal\Core\Render\Renderer->doRender() (Line: 248)
    Drupal\Core\Render\Renderer->render() (Line: 476)
    Drupal\Core\Template\TwigExtension->escapeFilter() (Line: 45)
    __TwigTemplate_1c086714c718e741ecd343a31c9086e1->doDisplay() (Line: 387)
    Twig\Template->yield() (Line: 343)
    Twig\Template->display() (Line: 358)
    Twig\Template->render() (Line: 35)
    Twig\TemplateWrapper->render() (Line: 33)
    twig_render_template() (Line: 348)
    Drupal\Core\Theme\ThemeManager->render() (Line: 491)
    Drupal\Core\Render\Renderer->doRender() (Line: 504)
    Drupal\Core\Render\Renderer->doRender() (Line: 248)
    Drupal\Core\Render\Renderer->render() (Line: 224)
    Drupal\entity_embed\Plugin\Filter\EntityEmbedFilter->Drupal\entity_embed\Plugin\Filter\{closure}() (Line: 638)
    Drupal\Core\Render\Renderer->executeInRenderContext() (Line: 223)
    Drupal\entity_embed\Plugin\Filter\EntityEmbedFilter->process() (Line: 118)
    Drupal\filter\Element\ProcessedText::preRenderText()
    call_user_func_array() (Line: 113)
    Drupal\Core\Render\Renderer->doTrustedCallback() (Line: 870)
    Drupal\Core\Render\Renderer->doCallback() (Line: 432)
    Drupal\Core\Render\Renderer->doRender() (Line: 248)
    Drupal\Core\Render\Renderer->render() (Line: 476)
    Drupal\Core\Template\TwigExtension->escapeFilter() (Line: 254)
    __TwigTemplate_e68b79b8ded550481c188f9d99549233->{closure}() (Line: 2058)
    Twig\Extension\CoreExtension::captureOutput() (Line: 44)
    __TwigTemplate_e68b79b8ded550481c188f9d99549233->doDisplay() (Line: 387)
    Twig\Template->yield() (Line: 343)
    Twig\Template->display() (Line: 358)
    Twig\Template->render() (Line: 35)
    Twig\TemplateWrapper->render() (Line: 33)
    twig_render_template() (Line: 348)
    Drupal\Core\Theme\ThemeManager->render() (Line: 491)
    Drupal\Core\Render\Renderer->doRender() (Line: 248)
    Drupal\Core\Render\Renderer->render() (Line: 476)
    Drupal\Core\Template\TwigExtension->escapeFilter() (Line: 423)
    __TwigTemplate_e9c454f5097960fcbad400867a054bcd->doDisplay() (Line: 387)
    Twig\Template->yield() (Line: 343)
    Twig\Template->display() (Line: 358)
    Twig\Template->render() (Line: 35)
    Twig\TemplateWrapper->render() (Line: 33)
    twig_render_template() (Line: 348)
    Drupal\Core\Theme\ThemeManager->render() (Line: 491)
    Drupal\Core\Render\Renderer->doRender() (Line: 248)
    Drupal\Core\Render\Renderer->render() (Line: 238)
    Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 638)
    Drupal\Core\Render\Renderer->executeInRenderContext() (Line: 231)
    Drupal\Core\Render\MainContent\HtmlRenderer->prepare() (Line: 128)
    Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse() (Line: 90)
    Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray()
    call_user_func() (Line: 111)
    Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch() (Line: 186)
    Symfony\Component\HttpKernel\HttpKernel->handleRaw() (Line: 76)
    Symfony\Component\HttpKernel\HttpKernel->handle() (Line: 53)
    Drupal\Core\StackMiddleware\Session->handle() (Line: 48)
    Drupal\Core\StackMiddleware\KernelPreHandle->handle() (Line: 28)
    Drupal\Core\StackMiddleware\ContentLength->handle() (Line: 32)
    Drupal\big_pipe\StackMiddleware\ContentLength->handle() (Line: 191)
    Drupal\page_cache\StackMiddleware\PageCache->fetch() (Line: 128)
    Drupal\page_cache\StackMiddleware\PageCache->lookup() (Line: 82)
    Drupal\page_cache\StackMiddleware\PageCache->handle() (Line: 50)
    Drupal\ban\BanMiddleware->handle() (Line: 48)
    Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle() (Line: 51)
    Drupal\Core\StackMiddleware\NegotiationMiddleware->handle() (Line: 36)
    Drupal\Core\StackMiddleware\AjaxPageState->handle() (Line: 51)
    Drupal\Core\StackMiddleware\StackedHttpKernel->handle() (Line: 741)
    Drupal\Core\DrupalKernel->handle() (Line: 19)
    

Animal migrations are among nature’s most stirring spectacles. Who hasn’t felt a little thrill seeing V’s of geese passing overhead and hearing their wild cries? Shots of the endless herds of wildlife migrating across the Serengeti are a staple of television nature specials, and many of us now plant milkweeds in a corner of our garden for that most improbable of migrants, the monarch butterfly. So why do so few of us know about spectacular migrations that happen every spring, right in our own back yards? Because these are migrations of fish, out of sight beneath the surfaces of our rivers and streams.

I know about these migrations because I’m an avid angler, and I’m out in the water with the fish. One of my fishing spots is the Maumee River, a big river that runs into western Lake Erie. Wave after wave of spawning fish fill the Maumee from March until June. Pike and walleyes appear in March, followed by redhorses and suckers, then white bass, and finally garfish, sheepshead, and catfish. In the old days, there were sturgeon, too, migrating far up into the small creeks that feed the Maumee during corn-planting season in late spring. My grandfather told me that farmers carried pitchforks into their fields, so that they could spear these huge fish when they heard them splashing in the ditches.

sucker migration
White suckers migrating up Silver Creek, Wisconsin. Credit: Titus Seilheimer

In clear streams, I’ve seen migrations of fish so thick that you couldn’t see the bottom of the creek through the fish. The Maumee is too muddy to see many fish, but signs are everywhere that you’re in the midst of an immense migration. You see fish jumping and swirling at the surface, and sometimes feel them bumping into your boots. On a good day, everyone is catching fish. Anglers take home tens of thousands of walleyes each year out of a run that is perhaps ten times that large, and the white bass run is even larger. Millions of fish migrate up the Maumee each spring, and the Maumee is just one of many fish-filled streams in our area. Suckers and steelhead run up out of the Great Lakes, pike move up out of our inland lakes, and smallmouth and rock bass migrate upstream within our rivers. Spring is a time of great fish migrations in the Great Lakes region.

You’re missing one of nature’s wonders by not being able to see these fish migrations. More importantly, because we don’t see or appreciate these migrations, we’ve been mismanaging our rivers and fishes.

Migrations that occur above the water’s surface are obvious, so we tend not to build obstacles that would block them. When we do erect obstacles, the results are readily apparent – migrating wildlife pile up along fences or are killed along highways; dead birds appear at the bases of wind turbines and tall buildings. But we don’t so readily see the consequences when we obstruct underwater migrations, so we build barriers against fish migrations all the time. Many of the more than 7,000 dams on Great Lakes tributaries completely stop fish from migrating upstream, and even small dams and poorly designed culverts can block migrating fish.

When I was a kid, I thought that dams must be good for fish, because fishing was often so good below dams. Fishing is good below dams for the same reason that wildebeest hunting would be fantastic along a tall fence that blocked the Serengeti – the animals have nowhere else to go.

Instead, dams have harmed fish populations all over the world by preventing these migratory animals from reaching their spawning and nursery grounds. Highly migratory species like salmon, eels, sturgeons, and shads have been hurt most badly. But every kind of migratory fish, and there are many, is affected. In our region, dams have eliminated populations of dozens of fish species, including all of the species that I mentioned earlier in this piece.

Fish ladder in Grand Rapids, Michigan. Credit:howderfamily.com.

But can’t we build dams that give fish a way to get over them? Nearly everyone has seen a picture of a fish ladder, usually showing a salmon making its way up a watery staircase. The poor performance of fish ladders in the real world belies this happy image. Many fish ladders are poorly designed, so that fish can’t find them, or even athletic species like salmon can’t make their way up. Most migratory fish are not as athletic as salmon and can’t or won’t use ladders. And even if adults can use a fish ladder to get up over a dam, when their young move back downstream, they may get lost or eaten wandering through the upstream reservoir, killed plunging over the dam, or chopped to pieces in hydroelectric turbines. Occasionally it has been possible to retrofit low dams to provide effective fish passage (see the photo), but overall, fish passages have largely been a dangerous illusion, allowing us to pretend that blocking fish migrations with dams is a problem with an easy solution.

river raisin rock ramp
A rock ramp installed just downstream of a small dam on the River Raisin that allows fish to pass. Unfortunately, fish that make it past these modified dams in the city of Monroe are blocked by a still-impassible dam less than 5 miles up from Lake Erie. Credit: Melanie Foose.

The only consistently effective way to restore runs of migratory fishes is to remove the dams that block them. Hundreds of dams in our region are deteriorating or have outlived their original purposes. Many of these old dams are in such poor shape that they are safety hazards, so removing them can serve the twin purposes of improving public safety and restoring fish migrations. But removing antiquated dams is expensive, and can be technically, legally, and politically complicated, so only a few have so far been removed. According to American Rivers and the state Department of Natural Resources, only about 100 Michigan dams have been removed, while about 2,400 remain.

If you live near a clear stream, you may be lucky enough to see the spring fish migrations, especially if you go out at dusk or after dark. But otherwise, the best way for you to see spring fish migrations may be with your eyes closed, imagining the unseen world beneath the surface of our rivers, either filled with schools of jostling fish, or as strangely empty as a spring sky devoid of birds.

david strayer
Freshwater Ecologist

Dave Strayer is a freshwater ecologist whose work focuses on measuring the long-term effects of zebra mussels on the Hudson River ecosystem, and understanding the roles of suspension-feeding animals in ecosystems. Strayer also works on broader issues in freshwater conservation ecology and invasion biology.

More on this topic