时间:2021-07-01 10:21:17 帮助过:2人阅读
昨晚遇到的这个问题,也知道Notifications service依赖底层的Service broker的。本以为只需要执行以下脚本对数据库启用Service broker即可。
alter database DBNAME set enable_broker
但是,执行后,脚本一直处于执行状态,不以为然,正好在忙其它事情就没有查看运行结果,结果到今早一看,居然运行还没有结束。虽然是在一个生产数据库上执行的,数据库也只有30G的样子,但也不至于执行一个晚上也未结束,只好终止执行,使用
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;
执行以上2条语句,未做任何等待,就提示命令执行完成。
SELECT is_broker_enabled FROM sys.databases WHERE name = ‘DBNAME‘
查看is_broker-enabled为1
NEW_BROKER选项,SQL SERVER联机丛书上的解释:
每个数据库都包含一个 Service Broker 标识符。sys.databases 目录视图的 service_broker_guid 列显示该实例中每个数据库的 Service Broker 标识符。Service Broker 路由使用 Service Broker 标识符来保证一个会话的所有消息都传递到同一个数据库。因此,Service Broker 标识符在同一网络上的所有实例中应是唯一的。否则,消息可能被误传。
SQL Server 为每个新数据库生成新的 Service Broker 标识符。由于标识符是新的,因此 SQL Server 可以安全地激活新数据库中的 Service Broker 消息传递。网络上的其他数据库应该不会有与之相同的 Service Broker 标识符。
NEW_BROKER。此选项用于激活 Service Broker 消息传递,同时为数据库创建新的 Service Broker 标识符。由于该数据库中所有的现有会话都未使用新的实例标识符,因此,此选项将结束这些会话并返回一个错误。
ROLLBACK IMMEDIATE将立即回滚未完成的事务。
有四个选项用于管理标识符和消息传递:
ENABLE_BROKER。此选项用于激活 Service Broker 消息传递,并且保留数据库的现有 Service Broker 标识符。
注意 |
---|
在任何数据库中启用 SQL Server Service Broker 都需要数据库锁。若要在 msdb 数据库中启用 Service Broker,请首先停止 SQL Server 代理。然后,Service Broker 才可获得必要的锁。 |
DISABLE_BROKER。此选项用于停用 Service Broker 消息传递,并且保留数据库的现有 Service Broker 标识符。
NEW_BROKER。 此选项用于激活 Service Broker 消息传递,并为数据库创建一个新的 Service Broker 标识符。选择此选项将结束数据库中的所有现有会话,并对每个会话返回一个错误。这是因为这些会话不使用新的标识符。必须使用新标识符重新创建任何引用旧 Service Broker 标识符的路由。
ERROR_BROKER_CONVERSATIONS。此选项用于激活 Service Broker 消息传递,并且保留数据库的现有 Service Broker 标识符。Service Broker 将结束数据库中的所有会话,并对每个会话返回一个错误。通常,如果某个数据库与其他数据库之间具有打开的会话,并且您要将该数据库还原到一个不同于与之对 话的数据库的时间点,则需要使用此选项。还原的数据库中的所有会话必须以错误结束,因为这些会话现在与其他数据库已不同步。Service Broker 标识符保留,以便引用该标识符的所有路由仍有效。
无论选择指定选项中的哪一个,SQL Server 都不允许具有相同 Service Broker 标识符的两个数据库在 SQL Server 的同一实例中都激活消息传递。如果附加一个数据库,该数据库的 Service Broker 标识符与现有数据库的标识符相同,SQL Server 将停用所附加数据库中的 Service Broker 消息传递。
2)手写脚本创建的数据库未指定PRIMARY
指定关联的 <filespec> 列表定义主文件。 在主文件组的 <filespec> 项中指定的第一个文件将成为主文件。 一个数据库只能有一个主文件。 有关详细信息,请参阅数据库文件和文件组。
如果没有指定 PRIMARY,那么 CREATE DATABASE 语句中列出的第一个文件将成为主文件。
IF NOT EXISTS (SELECT name FROM sys.filegroups WHERE is_default=1 AND name = N‘PRIMARY‘) ALTER DATABASE [tttt1] MODIFY FILEGROUP [PRIMARY] DEFAULT
GO
3)手动创建的生成脚本里面有TRUSTWORTHY OFF 但是自动的没有这个选项
默认情况下,此设置为“OFF”
写代码创建数据库,设置位置后比对用可视化界面创建数据库的区别
标签: