数据库管理员

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

2
将数据库移至新数据中心
我的公司正在将基础架构移至新的数据中心,我正在尝试找出使新服务器上的数据库与当前生产数据库保持同步的最佳方法,直到新环境准备就绪。我不是一名全职的DBA,而是进行了一些研究,从阅读的内容来看,跨国复制设置似乎可以最好地满足我们的需求。 一些细节:生产数据库的大小约为90 GB,使用Robocopy大约需要9个小时才能将其副本移至新服务器中。当前的生产数据库将需要保持联机状态,并且在整个迁移过程中都可以访问。它的恢复很简单,因此数据库镜像不可用。 事务复制是保持数据库同步的最佳方法吗? 我的计划: (完成)传输当前数据库并登录到新服务器,并将其附加到SQL Server的新实例 在我们的开发数据库计算机上设置分发服务器,然后从生产数据库中发布该分发服务器 在新的数据库计算机上创建一个订户,该订户将每晚每晚接受一次从分发服务器推出的更新 我有两件事。事务复制要求每个发布的表都有一个主键,生产数据库中的许多表都没有定义主键。我认为这不会成为太大的问题,因为我主要关心的只是同步数据库。我们将在以后的数据中测试使用数据库的不同应用程序,但我想确保它不是一个严重的问题。其次,是否还需要从原始实例(例如master)中移出任何关联的系统DB?我们将在新环境中迁移到Active Directory设置,因此我不在乎用户等,但是我不确定系统DB的必要性。 总体而言,我是否正确理解了这些概念?

