在 2 个 sql server 2016 服务器之间设置日志传送我希望我的数据库在辅助服务器上只读备用。
有一个勾选框说Disconnect users in the database when restoring backups。
如果我不勾选这个框怎么办?日志的恢复不会通过,因为它无法获得数据库的排他锁?
但是,如果有人登录数小时怎么办?几个小时没有恢复日志?
restore transaction-log log-shipping session sql-server-2016
我有一个应用程序由于超时而关闭。在这些时间里,我们看到保存 ASP 会话状态的数据库的响应时间大幅增加。
为了诊断问题,我使用SP_CONFIGURE'blocked process threshold',15并运行跟踪以捕获任何触发的事件。在下一个事件期间,跟踪捕获会话状态数据库中的一些阻塞事件。
我已经确定了主要拦截器,可以看到它已暂停并等待。
<blocked-process-report>
<blocked-process>
<process id="process53fb4c8"
taskpriority="0" logused="0"
waitresource="KEY: 10:72057594039238656 (594b17b7493c)" waittime="20631"
ownerId="9710782702" transactionname="UPDATE"
lasttranstarted="2013-06-27T17:29:38.130" XDES="0xc429df950" lockMode="U"
schedulerid="14" kpid="6912" status="suspended" spid="359" sbid="0" ecid="0"
priority="0" trancount="2" lastbatchstarted="2013-06-27T17:29:38.130"
lastbatchcompleted="2013-06-27T17:29:38.107"
clientapp=".Net SqlClient Data Provider" hostname="WEB03" hostpid="7520"
loginname="State" isolationlevel="read committed (2)" xactid="9710782702"
currentdb="10" lockTimeout="4294967295"
clientoption1="536870944" clientoption2="128056">
<executionStack>
<frame line="18" stmtstart="1114" stmtend="4494"
sqlhandle="0x03000a00210f020741a1be0058a000000100000000000000"/>
</executionStack>
<inputbuf>
Proc [Database Id = 10 Object Id = 117575457]
</inputbuf>
</process>
</blocked-process>
<blocking-process>
<process status="suspended" waittime="1046" spid="217" sbid="0" ecid="0"
priority="0" trancount="1" lastbatchstarted="2013-06-27T17:29:29.113"
lastbatchcompleted="2013-06-27T17:29:29.010" …Run Code Online (Sandbox Code Playgroud) 如何更改所有会话的 SESSION_CACHED_CURSORS?
我在 google 和 oracle 网站上找到:
Alter Session... 但我需要在所有会话中更改它,而不仅仅是为其中一个会话。
我该怎么做?
更新1:
SQL> alter session set session_cached_cursors=800 scope=both sid='*';
alter session set session_cached_cursors=800 scope=both sid='*'
*
ERROR at line 1:
ORA-02248: invalid option for ALTER SESSION
Run Code Online (Sandbox Code Playgroud) 我的脚本包含多个GO关键字。我知道 SQLCMD 解释GO为批处理分隔符,因此代码不是作为单个块运行的,而是分隔符(批处理)之间的每个部分单独运行。我的问题是,所有批次都在同一个会话中执行吗?
我尝试使用一个简单的脚本来测试这个:
SELECT @@SPID
GO
SELECT @@SPID
GO
SELECT @@SPID
GO
Run Code Online (Sandbox Code Playgroud)
然后我使用此命令从命令行运行脚本
SELECT @@SPID
GO
SELECT @@SPID
GO
SELECT @@SPID
GO
Run Code Online (Sandbox Code Playgroud)
并得到这个输出:
SQLCMD -S MyServer\Instance -E -i MyScript.sql
Run Code Online (Sandbox Code Playgroud)
它似乎肯定地回答了我的问题,但后来我再次运行脚本并得到完全相同的输出,即所有值都是一样的62。显然,SQLCMD 的两个单独执行不可能在同一个会话中运行,它们只是碰巧收到了相同的会话 ID。但这反过来又让我认为@@SPID单次运行返回的相同值也不一定意味着它是同一个会话。每个批处理都可以在恰好收到相同 ID 的不同会话中执行,类似于 SQLCMD 的不同执行在具有相同 ID 的不同会话中运行的方式。
因此,我的问题仍然存在:是否在同一会话中在 SQLCMD 中执行了多个批次的相同脚本?有没有办法确定这一点?
session ×4
sql-server ×2
locking ×1
log-shipping ×1
oracle ×1
profiler ×1
restore ×1
sqlcmd ×1