数据库管理员

希望提高数据库技能并向社区中的其他人学习的数据库专业人员的问答

2
DBCC CHECKDB无法修复的损坏:索引视图包含视图定义未生成的行
TL; DR:我在索引视图中有无法修复的损坏。详细信息如下: 跑步 DBCC CHECKDB([DbName]) WITH EXTENDED_LOGICAL_CHECKS, DATA_PURITY, NO_INFOMSGS, ALL_ERRORMSGS 在我的一个数据库上产生以下错误: 消息8907,级别16,状态1,第1行空间索引,XML索引或索引视图“ ViewName”(对象ID 784109934)包含视图定义未生成的行。这不一定表示此数据库中数据的完整性问题。(...) CHECKDB在表'ViewName'中发现0个分配错误和1个一致性错误。 repair_rebuild是最低修复级别(...)。 我确实知道,该消息表明索引视图“ ViewName”的物化数据与基础查询生成的数据不同。但是,手动验证数据不会出现任何差异: SELECT * FROM ViewName WITH (NOEXPAND) EXCEPT SELECT ... from T1 WITH (FORCESCAN) join T2 on ... SELECT ... from T1 WITH (FORCESCAN) join T2 on ... EXCEPT SELECT * FROM ViewName …

1
AlwaysOn AG,具有故障转移功能的DTC
问题:如何在AlwaysOn可用性组(AG)中的所有服务器上运行分布式事务处理协调器(DTC)?我不需要通过故障转移/切换事件来维护事务。 设置:我有一个Windows故障转移群集(WSFC),其中包含三台都运行SQL 2012的Windows 2008 R2服务器。两台服务器位于一个数据中心,是AlwaysOn故障转移群集(FCI)的一部分,而第三台服务器在第二个数据中心。WSFC是一个多子网群集。这是设置的草图: 我已经能够安装和配置DTC,使其在两个FCI节点之间工作,因为它们位于同一子网中并共享存储。我已经配置了几个AG,它们运行良好。此屏幕快照显示了在FCI上安装的DTC: 此屏幕快照显示,我可以在一个FCI节点(无论哪个处于活动状态)上配置DTC: 我想将使用DTC的应用程序迁移到该群集上并使用AG。我读过AG不支持DTC(参考)。我还没有找到在第二个数据中心的第三个节点上配置DTC的方法。当我尝试在第三个节点上配置DTC时,它似乎不可用,如以下屏幕截图所示: 在Brent Ozar的可用性组的免费安装清单PDF中,他列出了: 群集安装... 29.如果涉及FCI,请根据您的“计划”部分的决定配置DTC。 在对SQL Server 2012 AlwaysOn可用性组的评论中,Rock Brent说:“ ...当AG发挥作用时,没有任何变化。请记住,可用性组中的数据库在一起故障转移到另一个副本时不支持事务一致性。 ..” 这使DTC似乎可以在可用性组中使用,只要您了解到事务不会在AG切换中维护。我不需要它来维护来自FCI节点的事务。在灾难性灾难(我丢失了主数据中心)的情况下,我只需要DTC可供应用程序使用即可。 如何在第三个节点上配置DTC?还是在使用AG和需要DTC的应用程序时我不走运? 更新:我确定的解决方案是使用日志传送。但是,在故障转移的情况下,我仍然需要DTC在Node3上可用。我发现通过卸载在Node1和Node2之间共享的DTC的群集MSDTC-MSSQLSERVERCLU实例,它变得可用。删除后,我可以在Node3上设置和配置LocalDTC实例。之后,我可以重新安装群集的MSDTC-MSSQLSERVERCLU实例。按此顺序执行安装顺序似乎可行。我已经像这样跑了一段时间了,而且还没有发现任何不良影响。似乎这对于运行AlwaysOn可用性组也将起作用。我了解到分布式事务不会在AG故障转移中保留,我只需要新事务即可在故障转移后工作。但是我还没有

