昨晚遇到的這個問題,也知道Notifications service依賴底層的Service broker的。本以為只需要執(zhí)行以下腳本對數(shù)據(jù)庫啟用Service broker即可。
alter database DBNAME set enable_broker
但是,執(zhí)行后,腳本一直處于執(zhí)行狀態(tài),不以為然,正好在忙其它事情就沒有查看運(yùn)行結(jié)果,結(jié)果到今早一看,居然運(yùn)行還沒有結(jié)束。雖然是在一個生產(chǎn)數(shù)據(jù)庫上執(zhí)行的,數(shù)據(jù)庫也只有30G的樣子,但也不至于執(zhí)行一個晚上也未結(jié)束,只好終止執(zhí)行,使用
SELECT is_broker_enabled FROM sys.databases WHERE name = 'DBNAME'
查看is_broker-enabled為0,依然未啟用Service broker
后google下,在一個國外論壇里面找到了解決辦法:
ALTER DATABASE DatabaseName SET NEW_BROKER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE Databasename SET ENABLE_BROKER;
執(zhí)行以上2條語句,未做任何等待,就提示命令執(zhí)行完成。
SELECT is_broker_enabled FROM sys.databases WHERE name = 'DBNAME'
查看is_broker-enabled為1
NEW_BROKER選項,SQL SERVER聯(lián)機(jī)叢書上的解釋:
每個數(shù)據(jù)庫都包含一個 Service Broker 標(biāo)識符。sys.databases 目錄視圖的 service_broker_guid 列顯示該實(shí)例中每個數(shù)據(jù)庫的 Service Broker 標(biāo)識符。Service Broker 路由使用 Service Broker 標(biāo)識符來保證一個會話的所有消息都傳遞到同一個數(shù)據(jù)庫。因此,Service Broker 標(biāo)識符在同一網(wǎng)絡(luò)上的所有實(shí)例中應(yīng)是唯一的。否則,消息可能被誤傳。
SQL Server 為每個新數(shù)據(jù)庫生成新的 Service Broker 標(biāo)識符。由于標(biāo)識符是新的,因此 SQL Server 可以安全地激活新數(shù)據(jù)庫中的 Service Broker 消息傳遞。網(wǎng)絡(luò)上的其他數(shù)據(jù)庫應(yīng)該不會有與之相同的 Service Broker 標(biāo)識符。
NEW_BROKER。此選項用于激活 Service Broker 消息傳遞,同時為數(shù)據(jù)庫創(chuàng)建新的 Service Broker 標(biāo)識符。由于該數(shù)據(jù)庫中所有的現(xiàn)有會話都未使用新的實(shí)例標(biāo)識符,因此,此選項將結(jié)束這些會話并返回一個錯誤。
ROLLBACK IMMEDIATE將立即回滾未完成的事務(wù)。