用户操作
[即时聊天] [发私信] [加为好友]
hanfeiID:applelure
11154次访问,排名10427(2),好友5人,关注者5人。
applelure的文章
原创 7 篇
翻译 0 篇
转载 38 篇
评论 2 篇
applelure的公告

Locations of visitors to this page
最近评论
zhh0086:谢谢了了了了
lxdff:
---------------------------------
Silverlight中文社区
www.silverlight.cn
---------------------------------
文章分类
收藏
    相册
    BLOG
    _________
    downthemall
    Google Blog
    Sohu Blog.
    中国博客网BLOG
    你听我说
    博客园的BLOG
    DotNet
    【孟宪会之精彩世界】
    WiKi
    ITwiki it百科
    维客WiKi
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 Sql Server实用操作小技巧集合 1收藏

    新一篇: Sql Server实用操作小技巧集合2 | 旧一篇: iphone 好火啊...(转)

    包括安装时提示有挂起的操作、收缩数据库、压缩数据库、转移数据库给新用户以已存在用户权限、检查备份集、修复数据库等
    (一)挂起操作
    在安装Sql或sp补丁的时候系统提示之前有挂起的安装操作,要求重启,这里往往重启无用,解决办法:
    到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager
    删除PendingFileRenameOperations
    (二)收缩数据库
    --重建索引
    DBCC REINDEX
    DBCC INDEXDEFRAG
    --收缩数据和日志
    DBCC SHRINKDB
    DBCC SHRINKFILE

    (三)压缩数据库
    dbcc shrinkdatabase(dbname)

    (四)转移数据库给新用户以已存在用户权限
    exec sp_change_users_login 'update_one','newname','oldname'
    go

    (五)检查备份集
    RESTORE VERIFYONLY from disk='E:\dvbbs.bak'

    (六)修复数据库
    ALTER DATABASE [dvbbs] SET SINGLE_USER
    GO
    DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK
    GO
    ALTER DATABASE [dvbbs] SET MULTI_USER
    GO


    --CHECKDB 有3个参数:
    --REPAIR_ALLOW_DATA_LOSS
    --   执行由 REPAIR_REBUILD 完成的所有修复,包括对行和页进行分配和取消分配以改正分配错误、结构行或页的错误,以及删除已损坏的文本对象。这些修复可能会导致一些数据丢失。修复操 作可以在用户事务下完成以允许用户回滚所做的更改。如果回滚修复,则数据库仍会含有错误,应该从备份进行恢复。如果由于所提供修复等级的缘故遗漏某个错误 的修复,则将遗漏任何取决于该修复的修复。修复完成后,备份数据库。
    --REPAIR_FAST 进行小的、不耗时的修复操作,如修复非聚集索引中的附加键。这些修复可以很快完成,并且不会有丢失数据的危险。
    --REPAIR_REBUILD 执行由 REPAIR_FAST 完成的所有修复,包括需要较长时间的修复(如重建索引)。执行这些修复时不会有丢失数据的危险。

    --DBCC CHECKDB('dvbbs') with NO_INFOMSGS,PHYSICAL_ONLY

    SQL SERVER日志清除的两种方法
    在使用过程中大家经常碰到数据库日志非常大的情况,在这里介绍了两种处理方法……

    方法一

    一般情况下,SQL数据库的收缩并不能很大程度上减小数据库大小,其主要作用是收缩日志大小,应当定期进行此操作以免数据库日志过大
    1、设置数据库模式为简单模式:打开SQL企业管理器,在控制台根目录中依次点开Microsoft SQL Server-->SQL Server组-->双击打开你的服务器-->双击打开数据库目录-->选择你的数据库名称(如论坛数据库Forum)-->然 后点击右键选择属性-->选择选项-->在故障还原的模式中选择“简单”,然后按确定保存
    2、在当前数据库上点右键,看所有任务中的收缩数据库,一般里面的默认设置不用调整,直接点确定
    3、收缩数据库完成后,建议将您的数据库属性重新设置为标准模式,操作方法同第一点,因为日志在一些异常情况下往往是恢复数据库的重要依据

    方法二

    SET NOCOUNT ON
    DECLARE @LogicalFileName sysname,
             @MaxMinutes INT,
             @NewSize INT


    USE      tablename              -- 要操作的数据库名
    SELECT   @LogicalFileName = 'tablename_log',   -- 日志文件名
    @MaxMinutes = 10,                -- Limit on time allowed to wrap log.
             @NewSize = 1                   -- 你想设定的日志文件的大小(M)

    -- Setup / initialize
    DECLARE @OriginalSize int
    SELECT @OriginalSize = size
       FROM sysfiles
       WHERE name = @LogicalFileName
    SELECT 'Original Size of ' + db_name() + ' LOG is ' +
             CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' +
             CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
       FROM sysfiles
       WHERE name = @LogicalFileName
    CREATE TABLE DummyTrans
       (DummyColumn char (8000) not null)


    DECLARE @Counter    INT,
             @StartTime DATETIME,
             @TruncLog   VARCHAR(255)
    SELECT   @StartTime = GETDATE(),
             @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'

    DBCC SHRINKFILE (@LogicalFileName, @NewSize)
    EXEC (@TruncLog)
    -- Wrap the log if necessary.
    WHILE      @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired
           AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)  
           AND (@OriginalSize * 8 /1024) > @NewSize  
       BEGIN -- Outer loop.
         SELECT @Counter = 0
         WHILE   ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
           BEGIN -- update
             INSERT DummyTrans VALUES ('Fill Log')  
             DELETE DummyTrans
             SELECT @Counter = @Counter + 1
           END   
         EXEC (@TruncLog)  
       END   
    SELECT 'Final Size of ' + db_name() + ' LOG is ' +
             CONVERT(VARCHAR(30),size) + ' 8K pages or ' +
             CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
       FROM sysfiles
       WHERE name = @LogicalFileName
    DROP TABLE DummyTrans
    SET NOCOUNT OFF

    删除数据库中重复数据的几个方法
    数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……

    方法一

    declare @max integer,@id integer
    declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
    open cur_rows
    fetch cur_rows into @id,@max
    while @@fetch_status=0
    begin
    select @max = @max -1
    set rowcount @max
    delete from 表名 where 主字段 = @id
    fetch cur_rows into @id,@max
    end
    close cur_rows
    set rowcount 0

    方法二

    有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
    1、对于第一种重复,比较容易解决,使用
         select distinct * from tableName
    就可以得到无重复记录的结果集。
    如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
         select distinct * into #Tmp from tableName
         drop table tableName
         select * into tableName from #Tmp
         drop table #Tmp
    发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。

    2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
         假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
         select identity(int,1,1) as autoID, * into #Tmp from tableName
         select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
         select * from #Tmp where autoID in(select autoID from #tmp2)
         最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)

    更改数据库中表的所属用户的两个方法
    大家可能会经常碰到一个数据库备份还原到另外一台机器结果导致所有的表都不能打开了,原因是建表的时候采用了当时的数据库用户……


    --更改某个表
    exec sp_changeobjectowner 'tablename','dbo'


    --存储更改全部表
    CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch
    @OldOwner as NVARCHAR(128),
    @NewOwner as NVARCHAR(128)
    AS

    DECLARE @Name    as NVARCHAR(128)
    DECLARE @Owner   as NVARCHAR(128)
    DECLARE @OwnerName   as NVARCHAR(128)

    DECLARE curObject CURSOR FOR
    select 'Name'    = name,
       'Owner'    = user_name(uid)
    from sysobjects
    where user_name(uid)=@OldOwner
    order by name

    OPEN   curObject
    FETCH NEXT FROM curObject INTO @Name, @Owner
    WHILE(@@FETCH_STATUS=0)
    BEGIN     
    if @Owner=@OldOwner
    begin
       set @OwnerName = @OldOwner + '.' + rtrim(@Name)
       exec sp_changeobjectowner @OwnerName, @NewOwner
    end
    -- select @name,@NewOwner,@OldOwner

    FETCH NEXT FROM curObject INTO @Name, @Owner
    END

    close curObject
    deallocate curObject


    GO


    SQL SERVER中直接循环写入数据
    没什么好说的了,大家自己看,有时候有点用处

    declare @i int
    set @i=1
    while @i<30
    begin
        insert into test (userid) values(@i)
        set @i=@i+1
    end

    无数据库日志文件恢复数据库方法两则
    数据库日志文件的误删或别的原因引起数据库日志的损坏


    方法一

    1.新建一个同名的数据库

    2.再停掉sql server(注意不要分离数据库)

    3.用原数据库的数据文件覆盖掉这个新建的数据库

    4.再重启sql server

    5.此时打开企业管理器时会出现置疑,先不管,执行下面的语句(注意修改其中的数据库名)

    6.完成后一般就可以访问数据库中的数据了,这时,数据库本身一般还要问题,解决办法是,利用
    数据库的脚本创建一个新的数据库,并将数据导进去就行了.

    USE MASTER
    GO

    SP_CONFIGURE 'ALLOW UPDATES',1 RECONFIGURE WITH OVERRIDE
    GO

    UPDATE SYSDATABASES SET STATUS =32768 WHERE NAME='置疑的数据库名'
    Go

    sp_dboption '置疑的数据库名', 'single user', 'true'
    Go

    DBCC CHECKDB('置疑的数据库名')
    Go

    update sysdatabases set status =28 where name='置疑的数据库名'
    Go

    sp_configure 'allow updates', 0 reconfigure with override
    Go

    sp_dboption '置疑的数据库名', 'single user', 'false'
    Go

    方法二

    事情的起因
    昨天,系统管理员告诉我,我们一个内部应用数据库所在的磁盘空间不足了。我注意到数据库事件日志文件XXX_Data.ldf文件已经增长到了3GB,于 是我决意缩小这个日志文件。经过收缩数据库等操作未果后,我犯了一个自进入行业以来的最大最愚蠢的错误:竟然误删除了这个日志文件!后来我看到所有论及数 据库恢复的文章上都说道:“无论如何都要保证数据库日志文件存在,它至关重要”,甚至微软甚至有一篇KB文章讲如何只靠日志文件恢复数据库的。我真是不知 道我那时候是怎么想的?!

    这下子坏了!这个数据库连不上了,企业管理器在它的旁边写着“(置疑)”。而且最要命的,这个数据库从来没有备份了。我唯一找得到的是迁移半年前的另外一个数据库服务器,应用倒是能用了,但是少了许多记录、表和存储过程。真希望这只是一场噩梦!

    没有效果的恢复步骤
    附加数据库
    _Rambo讲过被删除日志文件中不存在活动日志时,可以这么做来恢复:

    1,分离被置疑的数据库,可以使用sp_detach_db
    2,附加数据库,可以使用sp_attach_single_file_db

    但是,很遗憾,执行之后,SQL Server质疑数据文件和日志文件不符,所以无法附加数据库数据文件。

    DTS数据导出
    不行,无法读取XXX数据库,DTS Wizard报告说“初始化上下文发生错误”。

    紧急模式
    怡红公子讲过没有日志用于恢复时,可以这么做:

    1,把数据库设置为emergency mode

    2,重新建立一个log文件

    3,把SQL Server 重新启动一下

    4,把应用数据库设置成单用户模式

    5,做DBCC CHECKDB

    6,如果没有什么大问题就可以把数据库状态改回去了,记得别忘了把系统表的修改选项关掉

    我实践了一下,把应用数据库的数据文件移走,重新建立一个同名的数据库XXX,然后停掉SQL服务,把原来的数据文件再覆盖回来。之后,按照怡红公子的步骤走。

    但是,也很遗憾,除了第2步之外,其他步骤执行非常成功。可惜,重启SQL Server之后,这个应用数据库仍然是置疑!

    不过,让我欣慰的是,这么做之后,倒是能够Select数据了,让我大出一口气。只不过,组件使用数据库时,报告说:“发生错误:-2147467259,未能在数据库 'XXX' 中运行 BEGIN TRANSACTION,因为该数据库处于回避恢复模式。”

    最终成功恢复的全部步骤
    设置数据库为紧急模式
             停掉SQL Server服务;

            把应用数据库的数据文件XXX_Data.mdf移走;

           重新建立一个同名的数据库XXX;

            停掉SQL服务;

           把原来的数据文件再覆盖回来;

          运行以下语句,把该数据库设置为紧急模式;

         运行“Use Master

    Go

    sp_configure 'allow updates', 1

    reconfigure with override

    Go”

    执行结果:

    DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

    已将配置选项 'allow updates' 从 0 改为 1。请运行 RECONFIGURE 语句以安装。

    接着运行“update sysdatabases set status = 32768 where name = 'XXX'”

    执行结果:

    (所影响的行数为 1 行)

           重启SQL Server服务;

          运行以下语句,把应用数据库设置为Single User模式;

           运行“sp_dboption 'XXX', 'single user', 'true'”

    执行结果:

           命令已成功完成。

    ü          做DBCC CHECKDB;

           运行“DBCC CHECKDB('XXX')”

    执行结果:

    'XXX' 的 DBCC 结果。

    'sysobjects' 的 DBCC 结果。

    对象 'sysobjects' 有 273 行,这些行位于 5 页中。

    'sysindexes' 的 DBCC 结果。

    对象 'sysindexes' 有 202 行,这些行位于 7 页中。

    'syscolumns' 的 DBCC 结果。

    ………

    ü          运行以下语句把系统表的修改选项关掉;

           运行“sp_resetstatus "XXX"

    go

    sp_configure 'allow updates', 0

    reconfigure with override

    Go”

    执行结果:

    在 sysdatabases 中更新数据库 'XXX' 的条目之前,模式 = 0,状态 = 28(状态 suspect_bit = 0),

    没有更新 sysdatabases 中的任何行,因为已正确地重置了模式和状态。没有错误,未进行任何更改。

    DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

    已将配置选项 'allow updates' 从 1 改为 0。请运行 RECONFIGURE 语句以安装。

         重新建立另外一个数据库XXX.Lost;

    DTS导出向导
          运行DTS导出向导;

          复制源选择EmergencyMode的数据库XXX,导入到XXX.Lost;

             选择“在SQL Server数据库之间复制对象和数据”,试了多次,好像不行,只是复制过来了所有表结构,但是没有数据,也没有视图和存储过程,而且DTS向导最后报告复制失败;

            所以最后选择“从源数据库复制表和视图”,但是后来发现,这样总是只能复制一部分表记录;

           于是选择“用一条查询指定要传输的数据”,缺哪个表记录,就导哪个;

             视图和存储过程是执行SQL语句添加的。

    维护Sql Server中表的索引
    在使用和创建数据库索引中经常会碰到一些问题,在这里可以采用一些另类的方法解决…

    --第一步:查看是否需要维护,查看扫描密度/Scan Density是否为100%
    declare @table_id int
    set @table_id=object_id('表名')
    dbcc showcontig(@table_id)

    --第二步:重构表索引
    dbcc dbreindex('表名',pk_索引名,100)

    --重做第一步,如发现扫描密度/Scan Density还是小于100%则重构表的所有索引
    --杨铮:并不一定能达100%。
    dbcc dbreindex('表名','',100)


    SQL Server补丁安装常见问题
    谁碰到问题就看看咯:)

     

    发表于 @ 2007年07月03日 12:15:00|评论(loading...)|编辑

    新一篇: Sql Server实用操作小技巧集合2 | 旧一篇: iphone 好火啊...(转)

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © applelure