2
什么max_allowed_pa​​cket足够大,为什么我需要更改它?
我在主从设置中安装了MySQL(5.5),并创建了另一个从服务器。 我停止了原来的从属服务器,转储了数据,复制并重新导入了它,然后运行良好。我注意到了原始从站的master_log pos,并使用这些命令将其设置在新的从站上 CHANGE MASTER TO MASTER_HOST='<ipaddress>', MASTER_USER='<username>', MASTER_PASSWORD='<password>', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000851', MASTER_LOG_POS=15824150, MASTER_CONNECT_RETRY=10; 当我开始新的奴隶时,我得到了 Last_IO_Error:从二进制日志读取数据时,主机出现致命错误1236:'日志事件条目超过了max_allowed_pa​​cket; 增加master上的max_allowed_pa​​cket 但是,当我启动原始从属服务器时,它运行起来很好,并且现在已同步。 所以问题是: 当前值是16M,我怎么知道要走多大?(我宁愿避免生产服务器的反复试验)。 当原来的从属服务器很好时,为什么我需要增加主控板上的值,问题可能出在新的从属服务器上吗? 更新 正如Rolando在主机,旧从机和新从机上建议的那样,我将max_allowed_pa​​cket增加到1073741824,然后重新启动它们(SET GLOBAL max_allowed_packet = 1073741824;由于某些原因,似乎没有用) 现在最后一个IO错误与以前相同,但是现在我看到了 Last_SQL_Error:中继日志读取失败:无法解析中继日志事件条目。可能的原因是:主站的二进制日志已损坏(您可以通过在二进制日志上运行“ mysqlbinlog”来检查),从站的中继日志已损坏(可以通过在中继日志上运行“ mysqlbinlog”来检查)网络问题,或主从MySQL的错误。如果要检查主站的二进制日志或从站的中继日志,则可以通过在此从站上发布“ SHOW SLAVE STATUS”来知道其名称。 如果我在主文件上执行一个mysqlbinlog,它会用命令滚动很久很久很久-该文件为722M-如果我为从属中继日志执行该操作 错误:Log_event :: read_log_event()中的错误:“健全性检查失败”,data_len:38916267,event_type:69 错误:无法读取偏移量为253的条目:日志格式错误或读取错误。 我检查了变量,但所做的更改有效 mysql>显示变量LIKE'%max_allowed_pa​​cket%'; 在新的从属设备上显示max_allowed_packetAND slave_max_allowed_packet,而在主设备上只有max_allowed_packet 所以我对母版进行了版本检查: mysql> show variables LIKE '%version%'; +-------------------------+--------------------------------------+ | …

1
运行总计到上一行
我需要有关开窗功能的帮助。我知道您可以计算一个窗口内的总和以及一个窗口内的运行总额。但是是否可以计算先前的运行总计,即运行总计不包括当前行? 我认为您将需要使用ROWor RANGE参数。我知道有一个CURRENT ROW选项,但我需要CURRENT ROW - 1,这是无效的语法。我对ROW和RANGE参数的了解有限,因此将非常感谢您的帮助。 我知道有这个问题的许多解决方案,但我看明白了ROW,RANGE争论,我以为这个问题可以用这些被破解。我提供了一种可能的方法来计算以前的总运行量,但我想知道是否有更好的方法: USE AdventureWorks2012 SELECT s.SalesOrderID , s.SalesOrderDetailID , s.OrderQty , SUM(s.OrderQty) OVER (PARTITION BY SalesOrderID) AS RunningTotal , SUM(s.OrderQty) OVER (PARTITION BY SalesOrderID ORDER BY SalesOrderDetailID) - s.OrderQty AS PreviousRunningTotal -- Sudo code - I know this does not work --, SUM(s.OrderQty) OVER …

8
从SQL转储还原数据库时出错
我对MySQL非常陌生,并且正在Windows上运行它。我正在尝试从MySQL中的转储文件还原数据库,但是出现以下错误: $ >mysql -u root -p -h localhost -D database -o < dump.sql ERROR: ASCII '\0' appeared in the statement, but this is not allowed unless option --binary-mode is enabled and mysql is run in non-interactive mode. Set --binary-mode to 1 if ASCII '\0' is expected. Query: 'SQLite format 3'. …

