数据库管理员

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

5
完全备份和仅复制完全备份之间的区别
我在SQL Server中央线程中看到了完整备份会截断日志吗?完全备份不会截断日志: 否。完全备份或差异备份都不会截断事务日志。- 林恩佩蒂斯 否-一个完整的备份不会截断日志。- 乍得·克劳福德 那么完全备份和仅复制完全备份有什么区别? 对于日志备份,有仅复制备份,可以防止在不截断日志的情况下破坏日志链。那么什么是仅复制完整备份?

2
在调用数据库上下文中执行的中央存储过程
我正在使用该sys.dm_db_index_physical_stats视图开发定制的维护解决方案。我目前有从存储过程中引用它。现在,当该存储过程在我的一个数据库上运行时,它会执行我想要的操作,并拉出与任何数据库有关的所有记录的列表。当我将其放置在其他数据库上时,它会拉出仅与该数据库有关的所有记录的列表。 例如(底部代码): 针对数据库6的查询运行显示了[请求的]数据库1-10的信息。 针对数据库3运行的查询仅显示数据库3的[请求的]信息。 我要对数据库3专门执行此过程的原因是,我希望将所有维护对象保留在同一数据库中。我想把这项工作放在维护数据库中,就像在该应用程序数据库中一样工作。 码: ALTER PROCEDURE [dbo].[GetFragStats] @databaseName NVARCHAR(64) = NULL ,@tableName NVARCHAR(64) = NULL ,@indexID INT = NULL ,@partNumber INT = NULL ,@Mode NVARCHAR(64) = 'DETAILED' AS BEGIN SET NOCOUNT ON; DECLARE @databaseID INT, @tableID INT IF @databaseName IS NOT NULL AND @databaseName NOT IN ('tempdb','ReportServerTempDB') BEGIN …

2
限制SQL Server上的连接权限
我有一个使用“荣誉系统”安全性的应用程序要部署到生产中。也就是说,所有用户都使用SQL用户/密码凭据连接到数据库,并且该应用程序自行管理权限。对于连接对象包含嵌入式凭据并且可以自由复制的事实,后半部分并没有给我带来多少麻烦。我试图找到一种方法来将连接限制到一组更有限的客户端。我可以创建防火墙规则来限制IP。是否可以通过计算机帐户或域成员资格“预限定” SQL登录名的任何方法?

2
有效的mysql表/索引设计,可处理3500万行以上的表,并具有200+相应的列(双精度),可以查询其任意组合
我正在针对以下情况寻求有关表/索引设计的建议: 我有一个大表(股价历史数据,InnoDB,3500万行,并且还在不断增长),它具有复合主键(资产(整数),日期(日期))。除了定价信息外,我还有200个双精度值需要与每个记录相对应。 CREATE TABLE `mytable` ( `assetid` int(11) NOT NULL, `date` date NOT NULL, `close` double NOT NULL, `f1` double DEFAULT NULL, `f2` double DEFAULT NULL, `f3` double DEFAULT NULL, `f4` double DEFAULT NULL, ... skip a few … `f200` double DEFAULT NULL, PRIMARY KEY (`assetid`, `date`)) ENGINE=`InnoDB` DEFAULT CHARACTER …

1
查询计划“基数估计”中的警告
create table T(ID int identity primary key) insert into T default values insert into T default values go select cast(ID as varchar(10)) as ID from T where ID = 1 上面的查询在查询计划中有一个警告。 <Warnings> <PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT(varchar(10),[xx].[dbo].[T].[ID],0)" /> </Warnings> 为什么会有警告? 字段列表中的类型转换如何影响基数估计?

1
Oracle 11g侦听器失败,并出现ORA-12514和ORA-12505错误
我在开发计算机上本地运行Oracle 11g实例,并且可以直接通过SqlPlus连接到本地实例: c:\>sqlplus ace SQL*Plus: Release 11.2.0.2.0 Production on Mon Mar 11 11:50:20 2013 Copyright (c) 1982, 2010, Oracle. All rights reserved. Enter password: Connected to: Oracle Database 11g Express Edition Release 11.2.0.2.0 - Beta SQL> select count(*) from my_table ; COUNT(*) ---------- 5297 但是我无法通过侦听器连接到它: c:\>sqlplus -L "user/pw@(DESCRIPTION = (ADDRESS …

3
JOIN条件和WHERE条件之间有执行差异吗?
这两个示例查询之间是否存在性能差异? 查询1: select count(*) from table1 a join table2 b on b.key_col=a.key_col where b.tag = 'Y' 查询2; select count(*) from table1 a join table2 b on b.key_col=a.key_col and b.tag = 'Y' 注意唯一的区别是补充条件的位置。第一个使用WHERE子句,第二个将条件添加到ON子句。 当我在Teradata系统上运行这些查询时,说明计划是相同的,并且JOIN步骤显示了每种情况下的附加条件。但是,在有关MySQL的SO问题上,答案之一是建议使用第二种样式,因为WHERE处理是在进行联接之后进行的。 对这样的查询进行编码时,是否要遵循一般规则?我猜它必须是平台相关的,因为它显然对我的数据库没有影响,但这也许只是Teradata的功能。而且,如果它是依赖于平台的,我非常希望获得一些文档参考;我真的不知道该找什么。

