我有一个最终用户需要查询的系统,但不能保证他们精通查询编写。我们想确保每个 SELECT 语句都以 LIMIT 100000 结尾。我想到了一些正则表达式和一些工具来执行此操作。本机查询重写似乎是一个不错的选择,但我们需要将 ProxySQL 用于其他事情,因此我想看看是否有人知道强制执行此操作的方法。
模式或正则表达式似乎是这样的:以 select 开头的任何内容都需要在最后一行有一个 LIMIT,后跟一个空格和等于或小于 100000 的整数,然后可能是一个分号。
有没有人有幸这样做?
我做了一个简单的get-clusterresource
并注意到' owner group
'是' available storage
'。不SQL Server (instance)
适合SQL Server Network Name (instance)
。我想尽快解决这个问题,但我很难找到如何只移动所有者组。
或者实际上,据我所知,SQL 网络名称(实例)甚至不应该是“网络名称”。是个例。我认为这是我不需要的额外一行,应该删除它:
SQL IP Address 1 (clsnwname... Online SQL Server (I1) IP Address
SQL IP Address 1 (clsnwname2... Online SQL Server (I2) IP Address
SQL Network Name (clsnwname... Online SQL Server (I1) Network Name
SQL Network Name (clsnwname2... Online SQL Server (I2) Network Name
SQL Network Name (I1) Failed Available Storage Network Name
SQL Server (I2) Online SQL Server (I2) SQL Server
SQL Server (I1) Online SQL Server (I1) SQL Server
SQL Server Agent (I2) Online SQL Server (I2) SQL Server Agent
SQL Server Agent (I1) Online SQL Server (I1) SQL Server Agent
我正在测试一个将在某个时候发布的新服务器,并注意到 Windows 更新没有安装 SQL 更新。它说它无法更新,因为 IP 处于离线状态。
我反复测试了故障转移,它始终有效,并且继续如 GUI 中所示工作,没有任何问题并且 IP 已启动。复制和所有连接都工作正常。
我在非 FCI 节点上安装了 2 节点 FCI 和独立 SQL Server。我一直在自动化 FCI、AG 和 DB 副本的配置/安装,到目前为止,在我的所有测试中都运行良好。
今天我在执行时收到以下错误:
USE [master]
GO
CREATE AVAILABILITY GROUP [AGName]
WITH (AUTOMATED_BACKUP_PREFERENCE = SECONDARY)
FOR
REPLICA ON N'Node3\ReadOnly' WITH (ENDPOINT_URL = N'TCP://Node3-blah.blah.com:5022', FAILOVER_MODE = MANUAL, AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT, SESSION_TIMEOUT = 10, BACKUP_PRIORITY = 50, PRIMARY_ROLE(ALLOW_CONNECTIONS = ALL), SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL)),
N'Primary/Primary' WITH (ENDPOINT_URL = N'TCP://primary.blah.com:5022', FAILOVER_MODE = MANUAL, AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT, SESSION_TIMEOUT = 10, BACKUP_PRIORITY = 50, PRIMARY_ROLE(ALLOW_CONNECTIONS = ALL), SECONDARY_ROLE(ALLOW_CONNECTIONS = NO));
GO
错误:
消息 19405,级别 16,状态 17,第 3 行
无法创建、加入或添加副本到可用性组“AGName”,因为节点“Node3”是副本“Node3\ReadOnly”和“Primary/Primary”的可能所有者。如果一个副本是故障转移群集实例,请从其可能的所有者中删除重叠的节点,然后重试。
节点 3不是FCI 的一部分。它具有 SQL Server 的独立安装,并且未列为可能的所有者。
如果我尝试故障转移到节点 3,FCI 会通知我它不是可能的所有者。
我不确定是什么原因造成的。几天前,我在节点 1 和 2 之间使用 FCI 进行了故障转移。这次我确实删除了侦听器来测试它,因为这是我做的最后一件事。有什么想法吗?
我可以拆除 FCI 并让自动化重新创建它,但我想尝试解决这个问题而不这样做,以防万一有一天这种情况发生在产品中。我们应该能够从 WSFC 中逐出该节点并重新添加它,但我不想让我们的运营团队不得不这样做。我们将拆除整个集群并让它在发布之前从头开始构建。
编辑。这是 FCI 节点的输出:
select * from sys.dm_os_cluster_nodes
NodeName status status_description is_current_owner
---------------------------------------------------------
SQNodeL001-LA 0 up 1
SQNodeL002-LA 0 up 0
SQLNode003-LA 0 up 0
独立的输出为空。它是 WSFC 的一部分,但还不是 FCI 或 AG。
powershell 输出显示所有 3 个都可以是所有者节点,这很奇怪。
ClusterObject OwnerNodes
------------- ----------
SQL Server (Instance) {SQNodeL001-LA, SQNodeL002-LA, SQNodeL003-LA}
从 GUI 中,它没有选择节点 3 作为首选所有者。请原谅进行微小的更改并删除名称。第一个节点名称全部小写。其他2个大写。看起来我可能需要在 powershell 中完成所有这些操作才能获得准确的数据,但还没有实现这一步骤的自动化。那将是下一个冲刺。
编辑 2 - 已解决:
感谢 Sean 的 PowerShell 查询,我可以看到它仍然在 PowerShell 中列为所有者,尽管它不在 GUI 中。我使用它删除了它get-clusterresource "sql server (instance)" | set-clusterownernode -Owners node1 node2
并且它有效。谢谢肖恩!
我有几张包含大约 60 亿行的大表,我正在寻求优化。集群键是 Epoch(unix 日期时间,即 1970 年之后经过的秒数)和客户 ID。此表记录每个客户每种产品类型的使用数据。
例如,如果这是针对电信公司的,TypeID 1 是本地呼叫,值是该客户使用的分钟数。TypeID2 是国际电话,是该客户在该小时内使用了多少分钟的值。假设 TypeID3 是国内电话的特殊折扣费率。
数据以 1 小时的间隔存储。我希望索引视图存储聚合的 24 小时值,因此当我们对每个客户运行 1 天的查询时,它只需要在索引视图中查找 1 行,而不是在基表中查找 24 行。
这是基表:
ColRowID (bigint)
AggregateID (int)
Epoch (int)
CustomerID (int)
TypeID (tinyint)
ErrorID (smallint)
Value (int)
出于报告目的,我们不关心 Aggregate 或 RowID,因此我认为索引视图将如下所示:
CREATE VIEW [ixvw_AggTbl]
WITH SCHEMABINDING
AS
SELECT Epoch, CustomerID, TypeID, ErrorID, SUM(Value)
FROM DBO.BaseTbl
-- GROUP BY Epoch (what goes here?? Epoch/86400? If I do that I have to
-- put Epoch/86400 in the SELECT list as well)
编辑:
示例基础数据(在这种情况下,我省略了我们不需要的列,假设 ID 列在那里)。每个“TypeID”都将分配一个值,该值可以为 0。
例如,
Epoch / Customer ID / TypeID / Value /* Epoch 90,000 is day 2 1am */ 90000 (1am day 2) / 1 / 1 / 200 90000 (1am day 2) / 1 / 2 / 100 90000 (1am day 2) / 1 / 3 / 120 /* Customer ID 2 as well */ 90000 (1am day 2) / 2 / 1 / 100 90000 (1am day 2) / 2 / 2 / 50 90000 (1am day 2) / 2 / 3 / 310 ... (repeat for 30,000 customers) /* Customer ID 1 2am day 1) */ 93600 (2am day 2) / 1 / 1 / 150 93600 (2am day 2) / 1 / 2 / 0 93600 (2am day 2) / 1 / 3 / 550 /* Customer ID 2 2am day 2) */ 93600 / 2 / 1 / 80 93600 / 2 / 2 / 150 93600 / 2 / 3 / 300 ... (repeat for 30,000 customers)
假设所有其他 VALUE 列在当天剩余时间为 0,因为系统出现故障,并且在凌晨 2 点之后没有人可以使用他们的手机。我希望我的索引视图记录每天聚合 的值列,每个 customerID 和 TypeID。
样本将是:
172800 (Day 3 midnight) / 1 / 1 / 350 --Cust ID 1 aggregated all type id 1 in the past 24 hours
172800 (Day 3 midnight) / 1 / 2 / 100
172800 (Day 3 midnight) / 1 / 3 / 670
172800 (Day 3 midnight) / 2 / 1 / 180 --Cust ID 2 now
172800 (Day 3 midnight) / 2 / 2 / 200
172800 (Day 3 midnight) / 2 / 3 / 610
--Repeat by adding 86400 to the epoch to gather the summary data of the rows for the previous day.
我们公司现在已经为 MS Windows 端聘请了一名全职发布工程师,我们正在考虑 MS SQL Server 的发布管理流程。
如果我们对他们部署 SQL Server 脚本的能力有信心,那么通常只让发布经理来做还是由 DBA 通常做的事情?我们的企业正在快速发展,我们的 DBA 有点超负荷(令人惊讶的是还有什么新东西)但我们可以雇用更多,但这是另一回事。
你们如何管理这个?您是否允许发布经理访问产品以推出更改?您是否取消权利并在需要释放时将其打开?我想我会让他们访问一个 sproc,让他们可以访问 prod 一个小时,但它会记录调用它的人。
还是我完全不在乎,而这是 DBA 应该始终管理的事情?
任何想法将不胜感激!
编辑:
更新: 还有当我们遇到异常时会发生什么?例如,开发人员声明“这些表应该与其他环境相匹配(我所说的环境是指客户生产环境,而不是 qa/stage/etc.)”。通常他们会进行抽查。我做了一个校验和并注意到最终只是空白问题的问题。在这种情况下,我们是否在进行基本故障排除后将其推回给发布经理/质量人员进行修复?
另一个例子:我们有大约 20 个开发人员的脚本,有时他们相互依赖。脚本的顺序是错误的。我跟不上 20 个开发人员的工作,也无法管理数据,但经过一些故障排除后,我们发现了问题并更改了顺序。这是 DBA 通常应该深入参与的事情,还是在基本测试和检查之后公平,我们将其发回给发布经理和开发人员进行修复?
我管理一个混合数据库环境,我们的程序员可以使用一些很好的回滚选项。我正在考虑使用 SQL Compare、Red Gate Source Control 和其他一些工具,但我想不出什么是确保回滚时数据丢失最少的最佳方法。
假设我们处于边缘情况,例如当外键被添加到另一个填充有客户数据的表时,我们需要回滚对主表的更改。有哪些行业标准最佳实践可以确保在事务日志恢复、快照恢复、redgate 源代码控制等之外顺利回滚,以处理这些难以从场景中恢复的问题?
谢谢!
我正在为一家在各大洲都设有数据中心的全球分散公司设计横向扩展解决方案。超过 10,000 台服务器向洛杉矶的 SQL Server 集群报告,并查询它以执行某些任务。
正当理由
为了从集群、垂直扩展的问题以及由于许多节点之间的全球网络距离到洛杉矶集群而提高性能,我想在特定核心表上使用事务复制到订阅者(单发布多子)作为我的第一步,传播到世界各地。
有待解决的问题
如果出于某种原因数据超过 X 分钟(假设 10 分钟),我希望他们转到发布者(或另一个定义的服务器)并从那里读取它。如果首选实例不可用或过时,我想自动从发布者实例中获取数据。
我不确定执行此操作的最佳方法是什么,尤其是在数据“陈旧”的情况下。我知道我们有复制监控工具,但我如何使用它来了解数据是否过时并强制连接到另一台未过时的服务器?
原因是我担心某些问题需要 10 分钟以上才能解决,在此期间维护和自动配置等关键应用程序将获得过时数据,业务可能会受到很大影响。
可能的解决方案和问题:
将订阅者/发布者置于“只读”负载平衡器中,并让所有查询都去那里。
如果数据库服务器都在同一个数据中心,我可能会使用负载平衡器并将服务器从中拉出来,但这需要手动干预,我希望系统强制所有读取到发布者(或另一个订阅者)并绕过他们连接的订阅者。
但是,这不会解决陈旧数据的问题,例如复制落后并且需要一个小时才能修复。
修改代码以检查未完成的复制查询并相应地进行调整
这将需要对许多查询进行代码修改,而开发人员没有时间这样做,而且这听起来不像是一个非常合理的想法。
如果未复制 X 个查询,则查询复制状态并自动更改连接字符串
我应该能够在 Powershell 中执行此操作,但大多数服务器都是 Linux,因此它们需要一个“应用程序”来查询复制状态,并在未复制命令数量超过 X 时修改它们的连接字符串。
谢谢!我有 1 个 2012 环境和几个 2008 环境,我想在其上实现它,我们的想法是我们将它们全部移动到 2012。企业是一个选项。
其他思考
在洛杉矶有一个负载均衡器,世界会向其发送一个非常快速的小查询,以决定选择哪个服务器实际上可能工作得很好,因为这将是一个小查询,也许请求端可以临时缓存该信息。
似乎我必须让 SQL 或其他数据库引擎将“只读”对吐回应用程序“此数据已过时,去其他地方,最好是在这里”
我想以最少的服务器开销删除大约 100,000 条记录。我遇到了一些无法正确测试的烦人问题,所以我想我会在这里问一些专家。哪个更好:
1-
BEGIN TRAN
DELETE FROM dbo.x
WHERE ID IN (
1
,2
,3
,4
...
,100000
)
COMMIT
2-
BEGIN TRAN
DELETE FROM dbo.x
WHERE ID = 1
GO
DELETE FROM dbo.x
WHERE ID = 2
GO
...
COMMIT
3-
DELETE FROM dbo.x
WHERE ID = 1
GO
DELETE FROM dbo.x
WHERE ID = 2
GO
...
我的假设是 #1 会根据样本 % 进行扫描,挑选出项目,删除它们,并将其记录为一系列事务。也许它会将事务日志中的信息作为更改页面而不是每个 indvl 的基础。事务,因此您只能回滚整个活动并重新标记页面,或者您可以提交。那是对的吗?
在 #2 上,我在想 GO 语句是否通过不允许 SQL Server 存储引擎将所有这些滚动到 1 个大事务中来导致更多的事务日志活动,但仍然使用 BEGIN TRAN 为事务日志提供一些优化- COMMIT 块,因此使其比#3 更有效但不如#1 有效。
然后我会假设#3 将是每个 indvl 中最糟糕的一个。交易记录。
如果有人有任何好的博客文章或测试场景,他们可以指出我那也很棒。我已经研究了深入挖掘事务日志以自己解决问题的方法,但在这一点上,我想我会问问你们。
谢谢!
我希望我能得到一个明确的答案,说明如何确保像使用 MS SQL Server 一样进行完整的 Postgres 备份,然后照顾孤立的用户。
根据我的阅读,可能是错误的,找到一个好的 PostgreSQL 博客一直很有挑战性,所以请随时向我推荐一些,我需要弄清楚这个应用程序是如何工作的,这样我才能信任我的备份和 Slony复制。我让开发人员在选择 s 时通过 , 和 formatcustom
恢复directory
了我从 PgadminIII 获取的备份,但他说其中两个没有加载,但它只是目录,而不是数据。我现在真的很困惑。tar
OID
tar
pg_dump
andpg_dumpall
选项。我想备份我需要在某处测试恢复此数据库的所有内容,并验证是的,我们需要的所有数据和我们的备份都很好。最终我想写一个自动恢复脚本,但一天一次。pg_dumpall
显然有一个-globals
应该备份所有内容的选项,但pg_dumpall
显示的帮助-g, --globals-only dump only global objects, no databases
不是一个--globals
选项。
我认为pg_dumpall
至少会备份外键,但即使这似乎是一个“选项”。根据文档,即使pg_dumpall
我需要使用一个-o
选项来备份外键,我也无法想象什么时候我不想备份外键,这作为默认选项会更有意义。
我有一个 PostgreSQL 服务器,但我仍然无法理解为什么应用程序OID
默认不会备份 s!似乎有 99.9% 的时间你会想要这样。
更新 1:
Postgres文档提到globals
我正在寻找的选项似乎是此版本的默认选项,但它仍然需要该-o
选项。如果有人可以验证或给我一个示例命令,以在其他地方恢复单个数据库以及它需要的一切,我将不胜感激。
编辑:被网站要求通过编辑我的问题来展示这个问题的独特性。这个问题提出了问题,并明确了备份中的 OID、全局变量和非全局变量之间的区别,以及测试恢复建议以确保备份是好的,而不是仅仅备份。由于答案,我能够备份,找出全局/ oid,并使用 cron 作业在 Postgres 上每晚开始测试恢复过程。谢谢您的帮助!