于是,景初二年(238年)正月,魏明帝召回司马懿,命他率兵讨伐。魏明帝问他估计公孙渊有什么对策,司马懿说:“事先弃城逃走,是上计。凭借辽水抗拒我大军,这是次计。坐守襄平,那他就要当俘虏了。”魏明帝又问:“公孙渊会采用哪种?”司马懿回答:“只有聪明人能正确估量彼此实力。预先弃城,不是公孙渊所能做到的。他定会认为我们这次孤军远征不能持久,先在辽水抗拒,再退守襄平,这是中计和下计”。魏明帝问:“往还需要多少时间?”司马懿说:“去百日,回百日,攻战百日,用六十天休息,一年时间足够了。”
当时朝廷大修宫室,加上军用物资,百姓饥弊。司马懿出征前劝魏明帝说:“昔日周公营造洛邑,萧何建造未央宫,今日宫室不完备,这是我的责任。然而黄河以北,百姓穷困,内外徭役繁多,势必不能百废俱兴,应暂时停止内务,以救目前之急。”
临行时亲友相送,司马懿感慨作歌:“天地开辟,日月重光。遭遇际会,毕力遐方。将扫群秽,还过故乡。肃清万里,总齐八荒。告成归老,待罪舞阳。”
正月,司马懿率牛金、胡遵等步骑四万,从京师出发,经孤竹,越碣石,六月,进至辽水。公孙渊果然急令大将军卑衍、杨祚等人率步骑数万,依辽水围堑20余里,坚壁高垒,阻击魏军。
司马懿采用声东击西之计,先在南线多张旗帜,佯攻围堑,吸引敌军主力,而以主力隐蔽渡过辽水,逼进敌军的襄平本营,部将不解问其原因。司马懿说:“敌人坚营高垒,就是想让我们兵疲粮尽,若攻城,正中其计。古人曰,敌虽高垒,不得不与我战者,攻其所必救也。现在他们大军在此,老巢却空。我直指襄平,敌军必惧,惧而求战,破之必矣”。接着整顿阵列前进,敌军果然出来截击。司马懿对诸将说:“我之所以不攻其营,正是要等现在的局面。”于是指挥魏军痛击,三战皆捷,遂乘胜进围襄平。
当初公孙渊闻魏军来攻,求救于孙权,孙权也出兵为其声援,并给公孙渊写信:“司马懿善用兵所向无前,深深为贤弟感到担忧啊。”
适逢连降大雨,辽水暴涨,平地数尺,魏军恐惧,诸将思欲迁营。司马懿下令有敢言迁营者斩,都督令史张静违令被斩,军心始安。公孙渊军乘雨出城,打柴牧马,安然自若。魏将领请求出击,司马懿不允。司马陈圭曰问司马懿:“当年攻上庸,八路并进,昼夜不停,故能在一旬半时间里,攻下坚城,杀了孟达。这次远道而来,为什么行动却更加缓慢?”
司马懿说:“当年孟达军队少而粮食能支持一年,我们的兵是孟达的四倍粮食却不足一月,以一月粮的军队对付有一年粮的军队,怎能不速战速决?四打一,即使一半人伤亡,也是可行,当时不计死伤,正是要为有限的粮草争取时间。而今敌兵多我军少,敌粮少我粮多,又遇大雨,想速战也不可能。从出兵开始,我就不担心敌人来进攻,而是怕他们会逃跑。如今敌军粮草将尽,我军包围尚未合拢,若现在抢掠牛马,会逼他们逃走。兵者诡道,善因事变。他们现在凭借人多和大水,虽然饥困,也不肯就擒。这时候更当稳住对方,不能为得小利而把敌人吓跑。”
司马懿将计就计,故意示弱。朝廷听说雨大敌强,不少人请求召还司马懿。魏明帝却说:“司马懿临危制变,生擒公孙渊指日可待。”
月余,雨停,水渐退去。魏军完成对襄平的包围,昼夜强攻。城内粮尽,死者甚多,其将杨祚等降。时偶有流星自城西南向东北划过,坠落在梁水附近,城中愈发震恐。公孙渊也很惊惧,八月,派相国王建、御史大夫柳甫请解围而缚。司马懿斩杀使者,发布檄文严责:“昔日楚和郑是并列的国家,郑伯尚且肉袒牵羊而迎楚军。孤家为王者大臣,位在上公,而王建等要我解围退兵,如楚郑一样同列相待。二人年老糊涂,必是传话不符原意,已经将他们斩首。若还有话要说,可再派年少明智果决的人来。”
公孙渊又派侍中卫演来请求定日期送人质。司马懿对他说:“作战的大要有五:能战当战,不能战当守,不能守当走,余二事惟有降与死耳。公孙渊若不肯自缚请罪,就是决心寻死了,不须送什么人质。”
公孙渊欲从城南突围,司马懿纵兵击破其军,公孙渊战死在梁水边上。入城后,司马懿屠十五岁以上男子七千多人,收集尸体,筑造京观。把公孙渊所任公卿以下一律斩首,杀死将军毕盛等二千多人。收编百姓四万户。
司马懿释放了当年被公孙渊篡夺官位的公孙恭,又为被公孙渊迫害的纶直等人修了坟墓,表彰他们的后代。下令说:“古代讨伐一个国家,仅杀其中顽固凶恶的人而已。各位被公孙渊所连累的人,全部宽恕。中原人愿意返回故乡的,各随己愿。” 当时司马懿军中有的士兵衣单寒冷,请求发给短袄,司马懿不给,表示“襦者官物,人臣无私施也”。于是上奏朝廷,把一千多名六十岁以上的士兵解除兵役,送返回乡。在原定一年的期限内,胜利班师。魏明帝派使者到蓟去犒劳部队,增司马懿食昆阳县,前后共二县。曹魏数十年来辽东问题终于彻底解决。