3
POINT(X,Y)和GeomFromText(“ POINT(XY)”)之间有什么区别?
我想在我的MySQL数据库中存储一些几何位置。为此,我使用了POINT数据类型。我几乎到处都读到该函数GeomFromText应用于在表中插入数据。 但是,我发现这POINT(X,Y)也可行。我没有找到任何说明为什么GeomFromText应代替POINT。 例如,我有以下简单关系: CREATE TABLE Site ( SiteID BIGINT UNSIGNED, Position POINT ); 我可以使用以下两个变体插入值: INSERT INTO Site ( 1, GeomFromText( 'POINT(48.19976 16.45572)' ) ); INSERT INTO Site ( 2, POINT(48.19976, 16.45572) ); 当查看表格(SELECT * FROM Site)时,会看到该位置的相同二进制二进制对象,而查看坐标(SELECT *, AsText(Position) FROM Site)时,也会看到相同的值。 那么为什么要使用GeomFromText?这两个变体之间是否存在(已知的)性能差异?在MySQL以外的其他数据库系统中如何解决?


1
复制Oracle数据库用户
我们将聘请外部审核员对Oracle数据库进行审查。他们将运行一个工具来执行检查,为此,他们需要一个可以连接到数据库并从中获取信息的用户ID。 为此,我们在数据库中已有一个用户。但是,它是生产ID,因此我们无法将其锁定。我们想克隆/复制此ID,包括其角色和权利。 在Oracle中有没有办法做到这一点?
17 oracle 

2
来自不同进程的相同临时表上的锁的死锁
我发现一个死锁似乎显示出我认为不可能的事情。死锁涉及两个过程: 1. process8cf948 SPID 63 在临时表#PB_Cost_Excp_Process_Invoices_Work上执行ALTER TABLE。 拥有对象ID 455743580的表#PB_Cost_Excp_Process_Invoices_Work上的IX锁 2. process4cb3708 SPID 72 在UPDATE上对临时表#PB_Cost_Excp_Process_Invoices_Work进行执行,该表应该是它自己的表的唯一副本。 在#PB_Cost_Excp_Process_Invoices_Work上拥有具有相同对象ID 455743580的 Sch-M锁! 这应该是不可能的。我想念什么吗?#Temporary表是否真的在这两个SPID之间重用? 这是在具有累积更新1(版本10.50.4260)的SQL Server 2008 R2 Service Pack 2上。 完整的未更改死锁跟踪如下。请注意,两个进程如何在具有相同表名#PB_Cost_Excp_Process_Invoices_Work_SNIP_0000000D8519的相同对象ID上进行操作: 12/14/2012 13:46:03,spid23s,Unknown,waiter id=process8cf948 mode=X requestType=wait 12/14/2012 13:46:03,spid23s,Unknown,waiter-list 12/14/2012 13:46:03,spid23s,Unknown,owner id=process4cb3708 mode=Sch-M 12/14/2012 13:46:03,spid23s,Unknown,owner-list 12/14/2012 13:46:03,spid23s,Unknown,objectlock lockPartition=0 objid=455743580 subresource=FULL dbid=2 objectname=tempdb.dbo.#PB_Cost_Excp_Process_Invoices_Work_________________________________________________________________________________0000000D8519 id=lock371705d00 mode=Sch-M associatedObjectId=455743580 12/14/2012 …


5
将表导出到文本文件的最快方法是什么
我将拥有一个SQL Server 2012数据库和一个包含300万行和50列的表。无人值守的后台.net进程(可能发出一些SQL或Powershell命令)将其导出到文本文件(每一行数据一行)的最快方法是什么?.net进程应知道何时完成导出或是否有任何错误。数据类型将为all int或nvarchar。 我假设使用ado.net来执行select *命令并遍历数据读取器并为每条记录写入文件的纯C#代码将很慢,而且我无法并行处理。 理想情况下,导出将导出到远程共享网络文件夹,而不是SQL Server计算机上的本地文件夹。SQL Server将是一个HA群集。SSIS是否更适合于此,不需要数据转换? .Net进程将在计算机A上运行,在计算机B上运行SQL Server,最终文件目标是网络共享。一种选择是SQL Server将文件直接写入网络共享。另一个选项是SQL Server写入计算机A,然后在写入文件时,.net进程将其复制到网络共享。我没有正式的SLA,但是希望30分钟-1小时的文件写入时间。

3
限制对某些列的更新。只允许存储过程更新这些列
我有一些敏感的价格列,希望仅通过存储过程进行更新。如果不使用用于更新价格的存储过程,我希望所有代码或手动尝试更改这些价格列中的值都会失败。 我正在考虑使用触发器和令牌表来实现。我正在考虑的想法是有一个令牌表。存储过程将必须首先在令牌表中插入值。然后更新价格列。更新触发器将检查令牌表中是否存在已更新行的令牌。如果找到,它将继续。如果找不到令牌,它将引发异常并使更新事务失败。 有没有一种更好/更好的方法来实施此限制?

3
为其他数据库中的内部存储过程使用中央CLR存储过程/函数存储库来使用?
我想使用我在C#CLR中开发的代码在系统上的所有数据库中使用,这样我就不必将每个数据库设置为可信任并打开CLR并在每个数据库中保留一堆相同的代码。 从管理和安全的角度来看,有没有最佳方法?CLR功能是非常基本的功能,例如字符串分隔符,电子邮件验证,URL编码/解码,base64等。我希望每个数据库中只有dbo模式才能访问这些功能。 有没有简单的方法可以做到这一点? 另外我也不清楚CLR dll是否被嵌入,是否移动数据库,是否带有标签,或者是否也必须移动dll。 谢谢

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.