数据库管理员

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

1
SQL Server 2008是否存储执行计划的创建日期?
最近,我们升级了一个使用的应用程序,其中涉及修改数据库的架构。这些更改可能迫使已丢弃的缓存执行计划。如果SQL Server被迫创建许多新计划,则可能会减慢用户体验。我想看看是否是这种情况。 因此,我的问题是,SQL Server 2008是否存储缓存的执行计划的创建日期?管理视图sys.dm_exec_cached_plans没有任何日期字段,因此我怀疑没有。

4
升级到Postgres 9.2时无法关闭旧的postmaster
我正在从9.1.4升级到Postgres 9.2.2。当我尝试使用以下方法升级数据库时: pg_upgrade -b /usr/local/Cellar/postgresql/9.1.4/bin -B /usr/local/Cellar/postgresql/9.2.2/bin -d /usr/local/var/postgres91 -D /usr/local/var/postgres 我收到以下错误消息: Performing Consistency Checks ----------------------------- Checking current, bin, and data directories ok There seems to be a postmaster servicing the old cluster. Please shutdown that postmaster and try again. Failure, exiting 我正在尝试停止服务器,但无法使升级命令正常工作。如何关闭旧的邮政局长?


1
启用“ log_queries_not_using_indexes”会禁用“ long_query_time”吗?
我注意到,在MySQL中实现的时候log_queries_not_using_indexes,slow_query_log和long_query_time,生成慢查询日志文件将包含大量的查询即使查询时间比少得多long_query_time。 似乎一旦log_queries_not_using_indexes启用,无论“ long_query_time”是什么,Mysql都会记录所有不使用索引的查询。 有办法克服吗?我的意思是,有没有一种方法可以记录所有比花费更多时间的查询long_query_time,而不管它们是否使用索引?

1
在SQL Server Profiler中进行跟踪时,是否可以在过程调用中记录传入的参数值?
我正在尝试使用SQL Server Profiler(我正在使用SQL Server 2012)来生成有用的跟踪,以显示参数值,而不仅仅是显示带有变量名的SQL。该存储过程将遍历大量库存数据,以产生一些非常有价值的结果,而我正尝试记录现有行为,因此我可以对其进行单元测试,准确定义,然后将其重构为合理的形式。 我有一个执行54参数子过程的存储过程,该过程在一个循环内,在该循环中该存储过程创建一个游标,然后执行while循环。这是一个简化的视图: CREATE PROCEDURE [dbo].[OuterProcedure] ( @ProductCode varchar(8), -- 41 more parameters omitted ) AS SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED SET NOCOUNT ON DECLARE @AboutFourHundredLocalvariables -- omit about 400 local variable declarations. -- OMIT ABOUT 10 temporary table declarations. DECLARE aCursor CURSOR FAST_FORWARD FOR SELECT …

1
工作区内存内部
根据克里斯蒂安·博尔顿,布伦特·奥扎尔等人撰写的有关SQL Server 2008内部和故障排除(从伊利诺伊州本地图书馆借来的)的阅读书。可以确认或纠正我的理解。 每个需要查询内存授予的查询或操作都将需要工作空间内存。在使用排序,哈希匹配联接,并行性(不确定),批量插入(不确定),索引重建等的一般查询中,将需要查询工作区内存。 工作区内存是SQL Server缓冲池的一部分(分配为缓冲池的一部分),最大工作区内存为分配给缓冲池的内存的75%。默认情况下,单个查询不能获得超过25%的工作空间内存(在SQL 2008 / SQL 2012中-由资源调控器默认工作负载组开箱即用)。 寻求我的理解的确认 1)考虑具有48 GB RAM和最大服务器内存配置为40 GB的系统,这是否意味着最大工作空间内存限制为30 GB,并且单​​个查询不能获取超过10 GB的工作空间内存(查询内存)。因此,如果您有一个错误的查询要处理大量的哈希联接的十亿行,并且需要超过10 GB的内存(工作空间内存),那么是否还要遍历此内存授予队列或立即溢出到磁盘? 2)如果为执行大规模排序操作的查询分配了5 MB的工作空间内存,并且在查询执行期间查询优化器意识到由于统计错误或缺少索引,此查询实际上将需要30 MB的工作空间内存将立即溢出到tempdb。即使系统在执行期间有足够的工作区内存,一旦查询在执行期间超出了授予的工作区内存,它也必须溢出到磁盘上。我的理解正确吗?

