我设置了一个 SQL Server 分布式可用性组,并且当前已连接到转发器实例。我想知道如何使用 T-SQL 查询适当的 DMV 或目录视图,以确定当前哪个实例充当分布式可用性组中的全局主实例。
我正在寻找可以在转发器实例上执行的 T-SQL 脚本或查询来检索此信息。
任何有关此主题的帮助或指导将不胜感激。先感谢您!
我设置了一个 SQL Server 分布式可用性组,并且当前已连接到转发器实例。我想知道如何使用 T-SQL 查询适当的 DMV 或目录视图,以确定当前哪个实例充当分布式可用性组中的全局主实例。
我正在寻找可以在转发器实例上执行的 T-SQL 脚本或查询来检索此信息。
任何有关此主题的帮助或指导将不胜感激。先感谢您!
我最近在 AWS 中现有的本地 Always On 可用性组 (AG) 和新 AG 之间设置了分布式可用性组 (DAG)。本地 AG 充当主要 AG,而 AWS AG 充当辅助 AG。我无意中配置了自动播种,但没有意识到它会立即开始为所有数据库播种。
我的问题是,我只需要将大约 10 个数据库复制到辅助 AG,其中只有 5 个数据库需要复制到辅助 AG 的辅助副本。我尝试为不需要的数据库设置“HADR OFF”,但它仅适用于辅助副本。该命令在转发器上成功运行,但数据库从未真正被删除。
我发现了几篇文章解释如何从 DAG 中删除数据库,但它们都建议从主 AG 的主副本运行命令。但是,我担心这种方法也可能会从本地 AG 中删除数据库,这不是我的本意。我只想从辅助分发 AG 的辅助副本中删除数据库。
所以,我的问题是:
我将非常感谢任何有关如何实现这一目标的见解、建议或分步指导。预先感谢您的帮助!
我有一个场景,我想要创建一个 SQL Server 分布式可用性组 (DAG),该组跨越驻留在同一组 SQL Server 实例上的两个现有可用性组 (AG)。这是设置:
我的目标是创建一个名为“distag1”的分布式可用性组,其中包含“ag1”和“ag2”。我按照文档操作并尝试在全局主节点(“ag1”的主副本)上创建“distag1”。就创建成功了。但是,当我尝试加入“distag1”(ag2的侦听器指向的实例)的另一端时,遇到以下错误:
ALTER AVAILABILITY GROUP distag1
JOIN AVAILABILITY GROUP ON
N'ag1' WITH (
LISTENER_URL = N'TCP://ag1lsnr:5022',
FAILOVER_MODE = MANUAL,
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
SEEDING_MODE = MANUAL
),
N'ag2' WITH (
LISTENER_URL = N'TCP://ag2lsnr:5022',
FAILOVER_MODE = MANUAL,
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
SEEDING_MODE = MANUAL
);
Msg 19509, Level 16, State 0, Line 38
Cannot create a distributed availability group 'distag1'. An availability group with the same name already exists.
我的问题是:
我将非常感谢有关此事的任何见解、澄清或指导。预先感谢您的帮助!
我有一个关于 SQL Server 分布式可用性组 (DAG) 配置的问题。据我了解,DAG 用于将数据从一个可用性组 (AG) 复制到另一个可用性组。但是,我很好奇单个 DAG 是否有可能拥有多个辅助副本 AG。
具体来说,假设我有一个名为“dag1”的分布式可用性组。“dag1”是否可以将数据从主可用性组“ag1”复制到多个辅助可用性组,例如“ag2”和“ag3”?
换句话说,单个 DAG 是否可以与辅助副本 AG 建立一对多关系?
如果有人能够澄清是否支持此配置,并在设置具有多个辅助副本 AG 的 DAG 时提供任何其他见解或注意事项,我将不胜感激。
预先感谢您的帮助!
我正在使用混合 SQL Server 备份文件的目录,并且需要使用 PowerShell 中的 dbatools 恢复特定数据库。以下是我的备份文件夹的目录结构:
PS C:\Users\administrator> tree \\dc1\backup /F
Folder PATH listing
\\DC1\BACKUP.
│ Hadr_endpoint_cert.cer
│ Hadr_endpoint_cert.pvk
│
└───NODE1
└───MSSQLSERVER
├───AdventureWorks2016
│ ├───Full
│ │ Full_AdventureWorks2016_20240219011641.bak
│ │
│ └───Log
│ Log_AdventureWorks2016_20240219011647.trn
│
└───Credit
├───Full
│ Full_Credit_20240219012730.bak
│
└───Log
Log_Credit_20240219012735.trn
PS C:\Users\administrator>
node2
当尝试使用以下命令恢复信用数据库时,我遇到了问题:
$files = Get-ChildItem -Path \\dc1\backup -Recurse -Include *.trn,*.bak
Restore-DbaDatabase -SqlInstance node2 -Path $files -DatabaseName Credit -NoRecovery -ExecuteAs sa
这会导致错误:
WARNING: [01:27:36][Restore-DbaDatabase] Multiple Databases' backups passed in, but only 1 name to restore them under. Stopping as cannot work out how to proceed.
使用此命令代替:
Restore-DbaDatabase -SqlInstance node2 -Path \\dc1\backup -DirectoryRecurse -DatabaseName Credit
导致不同的错误:
WARNING: [01:32:00][Get-DbaBackupInformation] Failure on node2 | The media family on device '\\dc1\backup\Hadr_endpoint_cert.cer' is incorrectly formed. SQL Server cannot process this media family. RESTORE HEADERONLY is terminating abnormally.
我知道我可以通过命名约定手动选择与 Credit 数据库相关的文件,但如果备份文件的文件名中没有数据库名称怎么办?在过滤掉不相关文件的同时自动执行此恢复的最佳方法是什么?
任何关于在这种情况下正确使用 dbatools 的指导或提示将不胜感激!先感谢您。
我最近使用 T-SQL 脚本设置了一个新的 SQL Server 可用性组。该设置有点不传统,因为我最初启动了可用性组,但没有包含任何数据库。
CREATE AVAILABILITY GROUP ag1
FOR
REPLICA ON 'node1'
WITH (
ENDPOINT_URL = N'TCP://node1.dev.com:5022',
FAILOVER_MODE = MANUAL,
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
BACKUP_PRIORITY = 50,
SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL),
SEEDING_MODE = MANUAL
),
N'node2'
WITH (
ENDPOINT_URL = N'TCP://node2.dev.com:5022',
FAILOVER_MODE = MANUAL,
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
BACKUP_PRIORITY = 50,
SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL),
SEEDING_MODE = MANUAL
);
设置主副本后,我添加了辅助副本并为该组配置了侦听器。所有 T-SQL 命令均成功执行,没有任何错误。
然而,在检查 SQL Server 可用性组仪表板时,我注意到显示了一些警告。这是仪表板的快照:
鉴于可用性组当前为空(尚未添加数据库),我想知道这些警告在这种情况下是否典型,或者它们是否表明我应该解决潜在的配置问题。
有没有人经历过空可用性组的类似情况,或者有人知道在添加数据库之前这些警告是否只是标准占位符?
任何有关此事的见解或指导将不胜感激。
先感谢您!
SQL Server 专家您好,
我正在 SQL Server 中配置分布式可用性组 (DAG),并正在寻找有关使用手动种子设定(备份恢复)而不是自动种子设定来实现它的指南。
我计划设置的 DAG 涉及两个名为 ag1 和 ag2 的正常可用性组 (AG),每个都充当 DAG 内的副本。我的目标是复制以下拓扑:
+--------------------+ +------------------------+
| WSFC1 | | WSFC2 |
| +--------------+ | | +------------------+ |
| | AG1 (P) | | | | AG2 (S) | |
| | +---------+ | | | | +-------------+ | |
| | |node1 (P)| |======DAG=====>| |node3 (P)(F) | | |
| | +----+----+ | | | | +-----+-------+ | |
| | | | | | | | | |
| | +----v----+ | | | | +-----v-------+ | |
| | |node2 (S)| | | | | |node4 (S) | | |
| | +---------+ | | | | +-------------+ | |
| +--------------+ | | +------------------+ |
+--------------------+ +------------------------+
In this topology, we have:
- 4 nodes: node1, node2, node3, node4
- 2 WSFC clusters: WSFC1 and WSFC2
- 2 AGs: AG1 and AG2
- 1 DAG, from AG1 to AG2
- (P) = primary replica
- (S) = secondary replica
- (F) = forwarder
Microsoft 官方文档(配置分布式可用性组)主要介绍了使用自动种子设定的设置。但是,我想利用传统的备份和恢复方法。
不幸的是,我不确定有关何时何地进行备份以及在此拓扑中的何处恢复备份的正确操作顺序。
任何人都可以提供分步指南或用简单的英语阐明如何使用手动播种创建 DAG 的过程吗?
以下是我到目前为止拼凑的内容,但我坚持顺序和适当的步骤:
我非常感谢任何可以为我指明正确方向的帮助或资源。
感谢您的时间和帮助!
我正在配置具有三个副本的 SQL Server 可用性组:node1\inst
、node2\inst
和node3\inst
。我已设置node1\inst
为通过同步提交进行自动故障转移,而node2\inst
和 则node3\inst
配置为手动故障转移。
我对故障转移行为有几个问题:
当node1\inst
主副本遇到问题时,它是否会自动故障转移到node2
或者node3
即使它们设置为手动故障转移?此外,自动故障转移是否仅发生在自动故障转移和同步提交副本之间?
如果node2
成为主副本并且发生问题,它是否仍然遵循其手动故障转移设置,或者是否会自动故障转移到node1
?
我试图了解 SQL Server 可用性组中复杂的故障转移机制,以确保可靠的高可用性设置。深入了解如何在这些配置中确定自动故障转移决策将非常有帮助。
提前感谢你的帮助!
我正在深入研究 SQL Server 可用性组 (AG),并发现了一个令人着迷的功能,它似乎可以简化设置副本的过程 - 自动种子设定的概念。根据我的理解,当我们配置可用性组时,有一个选项允许单个服务器自动为我们的数据库播种。这意味着我们不必提供主副本和辅助副本均可访问的共享位置来进行初始数据同步。
令我感兴趣的是这个功能的底层机制。SQL Server 究竟如何将数据库复制到我的辅助副本而不需要共享存储位置?我最初的想法是,它可能会在幕后利用某种形式的数据流或备份恢复操作。
具有 SQL Server 可用性组专业知识的人能否解释一下自动种子设定的过程?这种方法的可靠性如何?在使用自动种子设定进行数据库复制时,我们是否应该注意任何警告或先决条件?
期待就此主题进行富有启发性的讨论。预先感谢您的见解!
如果我有这个备份策略(每周完整备份和 1 小时日志备份),我可以将数据库恢复到绿色突出显示的时间段吗?顺便说一句,日志备份 2 是否包括其 lsn 大于日志备份 1 的 last_lsn 的所有日志记录?
我又做了一些测试,我想我找到了答案。根据备份计划中的图像,我进行了初始完整备份,一些日志备份,然后是日志备份 1,完整备份,日志备份 2。我在中间进行了修改。用于RESTORE HEADERONLY
检查日志备份1,完整备份和日志备份2,以下是我得到的。如您所见,日志备份 2 捕获了日志备份 1 中最后一条的所有日志记录。如果我想恢复到绿色突出显示的时间点,我需要使用日志备份 2,而不是完整的备份。
这是 SQL Server 的文档中谈到的ROLLBACK
语句。在该页面上,它声明它的语法如下:
ROLLBACK { TRAN | TRANSACTION }
[ transaction_name | @tran_name_variable
| savepoint_name | @savepoint_variable ]
[ ; ]
显然方括号内的内容是可选的,看来您应该从TRAN
或中选择一个TRASACTION
。但实际上你可以完全省略两者,这ROLLBACK
是一个完全有效的陈述。这是一个错误还是故意的?
我是 Oracle 的新手,我只想确认我对 Oracle 10g 和 10g+ 的语句级读取一致性的理解。
Oracle 始终强制执行语句级读取一致性。这保证了单个查询返回的所有数据都来自一个时间点——查询开始的时间。因此,查询永远不会看到脏数据或查询执行期间提交的事务所做的任何更改。随着查询执行的进行,只有在查询开始之前提交的数据对查询可见。语句执行开始后,查询看不到已提交的更改。
Oracle 数据库始终强制执行语句级读取一致性,这保证了单个查询返回的数据已提交并且相对于单个时间点保持一致。单个 SQL 语句一致的时间点取决于事务隔离级别和查询的性质:
在读提交隔离级别中,这一点是语句打开的时间。例如,如果 SELECT 语句在 SCN 1000 打开,则该语句与 SCN 1000 一致。
在可序列化或只读事务中,这一点是事务开始的时间。例如,如果一个事务从 SCN 1000 开始,并且如果该事务中出现多个 SELECT 语句,则每个语句都与 SCN 1000 一致。
在闪回查询操作 (SELECT ... AS OF) 中,SELECT 语句明确指定时间点。例如,您可以查询上周四下午 2 点出现的表
见粗体字。如果我理解正确,Oracle 在 10g 和 10g+ 之间改变了它的行为。在 10g 中,Statement-Level Read Consistency 始终基于语句开始时的视图。在 10g+ 中,Statement-Level Read Consistency 基于依赖于隔离级别和查询本身的视图。我的理解正确吗?谢谢你。
我知道 Oracle 数据库客户端提供基本的网络组件,为了连接到 Oracle 数据库,我必须将它安装在客户端计算机上。我注意到 Oracle 的 SQL Developer,我没有安装任何客户端,它工作得很好,可以毫无问题地连接到数据库。对于 Toad,似乎我需要安装一个客户端才能使其工作。我的问题是,我应该什么时候安装 Oracle 客户端?我怎么知道需要 32 位或 64 位版本?
我正在学习 Oracle 并做了一些测试。我使用用户并在架构中sys
创建了一个表,我发现它的所有者是,并且具有完全访问权限。我想确认一下,在架构中是否始终具有完全访问权限?不管是谁创建了这些对象?t
scott
t
scott
scott
t
scott
scott
我以HR
用户身份连接到 Oracle 19c。我想执行以下 SQL 和一些 dba_... 视图:
select s.sid
,s.serial#
,s.username
,s.machine
,s.status
,s.lockwait
,t.used_ublk
,t.used_urec
,t.start_time
from v$transaction t
inner join v$session s on t.addr = s.taddr;
Oracle 告诉我对象不存在。这似乎是一个权限问题。我需要什么权限才能访问动态性能视图和 DBA_... 视图?
我连接到一个 Oracle 19c 数据库并执行以下 SQL:
alter user sys identified by "a b" container=all;
它执行成功。但是,之后我无法使用 SQLPlus 连接到 Oracle。以下是我的尝试:
oracle:[~]$ sqlplus
Enter user-name: sys as sysdba
Enter password:
SP2-0306: Invalid option.
Usage: CONN[ECT] [{logon|/|proxy} [AS {SYSDBA|SYSOPER|SYSASM|SYSBACKUP|SYSDG|SYSKM|SYSRAC}] [edition=value]]
where <logon> ::= <username>[/<password>][@<connect_identifier>]
<proxy> ::= <proxyuser>[<username>][/<password>][@<connect_identifier>]
Enter user-name: oracle:[~]$
oracle:[~]$
oracle:[~]$
oracle:[~]$ sqlplus sys/"a b"@localhost:1521/ORCLCDB as sysdba
... (not work)
oracle:[~]$ sqlplus sys/\"a b\"@localhost:1521/ORCLCDB as sysdba
... (not work)
oracle:[~]$ sqlplus sys@localhost:1521/ORCLCDB as sysdba
... (type "a b" without quotes and not work)
如何连接到数据库?
这个问题中的 SQL 是针对 Oracle 的。但是您可以简单地删除FROM dual
它以使其在 SQL Server 上工作(它返回与 Oracle 相同的结果)。
我有以下 SQL:
SELECT 1
FROM dual
WHERE NULL IN (SELECT 1 FROM dual WHERE 1 = 0);
SELECT 1
FROM dual
WHERE NULL NOT IN (SELECT 1 FROM dual WHERE 1 = 0);
分别返回一个空集和 1。当我们用其他值替换 时NULL
,我们得到了完全相同的结果。
SELECT 1
FROM dual
WHERE 33 IN (SELECT 1 FROM dual WHERE 1 = 0);
SELECT 1
FROM dual
WHERE 33 NOT IN (SELECT 1 FROM dual WHERE 1 = 0);
那么NULL和空结果集的比较在这里是如何进行的呢?
我注意到 Oracle 数据库下载页面有两组客户端供用户下载。有一个东西叫“客户端”,有 32 位版本和 64 位版本。另外,还有一个叫“client home”的东西,它也有32位和64位两种版本。它们之间有什么区别?我什么时候应该使用哪个?