1
对SOS_SCHEDULER_YIELD等待进行故障排除
在运行我们的企业ERP(Dynamics AX 2012)时,我注意到我们的生产环境似乎比我们的开发系统慢得多。 在运行跟踪的同时在开发和生产环境中执行相同的活动后,我确认与开发相比,SQL查询在我们的生产环境中执行得非常慢(平均慢10到50倍)。 最初,我将其归因于负载,并在下班时间在生产环境上重新运行了相同的活动,并在跟踪中找到了相同的结果。 我在SQL Server中清除了等待统计信息,然后让服务器在其正常生产负载下运行了一段时间,然后运行了以下查询: WITH [Waits] AS (SELECT [wait_type], [wait_time_ms] / 1000.0 AS [WaitS], ([wait_time_ms] - [signal_wait_time_ms]) / 1000.0 AS [ResourceS], [signal_wait_time_ms] / 1000.0 AS [SignalS], [waiting_tasks_count] AS [WaitCount], 100.0 * [wait_time_ms] / SUM ([wait_time_ms]) OVER() AS [Percentage], ROW_NUMBER() OVER(ORDER BY [wait_time_ms] DESC) AS [RowNum] FROM sys.dm_os_wait_stats …

1
在PostgreSQL中使用STDIN的COPY
我刚开始使用Postgres,并且试图创建一个示例数据库来了解其功能,环顾四周,我在pgfoundry.org中找到了一些脚本。我理解这些命令,因为我以前使用过Oracle和MS-SQL,但是我正在运行的所有脚本在到达“ COPY FROM”指令时都会返回错误。更准确地说,该错误将引发在应该插入给定表中的第一个元素上。 我尝试将脚本同时作为查询和pgScripts运行,但是在两种方式下,我在COPY FROM之后的第一行都遇到了错误。 我正在使用pgAdminIII,并使用StackBuilder将PostgreSQL 9.2.4.1安装为数据库驱动程序。我是否可能缺少一些基本配置,从而无法运行此命令,或者我只是不了解它们的工作方式? 编辑: 错误是: ERROR: syntax error at or near "7" LINE 5600: 7 4 13 37 2012-03-10 16:41:43.797787 2012-03-10 16:41:43.797... ^ ********** Error ********** ERROR: syntax error at or near "7" SQL status: 42601 Char: 140891` 文本在哪里: COPY action_abilitations (id, group_action_id, partecipation_role_id, group_id, created_at, …

2
对重复键不执行任何操作
我将LuaSQL与PtokaX API插入下表中。 CREATE TABLE `requests` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `ctg` VARCHAR(15) NOT NULL, `msg` VARCHAR(250) NOT NULL, `nick` VARCHAR(32) NOT NULL, `filled` ENUM('Y','N') NOT NULL DEFAULT 'N', `dated` DATETIME NOT NULL, `filldate` DATETIME NULL DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE INDEX `nick_msg` (`nick`, `msg`), UNIQUE INDEX `ctg_msg` …

4
Mysqldump表不包括某些字段
有没有一种方法可以mysqldump没有某些字段的表? 让我解释一下: 我有一个名为的MySQL数据库tests。在tests我有3个表:USER,TOTO和TATA。我只是想mysqldump的表的一些领域USER,因此不包括像一些领域mail,ip_login等等。 我怎样才能做到这一点?
14 mysql  mysqldump 

4
连接在运行时是否优化到where子句?
当我写这样的查询... select * from table1 t1 join table2 t2 on t1.id = t2.id SQL优化器不确定将其翻译为...吗? select * from table1 t1, table2 t2 where t1.id = t2.id 从本质上讲,SQL Server中的Join语句只是编写sql的一种简便方法吗?还是在运行时实际使用? 编辑:我几乎总是并且几乎总是会使用Join语法。我很好奇发生了什么。


4
好,坏或无所谓:WHERE 1 = 1
给定有关reddit的问题,我清理了查询以指出问题在查询中的位置。我首先使用逗号WHERE 1=1,并使修改查询更容易,所以我的查询通常以如下方式结束: SELECT C.CompanyName ,O.ShippedDate ,OD.UnitPrice ,P.ProductName FROM Customers as C INNER JOIN Orders as O ON C.CustomerID = O.CustomerID INNER JOIN [Order Details] as OD ON O.OrderID = OD.OrderID INNER JOIN Products as P ON P.ProductID = OD.ProductID Where 1=1 -- AND O.ShippedDate Between '4/1/2008' And '4/30/2008' And P.productname …


4
在使用InnoDB引擎输入数次演出后,MySQL LOAD DATA INFILE速度降低了80%
我正在通过LOAD DATA INFILE加载100GB文件。我在MyISAM上取得了成功,几个小时就完成了。 我现在正在尝试使用InnoDB。负载以超过10MB / sec的速度快速启动(监视表文件的增长file_per_table是否已打开)。 但是,在大约5GB的数据传输之后,它会降低到2-4MB /秒的范围,而当我超过20GB时,它的传输速度会降低到2MB /秒左右。 InnoDB缓冲池的大小为8G。在运行LOAD DATA INFILE命令之前,我已经完成了以下操作: SET @@session.sql_log_bin=0; SET autocommit=0; SET unique_checks=0; SET foreign_key_checks=0; alter table item_load disable keys; //Run LOAD DATA INFILE.... 我看不出它启动良好并随着时间的推移变慢的原因。 另外,使用相同的设置,我使用InnoDB和MyISAM和5GB测试数据集对表运行了相同的LOAD DATA INFILE命令,MyISAM快20倍: InnoDB: mysql> LOAD DATA CONCURRENT LOCAL INFILE '/tmp/item' REPLACE INTO TABLE item_load; Query OK, 2630886 rows affected, …

1
如何管理31亿行数据?
我目前的任务是为相对大量的数据实现存储模式。首先将访问数据以确定当前data point值,但我还需要跟踪过去六个月的数据趋势/分析历史。 添加了最近的要求以跟踪过去一小时的min/ max/ sum值。 注意:理想情况下,我想考虑使用MongoDB选项,但是我需要证明我已经首先用尽了SQL-Server选项。 数据 下表代表主要数据源(最常查询)。该表将有大约五百万行。在初始数据加载之后,数据更改将主要是UPDATE带有非常偶然的INSERT语句的语句。我已选择将数据聚类,dataPointId因为您将始终选择all values for a given data point。 // Simplified Table CREATE TABLE [dbo].[DataPointValue]( [dataPointId] [int] NOT NULL, [valueId] [int] NOT NULL, [timestamp] [datetime] NOT NULL, [minimum] [decimal](18, 0) NOT NULL, [hourMinimum] [decimal](18, 0) NOT NULL, [current] [decimal](18, 0) NOT NULL, [currentTrend] [decimal](18, 0) …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.