2
将架构导入新的或不同的表空间
是否有一种简便的方法可以使用一个新的或不同于数据来源的表空间将模式导入Oracle 11gR2? 例如,我已经从OLDDB导出了BLOG_DATA,所有用户数据都存储在USERS表空间中。 在NEWDB上,我想导入BLOG_DATA模式,但是将用户对象存储在专门为此用户创建的BLOG_DATA表空间中。 我已经创建了BLOG_DATA用户,创建了BLOG_DATA表空间,并将其设置为该用户的默认表空间,并添加了适当的无限配额。 CREATE TABLESPACE blog_data DATAFILE SIZE 1G; CREATE USER blog_data IDENTIFIED BY secretpassword DEFAULT TABLESPACE blog_data QUOTA UNLIMITED ON blog_data; GRANT connect,resource TO blog_data 该模式是从OLDDB导出的,类似于 exp blog_data/secretpassword@OLDDB file=blog_data.dmp 在阅读了Phil的出色回答后,我发现自己很纳闷: 由于数据除了默认表空间(用户拥有配额的唯一表空间)外别无其他地方,这是否会有效地迫使imp将所有用户对象放在该默认表空间中? imp blog_data/secretpassword@NEWDB file=blog_data.dmp 然后,这会将整个blog_data模式放在NEWDB的blog_data表空间中吗?有什么原因为什么这行不通或者我会遇到某些对象等问题? 更新: 我进行了快速测试,发现情况确实如此。Imp将对象放置在该用户的默认表空间中,前提是该对象不能将其放置在原始表空间中(例如,该表空间不存在)。完整说明:http : //www.dolicapax.org/? p= 57 不过,我认为像Phil那样使用Data Pump可能是首选。

2
了解MS SQL Server加密和备份
因此,我在聊天中询问有关SQL Server备份文件的安全性。 有人告诉我,如果攻击者可以访问未加密的.bak文件,则他们可以访问数据。 因此,让我们看一下这种情况: OPEN SYMMETRIC KEY MySymetricKey DECRYPTION BY CERTIFICATE MyCertificate 注意-这里没有密码。 然后我们通过以下方式加密表: UPDATE tbl1 SET namePAss = ENCRYPTBYKEY(KEY_GUID('MySymetricKey'),name) GO 现在,假设有黑客窃取了我的bak文件。为了查看数据(在他自己的计算机和sql-server中),他要做的所有事情是: SELECT convert( NVARCHAR(max), decryptbykey(namePAss)) FROM tbl1 他仍然可以访问数据吗?

2
将数据从Oracle迁移到SQL Server的最简单方法是什么?
我们的产品之一同时支持Oracle和SQL Server作为数据库后端。我们有一个客户希望从Oracle后端切换到Microsoft SQL Server,这对我们来说不是典型的过渡。 将所有数据从整个Oracle模式中获取到SQL Server数据库中的最简单方法是什么? 模式只包含普通的旧表,没有花哨的东西。也许有一个或两个存储过程,我们手工迁移就不会有问题。 我可以使用Oracle的SQLDeveloper将表数据导出为CREATE和INSERT语句,但是这些与SQL Server上使用的语法不匹配,而且我不希望必须手动修复语法错误。