1
从.zip安装MySQL for Windows并重置root密码
我想在我的PC(使用Windows 8.1 x64)上仅安装MySQL服务器,而没有Workbench或其他工具。所以我.zip从dev.mysql.com/downloads下载了归档文件。它是x86_64版本5.7.9(MySQL Community Server(GPL))上Win64的下载。 我将其安装为Windows服务,但没有mysql数据库information_schema。所以我执行了这个: mysql_upgrade.exe --upgrade-system-tables 并mysql创建了数据库。但是与此同时,root用户也发生了一些事情,因为我无法再访问mysql了。 因此,我决定重设此突然出现的密码(因为在此之前我没有密码)。我在官方手册中建立了以下解决方案,我像这样启动了服务器: mysqld.exe --skip-grant-tables --console 然后我mysql没有密码就打开了: mysql.exe –u root 然后尝试重置根密码: SET PASSWORD FOR 'root'@'localhost' = PASSWORD(‘passhere'); 但是我得到了这个错误: 错误1131(42000):您将MySQL作为匿名用户使用,不允许匿名用户更改密码”。 这是什么?我如何匿名?所有命令均在cmd.exe管理员下执行。 在这种情况下,我应该怎么做才能重置根密码? 更新1:我尝试检查当前用户: SELECT USER(), CURRENT_USER(); 这给出了: +--------+----------------+ | USER() | CURRENT_USER() | +--------+----------------+ | root@ | @ | +--------+----------------+ 太奇怪了,因为我这样开始mysql.exe -u root。 然后我检查了用户表: …

2
如何获得像SSMS这样的单个行数?
我有一个客户端c#程序,正在通过执行存储过程ExectueNonQuery,包括PRINT使用InfoMessage事件捕获和错误输出。它工作正常,但我注意到有些奇怪。 当我从SSMS执行存储过程时,它将显示在“消息”选项卡中执行的每个单独的SQL语句的行数(就像它来自InfoMessages)。尽管我的程序确实捕获了所有其他相同的输出,但是我的程序从未看到这些消息。相反,它仅返回ExecuteNonQuery函数结果中受影响的行,该行是所有单个行计数之和(这是无用的)。 例如,此过程: use [tempdb] go SELECT * INTO MyCols FROM sys.columns go CREATE PROC foo As UPDATE MyCols SET name = name + N'' -- SSMS shows (662 row(s) affected) UPDATE MyCols SET name = name + N'' WHERE name like '%x%' -- SSMS shows (59 row(s) affected) PRINT …

2
我可以在多个磁盘上进行完整备份吗?
目前,我只有一个备份文件IMTDB.bak,它与数据库本身在同一HDD上。我想通过本质上将其“复制”到另一个磁盘来增加此数据库备份的冗余,但是出现错误“服务器备份失败,该介质被格式化为支持2个介质系列”。我认为这意味着在创建备份时,仅意味着将备份放在一个驱动器上,而我无法追溯地添加更多。我想将备份迁移到该其他驱动器(实际上只是将其复制过来),但是我不想删除当前备份来执行此操作。 我该怎么办?我仅将IMTDB.bak复制到另一个驱动器上的文件夹中是否安全?

5
SQL查询仅显示单个食品的最新购买记录
我正在使用MS Access 2013中的食品购买/发票系统,正在尝试创建一个SQL查询,该查询将返回每个食品的最新购买价格。 这是我正在使用的表的图表: 我对SQL的理解是非常基础的,因此我尝试了以下(不正确的)查询,希望它对每个项目仅返回一条记录(由于DISTINCT运算符),并且仅返回最近的购买记录(因为我做了ORDER BY [Invoice Date] DESC) SELECT DISTINCT ([Food items].Item), [Food items].Item, [Food purchase data].[Price per unit], [Food purchase data].[Purchase unit], Invoices.[Invoice Date] FROM Invoices INNER JOIN ([Food items] INNER JOIN [Food purchase data] ON [Food items].ID = [Food purchase data].[Food item ID]) ON Invoices.ID = [Food …

6
索引重建时间是否取决于碎片级别?
重建索引所需的时间是否取决于碎片级别? 如果重建相同索引的40%碎片索引需要1分钟,重建80%碎片索引大约需要2分钟吗? 我要求的是执行所需操作所需的RUNTIME(例如,以秒为单位),而不是关于在特定情况下需要执行哪些操作。我知道应该进行索引重组或重建/统计更新时的基本最佳实践。 这个问题不问关于REORG以及REORG和REBUILD之间的区别。 背景:由于设置了不同的索引维护作业(每个晚上,周末工作量较大……),我想知道是否应该对低中级零散的索引更好地执行每日“轻度”离线索引维护作业,以保持关闭时间很小-甚至没有关系,在80%碎片索引上进行重建可能需要与在40%碎片索引上进行相同操作的时间相同。 我遵循了建议,并试图找出自己正在发生的事情。我的实验设置:在没有其他操作且未被任何人或其他任何人使用的测试服务器上,我在uniqueidentifier主键列上创建了带有聚簇索引的表,其中包含一些其他列和不同的数据类型[2数字,9日期时间和2 varchar(1000)]并简单地添加行。对于提出的测试,我增加了约305,000行。 然后,我使用了一条更新命令,并随机更新了对整数值进行过滤的行范围,并使用变化的字符串值更改了VarChar列之一以创建碎片。之后,我检查中的当前avg_fragmentation_in_percent水平sys.dm_db_index_physical_stats。每当为基准创建“新”碎片时,都会将此值(包括该physical_page_count值)添加到下图所组成的录音中。 然后我跑了出来:Alter index ... Rebuild with (online=on); 并CPU time通过STATISTICS TIME ON录音来抓取。 我的期望:我期望至少看到一种线性曲线的指示,该线性曲线显示碎片水平和cpu时间之间的依赖关系。 不是这种情况。我不确定此程序是否真的适合取得良好效果。也许行数/页面数太少? 但是结果表明,我最初的问题的答案肯定是“ 否”。看起来SQL Server重建索引所需的cpu时间既不依赖于碎片级别,也不依赖于基础索引的页数。 第一张图表显示了与先前的碎片级别相比,重建索引所需的cpu时间。如您所见,平均线是相对恒定的,碎片与所需的cpu时间之间根本没有关系。 为了尊重更新后索引页数变化可能会影响重建的时间的影响,我计算了FRAGMENTATION LEVEL * PAGES COUNT并在第二张图表中使用了该值,该图表显示了所需cpu时间的关系以及碎片和页数。 如您所见,即使页面数有所变化,这也并不表示重建所需的时间受碎片影响。 在做出这些陈述之后,我想我的程序一定是错误的,因为重建一个庞大且高度分散的索引所需的cpu时间可能仅受行数的影响-我并不真正相信这一理论。 因此,因为我确实非常想立即发现这一点,所以欢迎任何进一步的评论和建议。

5
使用动态SQL在数据库之间切换
我有一个涉及在多个数据库之间执行各种命令的过程-但是,当我使用动态SQL通过“ use @var”更改数据库时,它实际上并没有更改数据库。 在[test_db]中执行此操作: declare @currentDB varchar(max) declare @sql varchar(max) set @currentDB = DB_NAME() set @sql = 'use [' + @currentDB +']' use master exec(@sql) select DB_NAME() 返回[Master]作为当前数据库名称-如果我将其use [test_db]作为命令而不是动态输入,则它将返回正确的名称。 有没有一种方法可以在数据库之间正确切换?

1
防止在不合格的索引视图上聚集索引插入运算符
有谁知道解决方法?从本质上讲,即使行不符合条件,存储过程也会强制对索引视图执行插入操作。结果,存在转换错误。但是,对于临时而言,sql可以正确地消除视图的考虑。 考虑以下架构: create table testdata ( testid int identity(1,1) primary key , kind varchar(50) , data nvarchar(4000)) go create view integer_testdata with schemabinding as select cast(a.data as int) data, a.kind, a.testid from dbo.testdata a where a.kind = 'integer' go create unique clustered index cl_intdata on integer_testdata(data) go create procedure insert_testdata …

3
如果带有代理键的表的列已知具有唯一的非空值(例如SSN),是否违反3NF?
据我了解,第三范式(3NF)基本上意味着应该只有一个密钥。 如果带有自动递增id列的表还具有一个已知唯一且不为空的列(例如,社会保险号),则该另一列可用作键。 从严格的架构设计方面,忽略实际/业务问题(例如,将SSN作为密钥/ FK传递时的安全性/隐私风险),由于有效地有2个密钥,这样的表是否不会出现在3NF中? 答案是否会在另一列上是否有唯一键上有所不同?如果是这样,为什么?

2
数据库引擎被盗的服务器内存过高
我从系统中心运营经理(SCOM)得到错误。 如何解决这个错误? SQL DB 2012引擎被盗服务器内存太高。 我运行查询并获得以下计数器: ╔═══════════════════════════════╦═════════════╗ ║ Stolen Server Memory (MB) ║ 7354.773437 ║ ║ Lock Memory (MB) ║ 106.195312 ║ ║ Free Memory (MB) ║ 64.632812 ║ ║ Connection Memory (MB) ║ 24.203125 ║ ║ Log Pool Memory (MB) ║ 14.085937 ║ ║ Optimizer Memory (MB) ║ 2.351562 …

2
想要在过滤索引中放置OR时有什么解决方法?
想要在过滤索引中放置OR时有什么解决方法? create index FIDX_tblbOrders_sdtmOrdCreated_INCL on dbo.tblBOrder(sdtmOrdCreated) INCLUDE (sintMarketID, strCurrencyCode, sintOrderStatusID ) WHERE ((sintMarketId=1) AND ( (sintOrderStatusId < 9) OR (sintOrderStatusId > 14))) 我正在尝试创建上面的索引,因为我对sintOrderStatusId IN(9-14)的任何情况都不感兴趣 当然,我可以创建一个视图或索引视图,但是我试图避免这种情况。 只需添加更多信息:sintOrderStatusId是smallint NOT NULL,并且可能的值范围是1到30。应避免使用9到14,因此要过滤索引。

2
SQL Server 2008:每天重启的序列
我必须添加一个触发器,该触发器应使用以下格式字符串更新列:<current_date>_<per_day_incremental_id>,例如2015-10-01_36。ID必须是递增的,并且允许有空格。 我的方法很幼稚:用当前日期和当前序列值创建一个表,并在其中保留一条记录: create table DailySequence ( date date, sequence int ) insert into DailySequence values (getdate(), 1); CREATE TRIGGER MakeHumanReadableId ON dbo.AuditMeasures FOR INSERT AS DECLARE @ret int; DECLARE @tempDate date; DECLARE @nowDate date; SET @nowDate = getdate(); SELECT @ret = t.sequence, @tempDate = t.date from DailySequence as t; IF …

2
使用数据库跟踪对象的锁定/解锁
我需要跟踪对象的锁定/解锁动作。在对对象(合同,合作伙伴等)执行任何操作之前,将lock发出一个事件。操作完成后,它将发出unlock事件。 我想获取那些已锁定但尚未解锁的对象。目的是使查询快速并避免死锁。 下表是 create table locks ( id int identity, name varchar(255), lock int ) insert into locks values('a', 1) insert into locks values('b', 1) insert into locks values('c', 1) insert into locks values('d', 1) insert into locks values('a', 0) insert into locks values('c', 0) insert into locks values('a', 1) …

2
使用哈希密码为应用程序角色编写脚本
我需要使用哈希密码编写应用程序角色脚本,以便将其从一个数据库复制到另一个数据库。 请考虑以下示例代码,该代码使用应用程序角色为非信任用户提供提升的访问权限: USE tempdb; CREATE LOGIN LimitedLogin WITH PASSWORD = 'Password1' , CHECK_POLICY = OFF , CHECK_EXPIRATION = OFF; CREATE USER LimitedLogin FOR LOGIN LimitedLogin WITH DEFAULT_SCHEMA = dbo; CREATE APPLICATION ROLE MyAppRole WITH PASSWORD = 'Password2' , DEFAULT_SCHEMA = dbo; EXEC sp_addrolemember @rolename = 'db_datareader' , @membername = 'MyAppRole'; …

4
从链接服务器获取@@ SERVERNAME
这似乎是一个基本问题,但我在那里找不到任何答案-我需要能够从链接服务器获取服务器名称/实例等。我尝试了几件事: select <linked server>.@@SERVERNAME; select <linked server>.SERVERPROPERTY('ServerName'); ...但是没有喜悦。有任何想法吗? 这是SQL 2008 R2&2014(2008R2是链接服务器) 编辑:错误是: 消息102,级别15,状态1,第2行'@@ SERVERNAME'附近的语法不正确。

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.