自從第一次幽州之戰失利以來,趙光義一直鬱結於心,為了挽回自己“聖主明君”的名聲,他長期以來處心積慮圖謀再攻幽州。986年,賀令圖、賀懷浦、薛繼昭、劉文裕等人先後上言,以為“自國家伐太原而契丹渝盟發兵以援之,非天威兵力決而取之,河東之師幾為遷延之役,且契丹主年幼,國事決於其母,其大將韓德讓寵幸用事,國人疾之,請乘其釁以取幽薊。”賀懷浦是趙匡胤元配孝惠皇後的胞兄,一向深得信任,趙光義隨即召集群臣會商。其實,賀令圖等人所言雖然道聽途說的成分居多,但韓匡嗣、韓德讓父子得到蕭綽的寵信,在遼國專權橫行也是事實,遼國涿州刺史耶律虎古小有過錯,就被韓德讓用骨雜擊腦而死,群臣無人敢問,但並未發展到“國人疾之”的地步。
此前,趙光義在與群臣商議幽州形勢時,就曾說過:“幽州四麵平川,無險固守,難於控扼,異時收複燕薊,當於古北口諸隘據其要害,不過三五處,屯兵設堡寨,自絕南牧矣。”當時,宋琪回答道:“範陽前代屯兵之地,古北口及鬆亭關、野狐門三路並立堡寨,至今石壘基堞尚存,將來止於此數處置戍可矣。”可見,燕雲十六州始終是北宋君臣的一塊心病,現在雖然爭論不下,但趙光義的決心已經不可動搖。
公元986年1月,趙光義正式下達了收複燕雲十六州的命令,宋軍分三路出擊:東路以天平軍節度使曹彬為幽州道行營前軍馬步水陸都部署,河陽節度使崔彥進為副,率大軍十餘萬人自保州向涿州攻擊前進,這一帶地形比較平坦;以馬軍都指揮使米信為幽州西北道行營馬步軍都部署,代州觀察使杜彥圭為副,率兵經雄州出發直向新城;中路以步軍都指揮使田重進為定州路都部署,蘄州刺史譚延美為副,率軍數萬自定州而北,經飛狐攻取蔚州;西路以忠武軍節度使潘美為雲、應、朔路行營馬步軍都部署,靈州觀察使楊業為副都部署,率軍從雁門、代州越過恒山,出雁門關,攻取寰、朔、應、雲諸州。與此同時,趙光義還派監察禦史韓國華出使高麗,請求高麗出兵進攻遼東,配合宋軍的行動。這次,趙光義吸取了第一次幽州之戰的教訓,集中了優勢兵力,三路並進,分進合擊,意圖在幽州地區聚殲遼軍主力,一舉收複燕雲十六州。東路軍雖是主力,但在中西二路沒有取得戰果以前,主要擔任佯動,趙光義特別交待曹彬等人:“潘美之師,但令先趨雲應,卿等以十餘萬眾聲言取幽州,且持重緩行,毋貪小利而要敵,敵聞大兵至,必萃勁兵於幽州,兵既聚,則不暇為援於山後矣。”宋軍的戰略意圖是以東路軍將遼軍主力吸引在幽州以南地區,使其無暇它顧,待中西二路取勝後,再會攻幽州。
1月21日,三路宋軍先後出發,由於采取了嚴格的保密措施,遼國方麵直至3月6日才得到消息,針對宋軍的分進合擊之勢,承天太後蕭綽決策,集中兵力先對付威脅最大的宋東路軍,尋機將其殲滅後,再轉移兵力對付力量較弱的中西二路。以南京留守耶律休哥率軍先發,東京留守耶律抹隻作為後繼;山西兵馬都統耶律斜軫增援山後諸州,對付田重進和潘美;以林牙耶律痕德守備平州海岸,防備宋軍可能從海上進行的襲擊,同時征發全國諸道兵馬,集中到幽州以北的駝羅口作為總預備隊。
三月初,各路宋軍轉入進攻,起初進展頗為順利。西路軍潘美所部出雁門關西口北上,南敗遼軍一部,斬首五百餘級,神衛右第二軍都指揮薛超在寰州再敗遼軍,遼國寰州刺史趙彥辛投降,3月13日,宋軍占領朔州,3月19日占領應州,4月13日占領雲州,軍鋒直指蔚州。3月9日,中路軍田重進進至飛狐北,遼國冀州防禦使大鵬翼、康州刺史馬贇、馬軍指揮使何萬通率軍兩萬人迎戰,雙方眾寡懸殊,但宋軍士氣高昂,閤門使袁繼忠、蘄州刺史譚延美、龍猛副指揮使荊嗣、裨將黃明等人奮勇爭先,戰至日暮,大敗遼軍,生擒大鵬翼,3月23日,遼國飛狐守將定武軍都指揮使、郢州防禦使呂行德、副都指揮使張繼從、馬軍都指揮使劉知進等人投降。3月28日,宋軍包圍靈丘,守城的步軍都指揮使穆超投降,4月17日,宋軍進至蔚州,左右都押牙李存墇、許彥欽殺節度使蕭啜裏,逮捕監城使耿紹忠,投降。
東路軍曹彬所部3月5日占領固安,3月13日占領涿州,3月17日,曹彬以勇將李繼宣為前鋒,率輕騎渡過涿水,殲滅遼軍千餘人,斬遼國奚部宰相賀斯。這時,遼國援軍未到,耶律休哥因兵力不足,所以不與曹彬正麵接觸,隻是想方設法遲滯宋軍的行動,晝出精銳虛張聲勢,夜遣輕騎襲擾,同時又派部分兵力設伏宋軍側後,斷其糧道。這一招果然奏效,曹彬的十萬大軍占據涿州不過十餘天,就因糧食不足而退返雄州,如此一來,就為遼軍主力趕到後聚殲宋軍贏得了時間。
趙光義得知曹彬率全軍退而就食,大驚失色,他立即指示曹彬“緣白溝河與米信軍接,按兵蓄銳以張西師之勢,待美等盡略山後之地會重進東下趨幽州,以全師製敵。”曹彬奉詔後,本來不準備繼續北上,但是諸將求功心切,眼看中西二路都獲大捷,便紛紛主張再次北進,攻取幽州。副使崔彥進也認為朝廷三路出師,如不急取幽、薊,恐落人後。曹彬為人謙仁有餘、智勇不足,聽信了諸將的意見,便決定攜帶僅剩的五日糧從白溝再次北上。時值酷暑,行軍艱難,耶律休哥又沿路伏兵阻擊,宋軍且戰且行,軍渴乏井,漉淖而飲,經過四天的時間,才前進到涿州,但已人困馬乏,部伍散亂。
這時,曹彬忽然聽說,遼國承天太後蕭綽、聖宗耶律隆緒已經率領大軍進至涿州以東五十裏處,即將與耶律休哥所部對宋軍形成鉗擊之勢,形勢不妙,曹彬決定立即撤退,此時,他還想留下部將盧斌率軍萬餘人守城,但盧斌也不願當替死鬼,說:“涿州深入北地,外無援內無食,丁籍殘失,守必不利,不若以此萬人結陣而去,比於固守利百矣。”曹彬同意,便讓盧斌裹脅城中民眾先行,自己率大軍斷後。
宋軍撤退後,耶律休哥抓住時機,立即率領精騎發起追擊。當時,暴雨如注,敗退的宋軍在泥濘中艱難跋涉,士氣低落,“無複行伍”,將領也無法控製,耶律休哥的騎兵在岐溝關追上了逃跑的宋軍,這支疲憊之師霎時崩潰,曹彬率領潰軍連夜搶渡拒馬河,慌亂中人馬自相踐踏,傷亡甚眾,知幽州行府事劉保勳、開封兵曹劉利涉父子、殿中丞孔宜等人溺死河中,宋軍殘部逃至易水南岸,又被耶律休哥的騎兵追上,前後死者數萬人,幸虧勇將李繼宣殊死力戰,僥幸逃生者才得以奔回高陽。
經過一段時間的休整後,遼軍移師西線,以十萬大軍實施戰略反攻,耶律休哥也增援了耶律斜軫,遼軍連克蔚州、飛狐。眼看敗局已定,趙光義急令中路軍退守定州,西路軍退屯代州,掩護雲,應、寰、朔四州的民眾內遷。當時,遼軍已占據寰州,楊業力主分兵應州,誘使遼軍向東,以保民眾安全南撤,但被監軍王侁和主帥潘美拒絕,結果,楊業被遼將耶律斜軫打得大敗,退至陳家穀口,全軍覆沒。至此,北宋第二次攻取幽州之戰以慘敗而告終,所取州縣全部得而複失。
消息傳來,朝野嘩然,趙匡胤的舊臣——武勝軍節度使趙普上書,委婉地批評趙光義“信任邪諂”,建議他先修德政、再議征伐,表麵上,趙光義對失敗不甚在意,還作詩賜給群臣,甚至“推誠悔過”,但這些都是偽裝,等曹彬、米信等人逃回後,他立刻撕下了假麵具,下令將這些敗將羈押,準備處死,後經工部尚書扈蒙竭力相救,曹彬又“素服謝罪”,這才收回成命,貶曹彬為右驍衛上將軍,崔彥進為右武衛上將軍。岐溝關之戰,遼軍取勝雖是趙光義、曹彬的錯誤所致,但最根本的原因是耶律休哥的正確指揮,能搶在宋軍合擊之前集中兵力,在平原開闊地帶以騎兵不斷襲擾,在宋軍倉促撤退時,又敢於全師追擊,力求擴大戰果,給宋軍主力以殲滅性打擊,從此改變了整個宋遼戰爭的態勢,所謂“岐溝之蹶,終宋不振”,此役後,北宋政權完全喪失了戰略進攻能力,被迫轉入戰略防禦。