3
拒绝访问SQL Server中的信息架构
我正在寻找对SQL Server中的用户/组禁用对sys.tables/的访问的最佳方法Information Schema。 我从2008年发现了这个话题 它显示了一种如何拒绝访问的方法,[sys].[something]如下所示: DENY SELECT ON [sys].[columns] TO DenySystemTableSelectRole GO DENY SELECT ON [sys].[tables] TO DenySystemTableSelectRole GO DENY SELECT ON [sys].[syscolumns] TO DenySystemTableSelectRole GO DENY SELECT ON [sys].[sysobjects] TO DenySystemTableSelectRole GO 但是没有办法如何禁用对的访问Information Schema: DENY SELECT ON INFORMATION_SCHEMA.TABLES To DenySystemTableSelectRole 这似乎行不通。 如何禁用对information_schema的访问? 还有一种更简单的方法来禁用对所有sys/的访问information_schema吗? 更新: 实际上我不能同时运行以下语句: DENY SELECT ON [sys] …

2
设计模式-许多父表之一
我经常遇到数据库中的一种情况,其中给定的表可以FK到许多不同的父表之一。我已经看到了解决该问题的两种解决方案,但都不令人满意。我很好奇,您在那里看到过其他哪些模式?有更好的方法吗? 一个人为的例子 假设我的系统有Alerts。可以接收各种对象的警报-客户,新闻和产品。给定的警报可以仅针对一项。无论出于何种原因,客户,商品和产品都在快速移动(或本地化),因此在创建警报时无法将必要的文本/数据提取到警报中。有了这种设置,我已经看到了两种解决方案。 注意:以下DDL用于SQL Server,但我的问题应适用于任何DBMS。 解决方案1-多个可空FKey 在此解决方案中,链接到多个表的表具有多个FK列(为简便起见,下面的DDL不显示FK创建)。 好的 -在这种解决方案中,很高兴我有外键。FK的零光学特性使添加精确数据变得非常方便且相对容易。BAD查询不是很好,因为它需要N个 LEFT JOINS或N个 UNION语句来获取关联的数据。在SQL Server中,特别是LEFT JOINS会阻止创建索引视图。 CREATE TABLE Product ( ProductID int identity(1,1) not null, CreateUTC datetime2(7) not null, Name varchar(100) not null CONSTRAINT PK_Product Primary Key CLUSTERED (ProductID) ) CREATE TABLE Customer ( CustomerID int identity(1,1) not null, CreateUTC datetime2(7) not …

2
SQL Server EXECUTE AS故障
我在尝试使存储过程使用时丢失了某些东西EXECUTE AS。存储过程正在从中读取数据source_db,对其进行汇总并将结果存储在中target_db。 sp本身在中target_db。我有一个专用的登录名,并将其映射到sp的所有者source_db和target_dbsp的所有者中(因此,app_agent在source_db和target_db登录中都有一个用户app_agent)。 如果我以身份登录app_agent并执行 EXEC target_db.app_agent_schema.import_data 一切正常。但是如果我改变 ALTER PROCEDURE app_agent_schema.import_data WITH EXECUTE AS OWNER` (or `AS SELF`) 并尝试执行它,它会抛出 服务器主体“ app_agent”在当前安全上下文下无法访问数据库“ source_db”。 我正在使用SQL Server 2008。 有人可以指出我的错误吗? 谢谢 更新 经过一番研究,我发现可以ALTER DATABASE target_db SET TRUSTWORTHY ON解决问题,但对于我来说似乎并不是正确的解决方案...

1
在复制环境中删除bin日志
我有一个关于在复制环境中删除二进制日志的问题: 我们有一个具有1个主设备和2个从设备的环境(运行mysql 5.5)。有时,在繁重的处理时间中,我们遇到了空间问题,因此bin日志目录已满。日志每3天过期一次。我想知道,是否有理由将所有主机(包括主机和从机)上的日志保存3天?例如,将日志在主服务器上保留3天,在从属服务器上保留1天是否有意义?最好的方法是什么? 谢谢!


6
备份SQL Server中的所有数据库
我有一台Microsoft SQL Server 2005数据库服务器。在数据库服务器中,我大约有250个用户数据库。我必须备份所有这些数据库。由于手动进行备份会花费大量时间,因此我正在寻找可以自动对所有250个数据库进行备份的Batch脚本或DB脚本。有人可以帮忙吗?

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.