公元497年五月三日,孝文帝从长安出发,乘船由渭河进入黄河。六日,派使者到丰(陕西省西安市长安区西北)祭祀周文王,在镐(陕西省西安市长安区西北)祭祀周武王,六月五日,他回到了洛阳。
仅仅隔了一天,六月七日,孝文帝即下诏征发冀州、定州、瀛州、相州、济州五州之兵二十万,准备对南齐发起第二次进攻。十二日,他将集结起来的军队分为六个军团,分别确定了各军团的进攻方向和战斗任务,魏齐两国之间的冲突即将爆发。
太和二十一年(齐明帝建武四年,公元497年)八月十九日,在经历了五十余天的准备后,北魏孝文帝在洛阳华林园举行阅兵仪式,二十五日,北魏大军开始出征。
在最初的时候,南齐方面并没有判断出魏军的主攻方向,而身陷北魏的南齐前宁州刺史董峦的叛归让齐明帝了解到了魏军即将对南阳方向发起进攻。董峦,在太武帝时期叛逃到江南,被任命为宁州刺史,后在与北魏作战中被俘,他与儿子董景曜一起被送到平城。虽然董峦在江南生活多年,但他北方人的性格一直没变,性格爽朗,不认识几个字。孝文帝在大殿之上询问南方之事,董峦回答不出,频频看儿子,董景曜代父作答,将萧鸾篡位的经过说得一清二楚,孝文帝非常满意,即任命董峦为越骑校尉,董景曜为员外郎。在北魏期间,董峦一直密谋南逃,被发现后,被流放到朔州。孝文帝南征前,想起了董峦,将其召到军中,董景曜专程来到洛阳,给孝文帝秘密报告说自己的父亲肯定会趁机南逃,孝文帝没有在意。当魏军进抵鲁阳时,董峦单人匹马果然南叛。
齐明帝萧鸾对董峦的报告似乎也是将信将疑,因为,相对于淮河中下游来说,雍州地区距离京师较远,且上一次孝文帝南伐就将进攻的主要方向放在了义阳,并突入淮南,这都不得不让齐明帝对淮南给予高度的重视,即便如此,他还是派遣了军主、直阁将军胡松率军协助北襄城太守成公期戍守赭阳,命令军主鲍举协助西汝南、北义阳太守黄瑶起戍守舞阴(河南省泌阳西北)。与此同时,南齐还招诱北魏南梁州刺史杨灵珍叛变,孝文帝命令河南尹李崇为都督陇右诸军事,率领数万部队前去讨伐。由于杨灵珍事件,导致第二次南伐一开始就由孝文帝计划的南阳、义阳两个战场,转变成了义阳、南阳、梁州三个战场。
九月十七日,孝文帝留下诸将继续围攻赭阳,而他则亲自率领大军继续南下,进攻南阳,十九日,孝文帝所部数万骑兵进抵南阳,趁夜袭占了南阳外城。南齐南阳太守房伯玉率众退守内城,孝文帝率军向城南的寺庙前宿营,魏军从东南角沟桥上通过。房伯玉派遣数名勇士头戴虎头帽,身着虎皮衣提前埋伏在桥下,当孝文帝从桥上通过时,这几名敢死队员突然从涵洞中跃出,魏军人马一时大惊而退。这几名壮士斩杀了几个魏军,孝文帝命令神射将原灵度朝齐军壮士射箭,一一将他们射杀,孝文帝这才通过了小桥。
九月二十三日,孝文帝在南阳停留五天后,留下咸阳王元禧、前将军元英继续进攻南阳,他自己又率部继续南下朝新野杀来。新野太守刘思忌固守不战,十月三日,魏军从四面对新野发起了总攻,却无法攻破,于是,孝文帝下令左右两路军队构筑长墙,准备长期围困。
魏军凭借着优势兵力,在赭阳、南阳、新野三个据点同时发起了进攻。南齐雍州刺史曹虎与南阳太守房伯玉关系恶劣,派军进至均口(湖北省老河口市附近),逗留不进。魏军围困新野一个月后,到十一月十一日,南齐前军将军韩秀方、弋阳太守王副之、后军将军赵祖悦等十五将率部向魏军投降。十四日,魏军在汉水以北大破齐军,俘获齐军将领王伏保等人。孝文帝下令安抚百姓,劝令他们恢复农业生产,对于九十岁以上的老人授予太守级待遇,对于八十五岁以上的老人给予县令级待遇。
与此同时,魏军在赭阳方向也取得了一定进展。
韩麒麟次子韩显宗时任右军府长史、征虏将军、统军。他率领所部驻扎在赭阳城外,成公期派遣军主胡松、高法援等人率领山蛮一起进攻韩显宗的军营。韩显宗亲率部队拼死抵抗,遂斩杀了高法援,击破齐军。
对于魏军的进攻,齐明帝迅速作出了反应,除了派遣直阁将军胡松、军主鲍举协防赭阳、舞阴之外,随着战事的扩大,他下诏徐州刺史裴叔业率领部队西进,救援雍州,但裴叔业上书称∶"徐州军队大多是北方之民,他们不愿远行,只想抢掠。如果我率领徐州部队主动入侵魏境,那么,司州和雍州受到的压力自然就减轻了,不用劳民远征。"齐明帝同意了,裴叔业率领徐州军队主动出击,向魏国国境内的虹城(安徽省五河县西)发起了进攻,俘获了四千多魏民。至此,魏齐双方全线开打,其中中线南阳前线、义阳前线是北魏主动开辟的战线,而西线梁州战线和东线淮河下游战线则是南齐主动开辟的,其目的就在于避实击虚,减轻中线齐军的压力。但要想保住南阳,仅仅如此还远远不够,南齐朝廷还必须给雍州增兵。
十月二十日,齐明帝再派遣太子中庶子萧衍、右军司马张稷率军赶赴雍州,又下诏命令度支尚书崔慧景假节,率领两万步兵、一千骑兵逆流而上,救援雍州,萧衍及曹虎的雍州部队均受崔慧景统一指挥。萧衍、张稷所部在十月即抵达了雍州,但可能是由于二人地位不高,兵力寡弱,又无法指挥雍州曹虎的部队,因此,在他们到来之后并没有立即对汉水北岸的魏军发起进攻。
此时汉水以北形势大坏,而让人感到疑惑不解的是身为都督荆州、雍州七州诸军事的荆州刺史萧遥欣却毫无动作,致使齐明帝不得不从中央抽调部队增援雍州。萧遥欣的态度让齐明帝大为恼火,对其非常忌惮,南郡太守刘季连(刘思考之子)密报称萧遥欣有异心,于是,齐明帝就将益州刺史萧懿调回,而任命刘季连为益州刺史,居于荆州上游以牵制萧遥欣。
新野百姓张猪率领一万多家百姓占据坞堡,抵御魏军。十二月七日,魏军攻破张猪的堡垒,俘虏、斩杀了近万人。十二月十四日,孝文帝下诏命令对于全国罪该流放的罪犯一律不再执行,全部带至军中,在攻城时由他们先上。十七日,孝文帝亲自南下,抵达汉水北岸,沿着汉水一路东巡,直到二十五日才又回到了新野大营,第二天,孝文帝亲自巡视各营,慰问魏军将士。
东线战场上,在裴叔业取得了初战胜利后,齐军分三个突击方向对魏南青州黄郭戍(山东省沂水县境)、太仓口(河南省汝南县境)、楚王戍(安徽省临泉县西南)发起了进攻,但是,东线战场齐军的进展并不顺利,三路大军几乎全部失败。
在西线仇池地区,魏军同样取得了胜利。
李崇率领数万魏军翻山越岭,出其不意,迂回奔袭氏族头领杨灵珍,杨灵珍大败,部众溃散一大半,李崇进据赤土(甘肃省礼县东北四里)。杨灵珍派遣从弟杨建率领五千人驻守龙门(甘肃省西和县东南龙门戍),他自己亲率一万精兵固守鹫峡(甘肃省西和县东南)。杨灵珍将龙门之北数十里中的树木都砍下,填塞了道路,在鹫峡峡谷口堆积巨木,囤聚了大量滚木确石,以抵御魏军。李崇命令统军慕容据率领五千部队从小道迂回前进,趁夜对龙门发起了突然袭击,一举占领了龙门戍。与此同时,李崇亲自率领大军进攻鹫峡,杨灵珍屡战屡败,仓皇逃至南齐汉中。
转眼过了新年,孝文帝率领的二十多万大军已经在南阳地区作战了四个多月了。建武五年(孝文帝太和二十二年)元旦,南齐朝廷因魏军大举进攻而实施大赦。五天之后,在围困了四个月后,魏军统军将领李佐率部攻克了新野,生擒南齐辅国将军、新野太守刘思忌。
一月二十三日,齐明帝再度派遣太尉陈显达率军增援雍州。二月一日,下诏命令左卫将军萧惠休等人出兵救援寿阳。二月十二日,魏军攻下南阳北城,南阳太守房伯玉无路可逃,自我捆绑着投降。此时,南阳、新野以北以南地区已经落入魏军之手,但穰城(河南省邓州市)尚在齐军的控制之下,为了招诱那里的居民,第二天.,孝文帝下诏许诺,凡是穰城百姓首先归降北魏并始终不变心的,免除三十年的徭役,并将其居住地标注为"归义乡";稍后投降的,免除十五年的徭役。
崔慧景的部队进抵襄阳的时候,汉水以北五郡已经沦陷了,齐明帝给其加军号为平北将军。齐明帝即免去了雍州刺史曹虎,改任其为给事中、右卫将军、持节,但仍然留在襄阳参战,以荆州刺史萧遥欣兼任雍州刺史。崔慧景到任后,即迅速投入对汉水以东樊城的防御,并试图率军渡过汉水北上,以收复刚刚被魏军占领的土地。崔慧景率部从驻地涡口村(今地不详)出发,与太子中庶子萧衍、军主前宁州刺史董仲民、刘山阳、裴飚、傅法宪等率五千余人进驻邓城(河南省南阳市邓州市)。
三月一日,齐军进入邓城之后,侦察骑兵就报告说,魏军即将抵达。崔慧景的部队驻守在南门,萧衍的部队在北门,得到警报后,崔慧景立即命令各部迅速登上城墙迎战。当时,齐军一路饿着肚子急行军来到邓城,士气很低落,军中有三名来自北魏的人趁机逃归魏军,将齐军的真实情况全部泄露给了魏军。得到实情后,孝文帝即命令彭城王元勰派遣武卫将军元蚪率部进至邓城东南,切断崔慧景的归路;司马孟斌所部进至城东,右卫将军杨播屯在城北,从两个方向朝城内射箭。萧衍打算趁着魏军来的人数尚少,立足未稳,主动率军出战,但崔慧景劝阻道∶ "敌人夜里不会围攻城池,等到日暮后,他们自然就会退去了。"然而,随着时间的推移,魏军不仅没有撤退,相反还越来越多,崔慧景不禁大惊失色,打算率军撤离,萧衍坚决制止,但崔慧景不从。
崔慧景从南门率领本部人马仓皇突围,齐军其他各部互不通知,也都各自逃命而去。魏军从邓城北门进入,刘山阳与部曲数百人断后死战,魏军派出一百多匹具装骑兵突击刘山阳。刘山阳命令射手朝敌人射箭,三名魏军从马上倒地,刘山阳本人亲手杀死了十几名魏军,但仍然无法阻止蜂拥而来的魏军,于是,刘山阳率部边打边退。崔慧景向南通过城南的闹沟时,土兵们相互践踏,桥梁突然倒塌,孝文帝见状,命令宇文福率领五百羽林骑兵朝这里杀来,企图切断齐军的归路。齐军分出六路迎战,魏军在齐军的两侧朝齐军射箭,齐军军主傅法宪被杀,
无路可逃而投入闹沟而死的不计其数。刘山阳用武器和棉袄扔入沟中,依靠这才得以侥幸逃脱。萧衍在此战中也表现勇敢,他率领所部杀伤了数百魏军,结阵断后,到日暮才下到船上。孝文帝率领大军跟踪追击,到傍晚时分,魏军进抵汉水北岸,包围了刚刚逃至此地、驻守在汉水北岸桥头堡的刘山阳,刘山阳依托堡垒拼死抵抗,等到天晚,魏军才退去了。此战崔慧景所部几乎全军覆没,各军也都有不同程度的伤亡,只有萧衍保全了自己的部队。齐军已不敢在汉水北岸久留,当夜,全部登上了船只,回到了襄阳。
南阳方向战事以魏军大胜、夺得汉水以北五郡而告一段落,这是北魏继献文帝皇兴三年占领了青州、齐州地区三十年来最大的一次领土扩张,战后,孝文帝将荆州治所迁至穰城,并任命广阳王元嘉为荆州刺史(镇守穰城),以李佐担任长史(镇守新野),又任命前将军元英,以本号作为镇将镇守荆州。
但是,孝文帝的好心情并没有持续多久。北魏镇南将军王肃发兵进攻义阳。豫州刺史裴叔业听说王肃对义阳发起了进攻,他没有直接增援义阳,而是率领五万人包围了涡阳(安徽省蒙城县)。
涡阳,是北魏南兖州的治所,距离彭城一百二十里,一旦涡阳失守,彭城就直接暴露于齐军的攻击之下,这也是魏军的必救之点。北魏南兖州刺史孟表固守城池抵抗,裴叔业强攻不下。涡阳魏军粮食吃尽,开始吃树皮树叶,但一直不降。北魏徐州刺史广陵王元羽)率领二万步兵、五千骑兵增援,齐军寡不敌众。危急时刻,裴叔业亲率三万余人前来增援,从各个方向向魏军发起了猛攻,魏军刚到战场,立足未稳,被打得大败。元羽与身边的数十名骑兵夺路而逃,齐军猛追,连皇帝颁发给元羽的符节都被齐军缴获了。
但是,涡阳仍然在魏军手里。孝文帝以安远将军傅永为统军与假辅国将军高聪、征虏将军刘藻、成道益、任莫问等部前去救援。魏军刚立下营垒,安顿好辎重,就立即向齐军发起了进攻,一战下来,魏军大败。
在义阳前线的王肃解除了义阳之围,与统军杨大眼、奚康生等将率领步骑十八万之众火速前来解救涡阳。裴叔业见魏军兵力甚盛,趁夜弃军而逃,第二天,齐军溃散,魏军追击,杀伤了无数齐军。辅国将军王珍国是王广之的儿子,也在裴叔业的军中,他率众殿后,顽强阻击魏军,才保证了齐军不致大败。裴叔业退守涡口(涡水入淮处,在安徽省怀远县东北),齐明帝派人前去慰劳。
涡阳之战齐军先胜后败,但从战略上来说,达到了调动敌人、解除义阳之围的目的,也让孝文帝感到现有的二十万兵力在顽强的齐军面前似乎还是不够用,四月十九日,他再次下诏征调军队,再动员各州二十万军队,定于八月在悬壶集合待命。
而就在此时,北魏内部发生了李彪事件、冯皇后私通败露以及北方高车叛乱等问题。再加上孝文帝身体不适,这都让孝文帝不得不暂停第二次北伐。十二月七日,孝文帝开始从邺城启程返京。